1.定义:触发器(trigger)是与表事件相关的特殊的存储过程,它的执行是由事件来触发。触发器经常用于加强数据的完整性约束和业务规则等。


2.触发器和存储过程的区别:触发器与存储过程的唯一区别是触发器不能执行EXECUTE语句调用,而是在用户执行Transact-SQL语句时自动触发执行。


3.作用:


①加强数据的完整性约束(与CHECK约束的区别:触发器通过sql支持更复杂的约束,可以引用其他表中的列,可以自定义错误消息)


②强制服从业务规则


4.分类:


4.1 DML(数据操作语言,Data Manipulation Language)触发器       

功能

AFTER 触发器

INSTEAD OF 触发器




适用范围









表和视图





每个表或视图包含触发器的数量





每个触发操作(UPDATE、DELETE 和 INSERT)包含多个触发器





每个触发操作(UPDATE、DELETE 和 INSERT)包含一个触发器





级联引用





无任何限制条件





不允许在作为级联引用完整性约束目标的表上使用 INSTEAD OF UPDATE 和 DELETE 触发器。





执行





晚于:


  • 约束处理
  • 声明性引用操作
  • 创建 插入的删除的
  • 触发操作




早于:


  • 约束处理




替代:


  • 触发操作




晚于:


  • 创建 插入的删除的




执行顺序





可指定第一个和最后一个执行





不适用





插入的删除的表中的 varchar(max)、 nvarchar(max) 和 varbinary(max)





允许





允许





插入的删除的表中的 text、 ntext 和 image





不允许





允许

4.2 DDL(数据定义语言,Data Definition Language)触发器


它是Sql Server2005新增的触发器,主要用于审核与规范对数据库中表,触发器,视图等结构上的操作。比如在修改表,修改列,新增表,新增列等。


它在数据库结构发生变化时执行,我们主要用它来记录数据库的修改过程,以及限制程序员对数据库的修改,比如不允许删除某些指定表等。


4.3 登录触发器


登录触发器将为响应 LOGIN 事件而激发存储过程。与 SQL Server 实例建立用户会话时将引发此事件。登录触发器将在登录的身份验证阶段完成之后且用户会话实际建立之前激发。

因此,来自触发器内部且通常将到达用户的所有消息(例如错误消息和来自 PRINT 语句的消息)会传送到 SQL Server 错误日志。如果身份验证失败,将不激发登录触发器。

5.语法

创建DML触发器 

 CREATE TRIGGER [ schema_name . ]trigger_name  

 ON { table | view }  

 { FOR | AFTER | INSTEAD OF } --FOR默认为AFTER 

 { [ INSERT ] [ , ] [ UPDATE ] [ , ] [ DELETE ] }  

 AS  

 /* 

 要执行的SQL 

 */





6.使用插入和删除的表


DML 触发器语句使用两种特殊的表:deleted 表和 inserted 表。SQL Server 会自动创建和管理这两种表。


您可以使用这两种驻留内存的临时表来测试特定数据修改的影响以及设置 DML 触发器操作条件。


但不能直接修改表中的数据或对表执行数据定义语言 (DDL) 操作,例如 CREATE INDEX。


deleted 表用于存储 DELETE 和 UPDATE 语句所影响的行的副本。在执行 DELETE 或 UPDATE 语句的过程中,行从触发器表中删除,并传输到 deleted 表中。


inserted 表用于存储 INSERT 和 UPDATE 语句所影响的行的副本。在执行插入或更新事务的过程中,新行会同时添加到 inserted 表和触发器表中。


更新事务类似于在删除操作之后执行插入操作;首先,旧行被复制到 deleted 表中,然后,新行被复制到触发器表和 inserted 表中。


如:


Create Trigger TriggerName 

 On TableName 

 For Insert,Update,Delete 

 As 

 declare @InsertedCount Int 

 declare @DeletedCount Int 

 Set @InsertedCount=(Select Count(*)From inserted)--使用inserted临时表 

 Set @DeletedCount=(Select Count(*)From deleted)--使用deleted临时表 

 If (@InsertedCount>0) 

 Begin 

 raiserror('不能插入或修改!',16,8)--自定义错误提示 

 rollbacktran--回滚 

 End 

 Else If(@DeletedCount>0) 

 Begin 

 --TSQL 

 End