触发器的基础知识
:create trigger tr_name
on table/view
{for | after | instead of } [update][,][insert][,][delete]
[with encryption]
as {batch | if update (col_name) [{and|or} update (col_name)] }
说明:
1 tr_name :触发器名称
2 on table/view :触发器所作用的表。一个触发器只能作用于一个表
3 for 和after :同义
4 after 与instead of :sql 2000新增项目afrer 与instead of 的区别
After
在触发事件发生以后才被激活,只可以建立在表上
Instead of
代替了相应的触发事件而被执行,既可以建立在表上也可以建立在视图上
5 insert、update、delete:激活触发器的三种操作,可以同时执行,也可选其一
6 if update (col_name):表明所作的操作对指定列是否有影响,有影响,则激活触发器。此外,因为delete 操作只对行有影响,
所以如果使用delete操作就不能用这条语句了(虽然使用也不出错,但是不能激活触发器,没意义)。
7 触发器执行时用到的两个特殊表:deleted ,inserted
deleted 和inserted 可以说是一种特殊的临时表,是在进行激活触发器时由系统自动生成的,其结构与触发器作用的表结构是一
样的,只是存放 的数据有差异。
续
下面表格说明deleted 与inserted 数据的差异
deleted 与inserted 数据的差异
Inserted
存放进行insert和update 操作后的数据
Deleted
存放进行delete 和update操作前的数据
注意:update 操作相当于先进行delete 再进行insert ,所以在进行update操作时,修改前的数据拷贝一条到deleted 表中,修改后
:create trigger tr_name
on table/view
{for | after | instead of } [update][,][insert][,][delete]
[with encryption]
as {batch | if update (col_name) [{and|or} update (col_name)] }
说明:
1 tr_name :触发器名称
2 on table/view :触发器所作用的表。一个触发器只能作用于一个表
3 for 和after :同义
4 after 与instead of :sql 2000新增项目afrer 与instead of 的区别
After
在触发事件发生以后才被激活,只可以建立在表上
Instead of
代替了相应的触发事件而被执行,既可以建立在表上也可以建立在视图上
5 insert、update、delete:激活触发器的三种操作,可以同时执行,也可选其一
6 if update (col_name):表明所作的操作对指定列是否有影响,有影响,则激活触发器。此外,因为delete 操作只对行有影响,
所以如果使用delete操作就不能用这条语句了(虽然使用也不出错,但是不能激活触发器,没意义)。
7 触发器执行时用到的两个特殊表:deleted ,inserted
deleted 和inserted 可以说是一种特殊的临时表,是在进行激活触发器时由系统自动生成的,其结构与触发器作用的表结构是一
样的,只是存放 的数据有差异。
续
下面表格说明deleted 与inserted 数据的差异
deleted 与inserted 数据的差异
Inserted
存放进行insert和update 操作后的数据
Deleted
存放进行delete 和update操作前的数据
注意:update 操作相当于先进行delete 再进行insert ,所以在进行update操作时,修改前的数据拷贝一条到deleted 表中,修改后
的数据在存到触发器作用的表的同时,也同时生成一条拷贝到insered表中
============================================================================
有一个表aaa,3个字段为:Id为自增
Id(自增) No(数值型字段) Name(姓名)
1 1 张名
2 2 李华
3 4 周青
----------------------------------------
if object_id('aaa') is not null
drop table aaa
go
create table aaa(
Id int identity(1,1),
No int null,
Name varchar(20))
go
create trigger aaa_ins
on aaa
after insert
as
update aaa set No=i.Id
from inserted i
where aaa.Id=i.Id
go
insert into aaa(Name) values('a');
select * from aaa;
直接增加
create table aaa
( Id int identity(1,1),
No int default(isnull(scope_identity(),0)+1),
Name varchar(20)
)
insert into aaa(Name) values('a')
select * from aaa
Inserted表和Deleted表。此二表仅仅在触发器运行时存在。你可以使用该两个表来精确地确定触发触发器的动作对数据表所做的修改。比如,通过检查Deleted表,你可以确定那些记录由某一动作删除。 如下例: CREATE TRIGGER tr_webusers_delete ON webusers FOR DELETE AS INSERT weblog (activity) SELECT user_name FROM Deleted 该触发器自动地创建一个webusers表的记录。当在webusers表内删除一个用户的姓名时,触发器会自动地把该姓名插入到weblog表中。假设你一不小心执行了下面的语句: DELETE webusers 该语句会删除在webusers表内的所有记录。一般地,这些记录会永久地丢失,然而上面的触发器会在有记录从webusers表中删除时自动的触发。该触发器会检查表Deleted来确定有那些在webusers表内的记录被删除,并且把所有删除了的记录拷贝到weblog表中。 为了恢复那些意外被删除的记录,你可以使用INSERT和SELECT语句再一次把它们从weblog表中拷贝到webusers表中。如果你不能允许意外地丢失一条记录时,你可以使用上面的方法来创建一个表内数据的备份。 Deleted表和有记录被删除的表的列结构一模一样。在前面的例子内,Deleted表具有和webusers表相同的结构。 现在假定你想跟踪所有插入某一表格的记录。比如,你想把每一条插入webusers表内的记录都在weblog表内做备份,你可以使用下面的触发器来完成该任务: CREATE TRIGGER tr_webusers_insert ON webusers FOR INSERT AS INSERT weblog(activty) SELECT user_name FROM INSERTED 该触发器和前面的触发器非常相似,除了以下两点以外: 该触发器在有记录插入表格webusers时触发;该触发器是FOR INSERT。 该触发器把记录从Inserted表拷贝到weblog表内。 Inserted表内包含了所有已经插入到表内的新记录。假如一个新用户的姓名插入到webusers表内时,触发器会自动地把新的用户姓名从webusers表拷贝到weblog表内。 当你想使用一个简单的表来记录所有发生在你数据库中一个非常重要的表的动作时,这种复制数据的方法非常有用。你可以使用该表来获得对你的数据库的活动的记录,并且可以用于记录和诊断一些可能发生的问题。 Inserted表和Deleted表仅仅在触发器在执行时存在,这一点是非常重要的,我们一定要明确。它们在某一特定时间和某一特定表相关。一旦某一个触发器结束执行时,相应的在两个表内的数据都会丢失。如果你想创建一个在任意一个这些表内数据的永久拷贝,你需要在触发器内把这些表内的数据拷贝到一个永久的表内。