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