SQLSever2000中的前触发器和后触发器

SQLSever2000中的前触发器和后触发器,第1张

SQLSever2000中的前触发器和后触发器,第2张

我们知道,trigger是一个特殊的存储过程。当Insert Update或Delete语句修改表中的一行或多行时,将执行触发器。因为SQL Server为特定表上的每个指定操作调用触发器,所以您可以使用触发器来扩展SQL Sever的内置完整性和数据操作功能。
(与Delete语句不同,Trancate Table语句不激活触发器,Write Text语句不激活触发器)。

在SQL Sever 2000中,支持两种类型的触发器,即Instead Of触发器和After触发器。前置触发器是在语句执行前激活触发器,后置触发器是在语句执行后激活触发器。您可以通过FOR子句选择要使用的触发器。

在为每个操作创建触发器时,您可以为所有三个操作创建一个触发器,并使用相应的编程技术来处理每个操作。以下示例在For子句中列出了三种类型的语句,并使用条件语句将相应的跟踪值插入到CustUpdLog表中。

在app DTA . dbo . customer
上为Insert、Update、Delete
As
Declare @ inserted Count Int
Declare @ deleted Count Int
Set @ inserted Count =(Select Count(*)From inserted)
Set @ deleted Count =(Select Count(*)From deleted)
If(@ inserted Count > 0)Begin
Insert Into app DTA . dbo

从上面的例子中,我们可以发现每当Insert或Update语句影响一行或多行时,插入的临时表都有记录行。每当Delete或Update语句影响一行或多行时,被删除的临时表都有记录行。对于Update语句,删除的临时表包含旧行,插入的临时表包含新行。此示例还反映了触发器的另一个重要方面:对于表的更新或删除操作,即使语句不影响行(即不满足Where子句的行),触发器也会被激活。触发器的存储过程应该可以预测这种可能性。

您不仅可以为一个表创建多个触发器,还可以为一个表的同一个SQL语句(例如Update语句)创建多个后触发器。不能为同一个SQL语句创建多个前置触发器。每个新的Create Trigger语句都将触发器添加到那些指定表和语句的现有触发器中。对于创建的多个触发器,可以使用系统存储过程sp_settriggerorder来指定第一个激活的触发器和最后一个激活的触发器,而对于其他触发器,不能指定激活顺序,只能由系统确定。这个触发器的特性不会引起任何特殊问题。因为您总是可以像普通存储过程一样实现各种操作,并以所需的顺序从触发器中调用它们。

虽然触发器是一个存储过程,但不能用Execute语句调用它。如果要共享触发器和普通存储过程的代码,只需将共享的代码放在存储过程中,从触发器中调用即可。如果一个触发器修改了一个表,那么这些修改可能会激活另一个触发器或其自身。默认情况下,SQL Sever允许此嵌套触发器调用深度为32层。尽管我们建议允许嵌套和迭代触发器,但我们可以使用系统存储过程来禁止这种情况。以下语句防止指定数据库上的触发器重叠:

sp_dboption AppDta,'递归触发器',' false'

要防止所有数据库中的嵌套触发器调用(包括迭代调用),可以使用以下语句:

sp_configure“嵌套触发器”,0

以前触发器为例,介绍了触发器的基本内容,然后介绍了前触发器的区别。若要创建预触发器,必须使用而不是显式声明它,如以下示例所示:

在app DTA . dbo . customer
上创建触发器TrackCustomerUpdates
,而不是Update
As
Insert Into app DTA . dbo . custupdlog
(CustId,
Action,
UpdUser,
updatedatetime)
Select CustId,
'Update ',
Current_User,
Current _ TimeStamp
From inserted[]

与后触发器不同,前触发器可以在表和视图上创建,但是一个语句只能创建一个前触发器,因此不存在前触发器的激活顺序问题。

应用示例:将当前数据库服务器的商店表的插入操作同步到另一个服务器的商店。

在dbo上创建触发器TRIGGER _ synshopforinsert 1
。shop
FOR INSERT
AS
INSERT into other server . dbo . shop
(
lngShopID,strName,strShopName,strDescription,lngIndex
)
select lngShopID,strShopCode,strName,strShopName,strDescription,lngIndex
from shop where lngShopID in(select lngShopID from inserted

或者使用下面的语句:

在dbo上创建触发器TRIGGER _ synshopforinsert 2
。shop
FOR INSERT
AS
INSERT into other server . dbo . shop
(
lngShopID,strShopCode,strName,strShopName,strDescription,lngIndex
)
select lngShopID,strShopCode,strName,strShopName,strDescription,lngIndex
from inserted
]

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » SQLSever2000中的前触发器和后触发器

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情