触发器分为两种,一种与数据表绑定,响应数据表指定动作(insertdeleteupdate),此处称为表级;一种与数据库本身绑定,响应数据定义语句(主要是CREATEALTER  DROP 开头的语句),此处称为库级。本篇以下所说触发器皆指表级触发器。

     触发器是一段有特定语法,实现一定功能的SQL语句,它与数据表绑定,当数据表发生指定动作(insertdeleteupdate)时,由数据库自动调用。一个触发器必须且只能绑定一张数据表,必须且只能绑定数据表的一个动作(insertdeleteupdate)。但是一个数据表可以绑定多个触发器,一个数据表动作(insertdeleteupdate)也可以绑定多个触发器。触发器耗费性能,不易调试,不利于迁移,不符合时兴的面向对象设计理念,也不容易被接手老项目的人注意到,因而笔者建议尽量避免使用。

      触发器语法:

创建:
CREATE TRIGGER trigger_name --触发器的名字
ON {table_name | view_name} --与触发器绑定的表或视图,必须且只能与一个表或视图绑定
{FOR | After | Instead of }  --触发器类型,动作之后(After)或替代执行(instead of)
[ insert, update,delete ]  --触发器响应的具体动作,一个触发器只能响应一个动作
 AS           
sql_statement  --你需要编写的SQL语句
删除:
DROP  TRIGGER   { trigger/*要删除的触发器名字*/ } [ ,...n ]
修改:
ALTER TRIGGER  trigger_name --触发器的名字
     ON  table_name --与触发器绑定的表或视图,必须且只能与一个表或视图绑定
 {FOR | After | Instead of }  --触发器类型,动作之后(After)或替代执行(instead of)
  {[DELETE][,][INSERT][,][UPDATE]}--触发器响应具体动作,一个触发器只能响应一个动作

     AS
       sql_statement; --你需要编写的SQL语句
禁用启用触发器:
  禁用:alter table 表名 disable trigger 触发器名称
  启用:alter table 表名 enable trigger 触发器名称

     触发器执行后会自动创建两张虚表inserteddeleted。它们可以理解为系统自动创建的、在触发器中使用的临时表,触发器开始时创建,结束后删除。它们的结构与触发器绑定的表结构一致,并且是只读的。

动作

Inserted

Deleted

增加(insert

存放增加的记录

删除(delete

存放被删除的记录

修改(update

存放更新后的记录

存放更新前的记录

 

 

 

 

 

 

 

  触发器分为两种,一种是动作之后(After),一种是替代执行(instead of)。二者主要区别在于动作之后(After)执行时,动作(insertdeleteupdate)已对数据表进行真实更改,而替代执行(instead of),动作(insertdeleteupdate)不对数据表进行真实更改。下面将通过代码对这一结论进行验证。

  有表B,建表语句如下:

create table B(
BH int identity(1,1) not null,
NiHao nvarchar(5) null
)

 有动作之后(After)触发器tr_insert,建立语句如下:

Create  trigger tr_After
On B
For insert
As
Declare @A int

 执行语句:insert into B(NiHao) values('d'),再select * from B,数据如下:

 \"\"

  将触发器 tr_After 修改为

alter  trigger tr_After
On B
instead of  insert --更改了这里
As 
Declare @A int 

  执行语句:insert into B(NiHao) values('d'),再select * from B,数据如下:

  \"\"

  数据和第一次一样,即动作(insertdeleteupdate)不对数据表进行真实更改,要想最终完成insert语句,必须在触发器tr_After中添加SQL语句:insert into B(NiHao) select NiHao from inserted。

  再在表B上绑定新的触发器tr_after2,建立语句如下:

Create  trigger tr_After2
On B
For insert
As 
Declare @A int 

  先turncate table B,再insert into B(NiHao) values('d'),然后select * from B,数据如下:

\"\"

  insert语句成功插入一条数据到表B中。可以得出结论,当存在动作之后(After)类型触发器时,动作(insert、delete或update)对数据表进行真实更改;当只存在替代执行(instead of)类型触发器时,动作不对数据进行真实更改。

 

 

=====================================================================================
本文只代表本人的见解,可能存在错误,仅用于技术交流。如果你喜欢该文,可以扫下面的二维码打赏我(打赏敬请备注“博客园打赏”五字)。
\"\"

 

收藏 打印