触发器
触发器(trigger)是用户定义在关系表上的一类由事件驱动的特殊过程。
触发器又叫做事件-条件-动作(event-condition-action)规则。
触发器功能很多,因为触发器规则中的动作体可以很复杂。通常是一段SQL存储过程。
触发器不仅可以用于数据库完整性检查,也可以用来实现数据库系统的其他功能,包括数据库安全性以及更加广泛的应用系统的一些业务流程和控制流程,基于规则的数据和业务控制功能等。
不过也要特别注意一个触发器的动作可能激活另一个触发器,最坏的情况是导致一个触发链,从而造成难以遇见的错误。
一、实现域完整性
①打开“SQL Server Management Studio”窗口。
②单击“标准”工具栏上的“新建查询”按钮,打开“查询编辑器”窗口。
③在“SQL编辑器”工具栏上选择可用数据库,如“XSCJ”。
④在窗口内直接输入以下CREATE TRIGGER语句,创建触发器。
为KC表创建一个INSERT触发器,当插入的新行中开课学期的值不是1-6时,就激活该触发器,撤销该插入操作,并使用RAISERROR语句返回一个错误信息。
CREATE TRIGGER tri_INSERT_KC ON KC
AFTER INSERT
AS
DECLARE @开课学期 tinyint
SELECT @开课学期=KC.开课学期
FROM KC,Inserted
WHERE KC.课程号= Inserted.课程号 --如果新插入行的开课学期的值不是1~6,则撤销插入,并给出错误信息
IF @开课学期 NOT BETWEEN 1 AND 6
BEGIN
ROLLBACK TRANSACTION
RAISERROR('开课学期的取值只能是1~6!',16,10)
END
⑤单击“SQL编辑器”工具栏上的“分析”按钮,检查输入的T-SQL语句是否有语法错误。如果有语法错误,则进行修改,直到没有语法错误为止。
⑥确保无语法错误后,单击“SQL编辑器”工具栏上的“执行”按钮,完成触发器的创建。
⑦在左边的“对象资源管理器”中用鼠标右键单击目标“表”节点,如“KC”,弹出快捷菜单,选择“编辑前200行”命令,打开表的数据记录窗口。
⑧在表中分别插入两行记录以激活该触发器,第一行的开课学期的值在1-6以内,第二行的开课学期的值在1-6以外。
当插入第一行时,系统成功地接受了数据,无信息返回。而在插入第二行时,系统撤销该插入操作,拒绝接受非法数据,并返回错误信息,从而保证了域完整性。
二、实现参照完整性
①在“查询编辑器”窗口内直接输入以下CREATE TRIGGER语句,创建触发器。
为KC表再创建一个UPDATE触发器,当更新了某门课程的课程号信息时,就激活该触发器级联更新XS_KC表中相关的课程号信息,并使用PRINT语句返回一个提示信息。
CREATE TRIGGER tri_UPDATE_KC ON KC
AFTER UPDATE
AS
IF UPDATE(课程号) --检测课程号列是否被更新
BEGIN
DECLARE @原课程号 char(3),@新课程号 char(3) --声明变量,获取更新前后的课程号的值
SELECT @原课程号=Deleted.课程号,@新课程号=Inserted.课程号
FROM Deleted,Inserted
WHERE Deleted.课程名=Inserted.课程名
PRINT '准备级联更新XS_KC表中的课程号信息…' --级联更新XS_KC表中相关成绩记录的课程号信息
UPDATE XS_KC
SET 课程号=@新课程号
WHERE 课程号=@原课程号
PRINT '已经级联更新XS_KC表中原课程号' + @原课程号 + '为' + @新课程号
END
②单击“SQL编辑器”工具栏上的“分析”按钮,检查输入的T-SQL语句是否有语法错误。如果有语法错误,则进行修改,知道没有语法错误为止。
③确保无语法错误后,单击“SQL编辑器”工具栏上的“执行”按钮,完成触发器的创建。
④在“查询编辑器”窗口内如入并执行以下UPDATE语句,修改KC表的课程号列,以激活触发器,级联修改XS_KC表中的课程号列,并返回提示信息,从而实现了参照完整性。
UPDATE KC
SET 课程号='105'
WHERE 课程名='政治'
三、比较约束与触发器的执行顺序
①在“查询编辑器”窗口内输入并执行以下ALTER TABLE语句,为KC表添加一个约束,使得开课学期的值只能为1~6。
ALTER TABLE KC
ADD CONSTRAINT CK_开课学期 CHECK(开课学期>=1 AND 开课学期<=6)
②在“查询编辑器”窗口内输入并执行以下INSERT语句。
INSERT KC(课程号,课程名,授课教师,开课学期,学时,学分)
VALUES('120','软件开发案例','李学涛',7,68,4)
从这部分实验中可以看到,约束优先于FOR或AFTER触发器起作用,它在更新前就生效,对要更新的值进行规则检查。当检查到与现有规则冲突时,系统给出错误消息,并取消更新操作。如果检查没有问题,更新被执行,再激活触发器。
Reference
什么是数据库触发器?/文CSDN@寒冰屋
数据库实验——数据库的完整性约束/文CSDN@小王很nice