首页 > 代码库 > SQL语句(二十一)—— 触发器(DML触发器)
SQL语句(二十一)—— 触发器(DML触发器)
一 、触发器概述(特殊的存储过程)
定义:
在修改指定表值的数据时执行的 存储过程. 不同的是 : 执行存储过程要使用EXEC语句来调用,而触发器的执行不需要使用EXEC语句来调用.
作用:
实现由主键和外键所不能保证的复制的参照完整性和数据的一致性
他能够对数据库中的相关表进行级联修改
提供比 CHECK约束 更复杂的数据完整性,并自定义错误信息。
分类:
数据操作语言触发器 DML
数据库操作语言 : update,Delete
数据定义语言触发器 DDL
记录数据库更改事件
二、创建DML触发器
INSERT 触发器
DELETE 触发器
UPDATE 触发器
替代触发器
允许使用嵌套触发器
递归触发器
5.25: 在Employee表上创建一个名为Employee_deleted的触发器,其功能: 当对表进行删除时,首先检查员工是否为 ‘人事部‘员工,如果不是可以删除,否则撤销删除并显示‘无法删除‘
Create trigger employee_deleteon DepartmentAfter DeleteAS Begin Declary @x char(10) Select @x = DepartmentName --变量来自数据库,用from From Department if (@x = ‘人事部‘) --没有就用变量 Begin print ‘无法删除‘ RollBack --撤销都是RollBack EndEnd--执行Delete From Department Where Sname = ‘人事部‘
Create trigger employee_deleteon EmployeeAfter DeleteASBegin Declare @Dp varchar(50) Select @Dp = DepartmentName From Department D1, Deleted D2 Where D1.DepartmentID = D2.DepartmentID If(@Dp = ‘人事部‘) Begin print ‘无法删除‘ RollBack EndEnd
Create trigger employee_updateon Stu_infoAfter UpdateASBegin Declare @StuCount Int Select @StuCount = Count(*) From stu_info Update Stu_sum Set number = @StuCount Select S_id As 更新前学生编号, S_name As 更新前学生姓名 From Deleted Select S_id As 更新后学生编号, S_name As 更新后学生姓名 From InsertedEnd--执行Update Stu_infoSet S_name = ‘张三‘Where S_id = 1
Create trigger employee_deleteon EmployeeInstead of DeleteASBegin Declare @Dp varchar(50) Select @Dp = DepartmentName From Department If(@Dp = ‘人事部‘) Begin print ‘无法删除‘ EndEnd
Create Trigger Insert_ForbiddenOn Stu_SumAfter InsertASBegin Raiserror(‘不允许直接向该表插入记录, 操作被禁止‘, 1, 1) RollBack TransactionEnd
服务器 - > 属性 -> 杂项 -> 允许触发器激发其他触发器 -> true
递归触发器
数据库 -> 属性 -> 选项 -> 杂项 -> 递归触发器已启用 -> true
SQL语句(二十一)—— 触发器(DML触发器)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。