触发器是依存于表的数据库对象,在表执行修改操作(插入/更新/删除)时自动执行,即是通过事件进行触发而被执行的.
触发器功能:
(1)级联修改数据库中相关的表。
(2)执行比检查约束更为复杂的约束操作。
(3)拒绝或回滚违反引用完整性的操作。
(4)比较表修改前后数据之间的差别,并根据差别采取相应的操作。
触发器类型:
AFTER触发器:
这种触发器将在数据变动(insert,update,delete操作)完成以后才触发。对变动的数据进行检查,如果发现错误,则拒绝或回滚变动的数据。
INSTEAD OF触发器:
这种触发器将在数据变动以前被触发。并取代变动数据 的操作(insert,update,delete操作),转而去执行触发器定义的操作。
在建立触发器时,还必须指定触发操作: insert、update、delete操作,至少指定一种,也可指定多种。
触发器结构
事 件 条件 动作
UPDATE INSERT DELETE AFTER INSTEAD OFF 各种Transact-SQL语句 ↓ ↓
触发事件发生 触发事件发生
↓ ↓
执行触发事件 不执行触发事件
↓ ↓
执行触发器动作 执行触发器动作
↓ ↓
After 条件触发器执行示意图 Instead of 条件触发器执行示意图
一、 创建触发器
在同一个数据表中可以创建多个after触发器,在表或视图上,每个insert、update、delete语句最多可以定义一个instead of触发器。
创建触发器应该考虑以下几个问题:
>CREATE TRIGGER 语句必须是批处理中的第一个语句。
>创建触发器的权限默认分配给表的所有者,且不能将该权限转给其他用户。
>触发器为数据库对象,其名称必须遵循标识符的命名规则。
>虽然触发器可以引用当前数据库以外的对象,但只能在当前数据库中创建触发器。
>虽然不能在临时表或系统表上创建触发器,但是触发器可以引用临时表。
>在为某数据表创建外键约束时,选中‘级联删除相关字段’,不能定义 INSTEAD OF DELETE 触发器;选中‘级联更新相关字段’,不能定义 INSTEAD OF UPDATE 触发器。
当创建一个触发器时必须指定:
⑴名称;
⑵在其上定义触发器的表;
⑶触发器将何时激发;
⑷激活触发器的数据修改语句。
1.使用企业管理器创建触发器:
2.使用CREATE TRIGGER命令创建触发器
3.使用CREATE TRIGGER命令创建触发器
语法参见教材或系统帮助
例:

1. 查看触发器
(1)用企业管理器查看触发器信息
如下图7-1所示:

图7-1
(2)使用系统存储过程查看触发器
sp_help:用于查看触发器的一般信息,如触发器的名称、属性、类型和创建时间。
sp_helptext:用于查看触发器的正文信息
如下图7-2所示:

图7-2
sp_depends:用于查看指定触发器所引用的表或者指定的表涉及到的所有触发器。
2. 修改触发器
(1)使用企业管理器修改触发器正文(操作演示)
(2)使用sp_rename命令修改触发器的名称
sp_rename命令的语法形式如下: sp_rename oldname,newname
(3)使用alter trigger命令修改触发器正文
3. 删除触发器
(1)使用系统命令DROP TRIGGER删除指定的触发器,其语法形式如下:
DROP TRIGGER { trigger } [ ,...n ]
(2)删除触发器所在的表时,SQL Server将会自动删除与该表相关的触发器。
(3)在企业管理器中删除触发器 ![]()
触发器补充知识:
有两个触发器生成的临时表inserted 和deleted.
在触发器执行时,将生成这两个临时表.
两个临时表可以在SQL语句中引用,用于触发器条件的测试,但表中的内容不能修改.
执行INSERT语句时,插入到表中的新记录也同时被插入到inserted表中;
执行UPDATE语句时,系统首先删除原有记录,并将原有的记录行插入到表deleted,而新插入的记录也同时被插入到inserted表中;
执行DELETE语句时,删除的记录也将被插入到deleted表中;
1. 创建AFTER INSERT触发器
例子7-1:在员工表中创建一个触发器,将新员工工资限制在不超过5000以内,若插入的员工工资超过5000,则拒绝插入该记录。
2. 创建AFTER UPDATE触发器
例子7-2:在员工表中创建触发器,限制每次工资额的变动不能超过2000.
3. 创建AFTER DELETE触发器
考虑: 为了防止那些确实需要删除但会引起数据一致性问题的记录的删除。
例7-3:在'客户表'中创建一个触发器,监控删除的客户记录, 若删除的记录在'项目表'中有合作项目,且项目尚未完工,则不可删除,否则可以删除.
4. 创建INSTEAD OF触发器
INSTEAD OF触发器可用来取代激活触发器的insert,update,delete操作,转而由触发器中的程序控制数据的修改.
当INSTEAD OF触发器被激活时,inserted,deleted临时表都已存入数据.这与 AFTER触发器相同;差别在于AFTER触发器激活前,表中数据已修改,而INSTEAD OF触发器被激活时还未实际修改表中数据.
例7-4:假定有数据表employee,包含字段‘姓’、‘名’、‘工资’。基于该表创建了一个视图emp_view,包含字段‘姓名’、‘工资’两个字段,其中字段‘姓名’ 由基表的字段‘姓’和‘名’组合而来 ;(创建一个触发器,可实现通过视图插入一条记录)
5. 嵌套的触发器
如果一个触发器在执行操作时引发了另一个触发器,而这个触发器又接着引发下一个触发器……这些触发器就是嵌套触发器。
浙公网安备 33010602011771号