触发器
触发器
触发器是一种特殊的存储过程,也具备事务的功能,它能在多表之间执行特殊的业务规则。
触发器是特定事件出现的时候,自动执行的代码块
类似于存储过程,触发器与存储过程的区别在于:存储过程是由用户或应用程序显式调用的,而触发器是不能被直接调用的
触发器是在对表进行插入、更新或删除操作时自动执行的存储过程,触发器通常用于强制业务规则
触发器还是一个特殊的事务单元,当出现错误时,可以执行
ROLLBACK TRANSACTION
回滚撤销操作触发器一般都需要使用临时表:
deleted
表和inserted
表,它们存放了被删除或插入的记录行副本触发器类型:DML触发器、DDL触发器
定义:触发器是在对指定表插入(insert)、更新(update)或删除(delete)操作时所自动执行的存储过程。
作用:实现由主键和外键所不能保证的复杂的参照完整性和数据的一致性。
触发器是一种高级约束,可以定义比check
约束更为复杂的约束。
可执行复杂的SQL语句
可引用其他表中的列
所有数据值均正确的状态
触发器与存储过程的区别
相似:也是SQL语句集
不同:触发器不能用execute语句调用,而是在用户指定Transact-SQL语句自动执行。
运行方式区别:
触发器的分类:
DDL触发器
定义:当服务器或者数据库中发生数据定义语言(DDL)时触发器将被调用
DDL数据定义语言:创建、修改或删除数据库中各种对象,包括表、视图、索引等。
DML触发器
定义:当数据库服务器中发生数据操作语言(DML)事件时要执行的操作。
DML数据操作语言:对已存在数据库表进行元组插入、删除、修改。
DDL触发器
以下操作可以使用DDL触发器
要防止对数据库架构进行某些修改
希望数据库中发生某种情况以响应数据库架构中的修改
要记录数据结构中的更改或者事件
案例:定义一个数据库的DDL触发器,防止在EAS_DB
数据库中表被删除修改。
DML触发器
DML触发器的用途:
DML触发器可通过数据库中相关表实现级联修改,通过级联引用完整性约束可以更有效的更改
DML触发器可以防止恶意或者错误insert、update以及delete操作,并强制执行比check约束定义的限制更为复杂的其他限制
DML触发器可以评估数据修改前后表的状态,并根据该差异采取措施
一个表的多个同类DML触发器,允许采用多个不同的操作来响应同一个修改语句。
触发器语法
触发时间:指明触发器何时执行,该值可取
before
:表示在数据库动作之前触发器执行after
:表示在数据库动作之后触发器执行
触发事件:指明哪些数据库动作会触发此触发器
insert
:数据库插入会触发此触发器update
:数据库修改会触发此触发器delete
:数据库删除会触发此触发器
表名:数据库触发器所在的表
for each row
:对表的每一行触发器执行一次,如果没有这一选项,则只对整个表执行一次。
insert触发器
insert
触发器对目标表执行insert
语句时,就会调用触发器。
delete触发器
delete
触发器对目标表执行delete
语句时,就会调用触发器。
update触发器
OLD和NEW的使用
触发器在DDL操作之前或者之后触发,总会对目标表做出一定的改动,有时我们需要知道目标表改变前后的值,这就用到了OLD和NEW。
OLD就是改变之前的值,是UPDATE
之前或者是要被DELETE
或者已经被DELETE
的值。而NEW,则是UPDATE
之后的新值,即将INSERT
或者已经INSERT
的值。
嵌套触发器
如果一个触发器在执行操作时引发了另一个触发器,而这个触发器又接着引发下一个触发器,那么就形成了触发器的嵌套。任何触发器都可以包含影响另一个表的UPDATE
、INSERT
或者DELETE
语句。
嵌套触发器在安装时就被启用
可以使用系统存储过程
sp_configure
禁用和重新启用嵌套触发器最多可以嵌套32层
禁用嵌套:
启用嵌套:
触发器的执行原理
触发器触发时,创建了DELETED
表和INSERTED
表,只读,不允许修改;触发器执行完成后,自动删除。
delete
表delete
表存放由执行delete
或者update
语句而要从表中删除的所有行,在执行delete
或update
被删除的行从触发触发器的表中移动到delete
表中。insert
表存放由执行insert
或者update
语句而要向表中插入的所有行,在执行insert
或update
新的行同时添加到触发器的表和insert
表中,insert
表中的内容是触发触发器的表新行的副本。
管理触发器
查看触发器
可以使用像sp_helptext
、sp_help
和sp_depends
等系统存储过程来查看触发器等有关信息
修改触发器
修改触发器的语法和创建触发器的语法一样,只需要把create
改为alter
即可:
删除触发器
禁用DML触发器
禁用DDL触发器
禁用所有触发器
启用触发器
只要将DISABLE
变为ENABLE
即可
Last updated