博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
前触发器和后触发器简介(downmoon)
阅读量:7117 次
发布时间:2019-06-28

本文共 3060 字,大约阅读时间需要 10 分钟。

前触发器和后触发器简介(downmoon)
    触发器是一种特殊的存储过程。当Insert Update 或者Delete 语句修改表中一个或者多个行时执行触发器。因为SQL Server 对特定表上的每一个指定操作调用一个触发器,所以可以使用触发器扩展SQL Sever 的内置完整性和数据操纵功能.
    注意:
不像Delete 语句,Trancate Table 语句不激活触发器,Write Text 语句也不激活触发器。
    在SQL Sever 2000 中支持两种类型的触发器,前触发器(Instead Of Trigger)和后触发器(After Trigger)。前触发器就是在语句执行之前激活触发器,而后触发器就是在语句执行之后激活触发器。可以通过FOR 子句来选择使用何种触发器。
    当为每一种操作创建一个触发器时,可以为所有三种操作创建一个触发器,并且使用相应的编程技术处理每一种操作。下面的示例在For 子句中列出了三种语句类型并,且使用条件语句将相应的跟踪值插入到CustUpdLog 表中。
None.gif
Create
 
Trigger
 TrackCustomerUpdates
None.gif
On
 AppDta.dbo.Customer
None.gif
For
 
Insert
,
Update
,
Delete
None.gif
As
None.gif
Declare
 
@InsertedCount
 
Int
None.gif
Declare
 
@DeletedCount
 
Int
None.gif
Set
 
@InsertedCount
=
(
Select
 
Count
(
*
)
From
 inserted)
None.gif
Set
 
@DeletedCount
=
(
Select
 
Count
(
*
)
From
 deleted)
None.gif
If
 ( 
@InsertedCount
>
0
)
Begin
None.gif
Insert
 
Into
 AppDta.dbo.CustUpdLog
None.gif( CustID,
None.gifAction,
None.gifUpdUser,
None.gifUpdDateTime)
None.gif
Select
 CustId,
None.gif
Case
None.gif
When
@DeletedCount
>
0
)
Then
None.gif
'
Update
'
None.gif
Else
 
'
Insert
'
None.gif
End
,
None.gif
Current_User
,
None.gif
Current_TimeStamp
None.gif
From
 inserted
None.gif
End
None.gif
Else
 
If
(
@DeletedCount
>
0
)
 Begin
None.gif
Insert
 
Into
 AppDta.dbo.CustUpdLog
None.gif( CustId,
None.gifAction,
None.gifUpdUser,
None.gifUpdDateTime)
None.gif
select
 CustId,
None.gif
'
Delete
'
,
None.gif
Current_User
,
None.gif
Current_TimeStamp
None.gif
From
 deleted
None.gif
End
    正如本例所示,无论何时Insert 或者Update 语句影响一个或者多行时,inserted 临时表都有记录行。无论何时Delete 或者Update 语句影响一个或者多行时,deleted 临时表都有记录行。对于一个Update 语句,deleted 临时表有旧行,inserted 临时表有新行。这个示例还反映了触发器的另一个重要方面:
对于某个表的Update 或者Delete 操作,即使该语句没有影响到行,也激活触发器 (也就是说没有满足Where 子句的行)。 触发器的存储过程应该预测这种可能性。
    不仅可以为一个表创建多个触发器,而且还可以为一个表的同一个SQL 语句(例如Update 语句)创建多个后触发器,不能为同一个SQL 语句创建多个前触发器。每一个新的Create Trigger 语句增加触发器到那些指定表和语句已有的触发器中。对于所创建的多个触发器,可以用系统存储过程sp_settriggerorder 来指定第一个被激活的触发器和最后一个被激活的触发器,而对于其他的触发器,则不能指定其激活顺序,只能由系统决定。这种触发器的特征不会引起任何特殊的问题。因为总是可以实现各种动作作为正常的存储过程,并且按照要求的顺序从一个触发器中调用它们。
   
