7触发器

一、触发器介绍

  触发器:是一种实施复杂的、完整性约束的特殊存储过程,它在SQL Server进行某张特定的表修改时由SQL Server自动执行,一般用于加强数据库的某些使用规则。

触发器有两张存放在内存中由系统维护的逻辑临时特殊表:查处表(inserted)和删除表(deleted),SQL Server为每个触发器都创建。

    inserted表:存放insert或update语句执行所影响的副本。即用于插入或更新表的新行值,在插入或更新表的同时,也将期副本存入insert表中。

    deleted表:存放delete或update语句执行所影响的副本。当执行一条delete语句是,从表中删除的每一行都包含在删除触发器内的delete表中。

   !注:inserted和updated表只能由创建它们的触发器使用。两张表的范围仅限于该触发器

插入/删除表的功能

激活触发器的动作

Inserted

Deleted

Insert

存放要插入的记录

 

Update

存放要更新的记录

存放更新前的旧记录

Delete

 

存放要删除的旧记录

  after触发器:在触发事件后才触发执行的触发器,即先执行insert、update、delete等语句后才执行的触发器。此类触发器只适用于数据表,不适用于视图。在不指定的情况下,这是默认的触发器。

  instead of触发器:在触发事件之前执行的触发器,即先执行instead of触发器,再执行insert、update、delete语句,适用于数据表,也适用于视图。

二、创建触发器前需要注意的事项:

  1.create trigger语句必须是批处理中的第一条语句,且只能用于一张表或视图。

  2.创建触发器的权限默认分配给表的所有者,且不能将权限转让给其他用户。  

  3.触发器只能在当前的数据库中创建,触发器可以引用当前数据库的外部对象。

  4.不能在临时表或系统表上创建触发器,但触发器可以引用临时表。

   创建触发器需要指定的内容

  1.名称

  2.定义触发器表

  3.触发器在什么时候被触发

  4.激活触发器的数据修改语句,有效选项为insert、update或delete。多条数据修改语句可激活同一个触发器。例如:触发器可以由insert或update语句激活。

三、创建触发器

  语法格式:

create trigger trigger_name
      on {table_name | view_name}
 [with encryption]
    for{after | instead of} {[delete] [,] [insert] [,] [update]}
  as
sql_statement(sql语句)

 其中各个参数的含义如下:

  trigger_name:触发起的名称,在数据库中必须唯一。

  table_name | view_name:在其执行上的触发器的表或视图的名称。

  with encryption:加密syscomments表中包含create trigger语句文本的条目。可防止触发器作为SQL Server复制的一部分发布。

  {[delete] [,] [insert] [,] [update]}:指定在表或视图上执行哪些数据修改语句时降级或触发器的关键字。必须至少指定一个选项。在触发器定义中允许使用以人意顺序组合的这些关键字。如果指定多个,需用逗号隔开。

  as:是触发器要执行的操作。

  sql_statement:指定触发器执行的sql语句,是触发器的条件和操作。

!!注触发器不能建在临时表上,一个触发器只能作用在一张表上。从事务的角度来看,触发器与触发它的语句(如insert语句)作为同一个事务的一部分来执行。

    insert触发器:当向表中插入数据时触发,自动执行触发器中定义的sql语句,只在inserted表中保存所插入的行,而deleted表中无数据。

    delete触发器:当删除表中记录时触发,自动执行触发器中定义的sql语句,只在deleted表中保存被删除的旧行,而inserted表中无数据。

    update触发器:当更新表中某列或多列时触发,自动执行触发器中定义的sql语句。可以将它理解为delete操作和insert操作的结果,所以在inserted表中存放更新后的新行值,而deleted表中存放更新前的旧行值。

四、instead of触发器的使用

  instead of触发器的使用范围,instead of触发器可以同时在数据表和视图中使用,在以下几种情况下,建议使用inserted of触发器:

    1.数据库里的数据禁止修改

    2.有可能要修改回滚的sql语句

    3.在视图中使用触发器

    4.用自己的方式去修改数据

五、触发器的优缺点

  优点:

    1.触发器可以强制比用check约束定义的约束更为复杂的约束。与check约束不同,触发器可以引用其它表中的列。

    2、触发器也可以评估数据修改前后的表状态,并根据其差异采取对策

      触发器的主要作用:实现由主键和外键所不能保证的复杂的参照完整性和数据的一致性。

  缺点:

    如果对触发器过分的依赖,势必影响数据库的结构,同时增加了维护的复杂程度。

原文地址:https://www.cnblogs.com/chef5-3/p/3415979.html