3.9.2 创建DML触发器

3.9.2 创建DML触发器

可以使用CREATE TRIGGER创建DML触发器,其基本格式如下:

说明:

trigger_name:触发器的名称,必须遵循标识符规则。

table|view:对其运行DML触发器的表或视图,此表或视图有时称为“触发器表”或“触发器视图”。视图上不能定义FOR或AFTER触发器,只能定义INSTEAD OF触发器。

WITH ENCRYPTION:指示系统将CREATE TRIGGER语句的原始文本转换为加密格式,使用WITH ENCRYPTION可以防止将触发器作为SQL Server复制的一部分进行发布。

FOR|AFTER:指定仅当触发器SQL语句中指定的所有操作都已成功启动时,触发器才触发。如果仅指定FOR关键字,则AFTER是默认设置。

INSTEAD OF:指定执行触发器,而不是执行触发SQL语句,从而替代触发语句的操作。

[INSERT][,][UPDATE][,][DELETE]:用于指定在表或视图上执行哪些数据修改语句时,将激活触发器的关键字。必须至少指定一个选项,如果指定的选项多于一个,需要用逗号分隔。

sql_statement:触发条件和操作。触发器可以包含若干Transact-SQL语句,通常包含流程控制语句,旨在根据数据修改或定义语句来检查或更改数据,一般不向用户返回数据。

【例3.112】 定义AFTER触发器T1,实现:当修改学生选课表SC中的成绩时,如果成绩增加了10%及以上,则将此次修改操作记录到另一个表SC_Update(Sno,Cno,OldGrade,NewGrade)中。

首先,创建SC_Update表:

然后创建触发器T1:

【例3.113】 定义INSTEAD OF触发器T2,实现:当用户向学生选课SC表中插入的记录的成绩超过100分或低于0分时,拒绝插入,并给出“错误!成绩必须在0~100取值!!”的提示信息。

【例3.114】 定义AFTER触发器T3,实现:当用户向学生选课SC表中插入的记录的成绩超过100分或低于0分时,拒绝插入,并给出“错误!成绩必须在0~100取值!!”的提示信息。

【例3.115】 利用触发器实现级联删除:定义AFTER触发器T4,当删除学生表Student中某个学生记录时,为保证参照完整性,触发器代码用于删除该生在学生选课表SC中的选课记录。