一、触发器介绍
触发器:是一种实施复杂的、完整性约束的特殊存储过程,它在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、触发器也可以评估数据修改前后的表状态,并根据其差异采取对策
触发器的主要作用:实现由主键和外键所不能保证的复杂的参照完整性和数据的一致性。
缺点:
如果对触发器过分的依赖,势必影响数据库的结构,同时增加了维护的复杂程度。