触发器:是对表进行插入、更新、或者删除的时候会自动执行的特殊存储过程;通常用于强制业务规则。
触发器是一种高级约束,可以定义比用check约束更为复杂的约束
- 可执行复杂的SQL语句(if/while/case)
- 可引用其他表中的列
触发器定义在特定的表或视图上,与表或视图相关且自动触发,不能直接调用,拥有事务的作用(可回滚)。
DML触发器分为after触发器(后置触发器,只能定义在表上)与instead of触发器(替代触发器,可以定义在表或视图上)
---创建触发器语法-----
CREATE TRIGGER trigger_name(触发器名称)
ON table_name(表名) --要监测的表
[WITH ENCRYPTION] --表示加密触发器定义的SQL文本
[for|instead of] --触发器类型(视图只能用instead of)
[DELETE, INSERT, UPDATE] --要监测的操作
AS
T-SQL语句
GO
触发器触发时:
- 系统自动在内存中创建deleted表和inserted表
- 只能进行读操作,不允许修改
- 触发器执行完成后,自动删除
after触发器有三类:
- insert触发器:当向表中插入数据时,自动执行触发器所定义的SQL语句。
- 临时保存了插入或更新后的记录行
- 可以从inserted表中检查插入的数据是否满足业务需求,如果不满足。 则可向用户报告错误信息,并回滚插入操作
- update触发器:当更新表中某列或多列时发生,自动执行触发器所定义的SQL语句。
- (对两表进行操作)
update触发器的工作原理:
- 先从表中删除要更新的行
- 把删除的行插入deleted表中
- 再向原表中插入新行
- 把新行插入inserted表
- 检查deleted和inserted表中的数据,确定是否需要回滚 或执行其他操作
- delete触发器:当删除表中记录时触发,自动执行触发器所定义的SQL语句。
- 临时保存了删除或更新前的记录行
- 可以从deleted表中检查删除的数据是否满足业务需求,如果不满足。 则可向用户报告错误信息,并回滚删除操作
有时因为表之间的主外键关系,无法进行想要的删除,这个时候就需要使用替代触发器。