尽管触发器是一种存储过程,但是不能使用Execute 语句调用它,如果有希望共享触发器和正常的存储过程的编码,那么只需把共享代码放在存储过程中,从触发器中调用它。如果一个触发器修改一个表,那么这些修改可能会激活另一个触发器,或者本身。在默认情况下,SQL Sever 允许这种嵌套的触发器调用深度为32层。虽然我们建议允许嵌套的和叠代的触发器,但是可以使用系统存储过程禁止这么做。下面的语句
在指定的数据库上防止叠代触发器:
sp_dboption AppDta,`recursive triggers',`false'
    为了
在所有数据库中防止嵌套触发器调用(包括叠代调用),可以使用下面的语句:
sp_configure `nested triggers',0
    前面以后触发器为例介绍了触发器的基本内容,下面再介绍一下前触发器的不同之处。
要创建一个前触发器必须用Instead Of 显式声明,如下面的例子:
None.gif
create
 
Trigger
 TrackCustomerUpdates
None.gif
On
 AppDta.dbo.Customer
None.gifInstead 
Of
 
Update
None.gif
As
None.gif
Insert
 
Into
 AppDta.dbo.CustUpdLog
None.gif(CustId,
None.gifAction,
None.gifUpdUser,
None.gifUpdDateTime)
None.gif
Select
 CustId,
None.gif
Update
’,
None.gif
Current_User
,
None.gif
Current_TimeStamp
None.gif
From
 inserted
    与后触发器不同的是:前触发器既可以在表又可以在视图上创建,但一条语句只能创建一个前触发器,因此,前触发器不存在激活顺序问题
触发器应用举例:从当前数据库服务器的Shop表Insert操作同步到另一台服务器的Shop。
None.gif
CREATE
 
TRIGGER
 Trigger_SynShopForInsert1
None.gif
ON
 dbo.Shop
None.gif
FOR
 
INSERT
None.gif
AS
None.gif  
insert
 
into
 OtherServer.dbo.shop
None.gif(
None.giflngShopID,strShopCode,strName,strShopName,strDescription,lngIndex
None.gif)
None.gif
select
  lngShopID,strShopCode,strName,strShopName,strDescription,lngIndex
None.gif
from
 shop 
where
 lngShopID 
in
 (
select
 lngshopid 
from
 inserted)
None.gif
或者:
None.gif
CREATE
 
TRIGGER
 Trigger_SynShopForInsert2
None.gif
ON
 dbo.Shop
None.gif
FOR
 
INSERT
None.gif
AS
None.gif  
insert
 
into
 OtherServer.dbo.shop
None.gif(
None.giflngShopID,strShopCode,strName,strShopName,strDescription,lngIndex
None.gif)
None.gif
select
  lngShopID,strShopCode,strName,strShopName,strDescription,lngIndex
None.gif
from
  inserted

转载于:https://www.cnblogs.com/flysun0311/archive/2011/06/01/2065681.html

你可能感兴趣的文章
在Eclipse中手动安装pydev插件
查看>>
ubuntu16.04打造vim和python3的IDE
查看>>
Java对象的假克隆
查看>>
eclipse和maven
查看>>
Linux内存实际使用率
查看>>
Hadoop hive sqoop zookeeper hbase生产环境日志统计应用案例(hadoop篇)
查看>>
rsync 安装 配置 实例
查看>>
Linux web服务与HTTP协议基础概念
查看>>
MySQL 行复制
查看>>
Linux 内存中的Cache
查看>>
umail邮件服务器如何保证数据安全性?
查看>>
if语句中的赋值与判断
查看>>
算法导论视频课程
查看>>
mysql配置讲解
查看>>
linux裁剪—定制自己所需要的linux
查看>>
27个提升效率的iOS开源库推荐
查看>>
【three.js详解之一】入门篇
查看>>
我的php学习笔记(45) PHP输出CSV、Excel
查看>>
Windows7多合一镜像制作
查看>>
简单的String类实现及写时拷贝
查看>>