触发器是一种特殊类型的存储过程,它是在执行某些特定的T-SQL语句时自动执行的一种存储过程。

触发器分类

DML触发器

当数据库服务器中发生数据操作语言(DML)事件时将调用DML触发器,DML事件包括INSERT,UPDATE,DELETE语句。DML触发器有助于在表或视图中修改数据时强制业务规则,扩展数据的完整性。

DML触发器的作用如下

  • 可以通过数据库中相关表实现级联修改
  • 防止恶意修改数据,并强制执行比CHECK约束更复杂的限制
  • 可以评估数据修改前后表的状态,根据该差异采取措施。一个表的多个同级AML触发器(INSERT,UPDATE,DELETE)可以采取多个不同的操作来响应同一个修改语句。

    DML触发器的分类

    AFTER触发器

    这类触发器是,在记录已经改变之后,才会被激活执行。它主要用于记录变更后的处理或检查。一旦发现错误,也可以用ROLLBACK TRANSACTION语句来回滚本次操作。

    INSTEAD OF触发器

    一般用来取代原本的操作,在记录变更之前发生,它并不执行原来的SQL语句操作增删改,而执行触发器本身定义的操作。

    DDL触发器

    在相应数据定义语言(DDL)时触发,一般在数据库中执行管理任务。
    与DML触发器一样,DDL触发器也是通过事件来激活,并执行其中的SQL语句。
    不同点是
    DML响应INSERT,UPDATE,DELETE而激活
    DDL响应CREATE,ALTER,DROP而激活

    使用DDL触发器的情况

  • 数据库里的库架构或数据表架构很重要,不允许修改

  • 防止数据库或者数据表被误删除
  • 在修改某个数据表结构的同时,修改另一个数据表相应的结构
  • 要记录对数据库结构操作的事件
  • 仅在运行触发DDL触发器的DDL语句后,DDL触发器才会被激活。DDL触发器无法作为INSTEAD OF触发器使用

    登陆触发器

    登陆触发器将相应LOG ON 事件。
    SQL Server实例建立用户会话时将引发此事件。
    登陆触发器将在登陆的身份验证阶段完成之后且用户会话实际建立之前激发。可以使用登陆触发器来审核和控制服务器会话。

    DML触发器与约束

    如果触发器表上存在约束,则在INSTEAD OF触发器执行后但在AFTER触发器执行前检查这些约束。如果违反了约束,则回滚INSTEAD OF触发器并且不执行AFTER触发器

    INSERTED表和DELETED表

    在使用DML触发器的过程中,SQL Server提供了两张特殊的临时表,分别是INSERTED表和DELETED表,他们与创建触发器的表具有相同的结构。用户可以使用这两张表来检测某些修改操作所产生的影响。无论是后触发还是代替触发。触发器被激活时,系统自动为它们创建这两张临时表,触发器一旦执行完成,这两张表将被自动删除。所以只能在触发器运行期间使用SELECT语句查询到这两张表,不能修改。
  1. INSERT操作:系统在原表插入记录的同时,自动把记录插入INSERTED临时表中
  2. DELETE操作:系统在原表删除记录的同时,自动把删除的记录添加到DELETED临时表中
  3. UPDATE操作:这一事务由两部分组成,首先将旧的数据行从基本表中转移到DELETED表中,然后将新的数据行同时插入基本表和INSERTED临时表。

    创建DML触发器

    1. CREATE TRIGGER <触发器名>
    2. ON {<表名>|<视图名>}
    3. [WITH ENCRYPTION]
    4. {FOR|AFTER|INSTEAD OF}
    5. {[INSERT][,][UPDATE][,][DELETE]}
    6. AS
    7. <T-SQL语句>[,...n]

    视图只能被INSTEAD OF触发器引用。不能对局部或者全局临时表定义DML触发器 WITH ENCRYPTION对创建触发器的语句的定义文本进行加密处理。 FOR|AFTER:这两个都是创建AFTER触发器,不能对视图定义AFTER触发器 INSTEAD OF:创建INSTEAD OF触发器 [INSERT][,][UPDATE][,][DELETE]:指定数据修改语句,随意组合 需要注意 TRUNCATE TABLE虽然功能上与DELETE类似,但由于TRUNCATE删除数据时不被计入事务日志,所以该语句不能激活DELETE触发器。 WRITETEXT命令不会触发INSERT或者UPDATE触发器。

查看触发器

和查看存储过程一样的使用系统的存储过程sp_helpsp_helptextsp_depends

修改触发器

  1. ALTER TRIGGER <触发器名>
  2. ON {<表名>|<视图名>}
  3. [WITH ENCRYPTION]
  4. {FOR|AFTER|INSTEAD OF}
  5. {[INSERT][,][UPDATE][,][DELETE]}
  6. AS
  7. <T-SQL语句>[,...n]

禁用或者启用触发器

禁用触发器

  1. DISABLE TRIGGER {ALL|<触发器名>[,...n]} ON [<表名>|<视图名>]

ALL:表示禁用ON后面的吧表或者视图的所有触发器

启动触发器

  1. ENABLE TRIGGER {ALL|<触发器名>[,...n]} ON [<表名>|<视图名>]

删除触发器

  1. DROP TRIGGER <触发器名>[,...n]