前触发器和后触发器

转载 2006年06月15日 09:23:00

       触发器是一种特殊的存储过程。当Insert Update 或者Delete 语句修改表中一个或者多个行时执行触发器。因为SQL Server 对特定表上的每一个指定操作调用一个触发器,所以可以使用触发器扩展SQL Sever 的内置完整性和数据操纵功能.
    注意:不像Delete 语句,Trancate Table 语句不激活触发器,Write Text 语句也不激活触发器。
    在SQL Sever 2000 中支持两种类型的触发器,前触发器(Instead Of Trigger)和后触发器(After Trigger)。前触发器就是在语句执行之前激活触发器,而后触发器就是在语句执行之后激活触发器。可以通过FOR 子句来选择使用何种触发器。
    当为每一种操作创建一个触发器时,可以为所有三种操作创建一个触发器,并且使用相应的编程技术处理每一种操作。下面的示例在For 子句中列出了三种语句类型并,且使用条件语句将相应的跟踪值插入到CustUpdLog 表中。
Create Trigger TrackCustomerUpdates
On AppDta.dbo.Customer
For Insert,Update,Delete
As
Declare @InsertedCount Int
Declare @DeletedCount Int
Set @InsertedCount=(Select Count(*)From inserted)
Set @DeletedCount=(Select Count(*)From deleted)
If ( @InsertedCount>0)Begin
Insert Into AppDta.dbo.CustUpdLog
( CustID,
Action,
UpdUser,
UpdDateTime)
Select CustId,
Case
When( @DeletedCount>0)Then
'Update'
Else 'Insert'
End,
Current_User,
Current_TimeStamp
From inserted
End
Else If(@DeletedCount>0)Begin
Insert Into AppDta.dbo.CustUpdLog
( CustId,
Action,
UpdUser,
UpdDateTime)
select CustId,
'Delete',
Current_User,
Current_TimeStamp
From deleted
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 显式声明,如下面的例子:
create Trigger TrackCustomerUpdates
On AppDta.dbo.Customer
Instead Of Update
As
Insert Into AppDta.dbo.CustUpdLog
(CustId,
Action,
UpdUser,
UpdDateTime)
Select CustId,
‘Update’,
Current_User,
Current_TimeStamp
From inserted
    与后触发器不同的是:前触发器既可以在表又可以在视图上创建,但一条语句只能创建一个前触发器,因此,前触发器不存在激活顺序问题


触发器应用举例:从当前数据库服务器的Shop表Insert操作同步到另一台服务器的Shop。

CREATE TRIGGER Trigger_SynShopForInsert1
ON dbo.Shop
FOR INSERT
AS
  insert into OtherServer.dbo.shop
(
lngShopID,strShopCode,strName,strShopName,strDescription,lngIndex
)
select  lngShopID,strShopCode,strName,strShopName,strDescription,lngIndex
from shop where lngShopID in (select lngshopid from inserted)

或者:

CREATE TRIGGER Trigger_SynShopForInsert2
ON dbo.Shop
FOR INSERT
AS
  insert into OtherServer.dbo.shop
(
lngShopID,strShopCode,strName,strShopName,strDescription,lngIndex
)
select  lngShopID,strShopCode,strName,strShopName,strDescription,lngIndex
from  inserted

触发器以及事前触发和事后触发,语句级触发和行级触发

一、触发器概念 触发器是一种特殊类型的存储过程,它不同于之前的我们介绍的存储过程。触发器主要是通过事件(增、删、改)进行触发被自动调用执行的。而存储过程可以通过存储过程的名称被调用。 触发器是在对表进...
  • mao834099514
  • mao834099514
  • 2016年08月22日 15:43
  • 1819

触发器的学习笔记(执行流程,应用,权限)

事务的执行流程 1、 执行Identity insert 检查    ---允许将显式值插入表的标识列中 2、 检查为空性约束 3、 检查数据类型 4、 执行 instead of 触发器。如...
  • mfkpie
  • mfkpie
  • 2013年11月13日 21:37
  • 1316

Oracle触发器 同一事件激活两个触发器

5.11 同一事件激活两个触发器问题现在需要创建一个触发器,把SYSDATE的值插入LOCATIONS表的HIRE_DATE字段。但是这个表已经有一个BEFORE INSERT触发器,而你又不希望这两...
  • suding3
  • suding3
  • 2016年12月14日 12:16
  • 961

mysql 触发器的创建 修改 删除

mysql 触发器的创建 修改 删除 //做一个简单的练习,创建一个简单的触发器 完成添加文章的时候,自动加上时间,默认作者 为 ‘日记本的回忆‘   show columns fr...
  • zhihui1017
  • zhihui1017
  • 2015年12月20日 21:27
  • 1672

oracle冒号问题联系触发器中new和old的冒号问题':'

oracle冒号问题联系触发器中new和old的冒号问题':' 分类: oracle2012-04-08 22:45 2773人阅读 评论(0) 收藏 举报 oraclesqlinsert数据...
  • evilcry2012
  • evilcry2012
  • 2015年05月19日 15:41
  • 1217

SQL总结---触发器

概念 触发器是一种特殊类型的存储过程,不由用户直接调用。创建触发器时会对其进行定义,以便在对特定表或列作特定类型的数据修改时执行。 触发器可以查询其他表,而且可以包含复杂的 SQL 语句。...
  • zgsdzczh
  • zgsdzczh
  • 2017年05月03日 19:00
  • 271

MySQL——触发器的创建和使用总结

什么是触发器 触发器(TRIGGER)是MySQL的数据库对象之一,从5.0.2版本开始支持。该对象与编程语言中的函数非常类似,都需要声明、执行等。但是触发器的执行不是由程序调用,也不是由手工启动,...
  • Goskalrie
  • Goskalrie
  • 2016年11月03日 13:34
  • 19978

什么是MySQL触发器

MySQL的触发器和存储过程一样,都是嵌入到MySQL的一段程序。利用MySQL触发器可以对表进行增、删、改操作同时响应另一张表做出相同的操作。下面简单介绍一下MySQL触发器的基本语法。 如何创建...
  • dongsg11200
  • dongsg11200
  • 2013年08月16日 23:33
  • 2833

Oracle触发器和MySQL触发器之间的区别

Oracle触发器格式: CREATE [OR REPLACE] TRIGGER trigger_name BEFORE|AFTER INSERT|UPDATE|DELETE ON table...
  • a19881029
  • a19881029
  • 2014年07月16日 16:31
  • 3831

MySQL5.6 触发器的使用(条件分支、变量的使用)

use fs; /*product_info表中,仪器和试剂一定是不同的产品,id上不可能重复,可以放心删*/ create trigger check_record_delete_tri...
  • zhouyingge1104
  • zhouyingge1104
  • 2014年07月07日 20:11
  • 23890
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:前触发器和后触发器
举报原因:
原因补充:

(最多只允许输入30个字)