当前位置:金沙js333娱乐场 > 网络频道 > 前触发器和后触发器简介(downmoon)金沙js333娱乐场

前触发器和后触发器简介(downmoon)金沙js333娱乐场

文章作者:网络频道 上传时间:2019-12-13

delimiter|  

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

      WHERE i.lo_phone=c.lo_phone  

    前面以后触发器为例介绍了触发器的基本内容,下面再介绍一下前触发器的不同之处。要创建一个前触发器必须用Instead Of 显式声明,如下面的例子:

      INSERT INTO dbo.HistoryLocation  

金沙js333娱乐场 1CREATE TRIGGER Trigger_SynShopForInsert1
金沙js333娱乐场 2ON dbo.Shop
金沙js333娱乐场 3FOR INSERT
金沙js333娱乐场 4AS
金沙js333娱乐场 5  insert into OtherServer.dbo.shop
金沙js333娱乐场 6(
金沙js333娱乐场 7lngShopID,strShopCode,strName,strShopName,strDescription,lngIndex
金沙js333娱乐场 8)
金沙js333娱乐场 9select  lngShopID,strShopCode,strName,strShopName,strDescription,lngIndex
金沙js333娱乐场 10from shop where lngShopID in (select lngshopid from inserted)
金沙js333娱乐场 11

BEGIN  

 Begin
金沙js333娱乐场 12Insert Into AppDta.dbo.CustUpdLog
金沙js333娱乐场 13( CustId,
金沙js333娱乐场 14Action,
金沙js333娱乐场 15UpdUser,
金沙js333娱乐场 16UpdDateTime)
金沙js333娱乐场 17select CustId,
金沙js333娱乐场 18'Delete',
金沙js333娱乐场 19Current_User,
金沙js333娱乐场 20Current_TimeStamp
金沙js333娱乐场 21From deleted
金沙js333娱乐场 22End

http://www.bkjia.com/Mysql/488157.htmlwww.bkjia.comtruehttp://www.bkjia.com/Mysql/488157.htmlTechArticle对比MySQL与SQL SERVER2005的触发器写法 最近给从前的项目做了数据库的移植,发现不同公司的产品,还真是差别甚大啊。 www.2cto.com 下面是原来...

    不仅可以为一个表创建多个触发器,而且还可以为一个表的同一个SQL 语句(例如Update 语句)创建多个后触发器,不能为同一个SQL 语句创建多个前触发器。每一个新的Create Trigger 语句增加触发器到那些指定表和语句已有的触发器中。对于所创建的多个触发器,可以用系统存储过程sp_settriggerorder 来指定第一个被激活的触发器和最后一个被激活的触发器,而对于其他的触发器,则不能指定其激活顺序,只能由系统决定。这种触发器的特征不会引起任何特殊的 问题。因为总是可以实现各种动作作为正常的存储过程,并且按照要求的顺序从一个触发器中调用它们。

end|  

前触发器和后触发器简介(downmoon)

      SELECT c.cl_time,c.lo_phone,c.cl_lng,c.cl_lat  

    尽管触发器是一种存储过程,但是不能使用Execute 语句调用它, 如果有希望共享触发器和正常的存储过程的编码,那么只需把共享代码放在存储过程中,从触发器中调用它。如果一个触发器修改一个表,那么这些修改可能会激活 另一个触发器,或者本身。在默认情况下,SQL Sever 允许这种嵌套的触发器调用深度为32层。虽然我们建议允许嵌套的和叠代的触发器,但是可以使用系统存储过程禁止这么做。下面的语句在指定的数据库上防止叠代触发器:
sp_dboption AppDta,`recursive triggers',`false'
    为了在所有数据库中防止嵌套触发器调用(包括叠代调用),可以使用下面的语句:
sp_configure `nested triggers',0

Sql代码  

或者:

移植到MySQL 5.01上就成这样子了:

金沙js333娱乐场 23CREATE TRIGGER Trigger_SynShopForInsert2
金沙js333娱乐场 24ON dbo.Shop
金沙js333娱乐场 25FOR INSERT
金沙js333娱乐场 26AS
金沙js333娱乐场 27  insert into OtherServer.dbo.shop
金沙js333娱乐场 28(
金沙js333娱乐场 29lngShopID,strShopCode,strName,strShopName,strDescription,lngIndex
金沙js333娱乐场 30)
金沙js333娱乐场 31select  lngShopID,strShopCode,strName,strShopName,strDescription,lngIndex
金沙js333娱乐场 32from  inserted

 

    触发器是一种特殊的存储过程。当Insert Update 或者Delete 语句修改表中一个或者多个行时执行触发器。因为SQL Server 对特定表上的每一个指定操作调用一个触发器,所以可以使用触发器扩展SQL Sever 的内置完整性和数据操纵功能.
    注意:不像Delete 语句,Trancate Table 语句不激活触发器,Write Text 语句也不激活触发器。
    在SQL Sever 2000 中支持两种类型的触发器,前触发器(Instead Of Trigger)和后触发器(After Trigger)。前触发器就是在语句执行之前激活触发器,而后触发器就是在语句执行之后激活触发器。可以通过FOR 子句来选择使用何种触发器。
    当为每一种操作创建一个触发器时,可以为所有三种操作创建一个触发器,并且使用相应的编程技术处理每一种操作。下面的示例在For 子句中列出了三种语句类型并,且使用条件语句将相应的跟踪值插入到CustUpdLog 表中。

drop trigger if exists TG_Update_Current ;  

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

END  

金沙js333娱乐场 33Create Trigger TrackCustomerUpdates
金沙js333娱乐场 34On AppDta.dbo.Customer
金沙js333娱乐场 35For Insert,Update,Delete
金沙js333娱乐场 36As
金沙js333娱乐场 37Declare @InsertedCount Int
金沙js333娱乐场 38Declare @DeletedCount Int
金沙js333娱乐场 39Set @InsertedCount=(Select Count(*)From inserted)
金沙js333娱乐场 40Set @DeletedCount=(Select Count(*)From deleted)
金沙js333娱乐场 41If ( @InsertedCount>0)Begin
金沙js333娱乐场 42Insert Into AppDta.dbo.CustUpdLog
金沙js333娱乐场 43( CustID,
金沙js333娱乐场 44Action,
金沙js333娱乐场 45UpdUser,
金沙js333娱乐场 46UpdDateTime)
金沙js333娱乐场 47Select CustId,
金沙js333娱乐场 48Case
金沙js333娱乐场 49When( @DeletedCount>0)Then
金沙js333娱乐场 50'Update'
金沙js333娱乐场 51Else 'Insert'
金沙js333娱乐场 52End,
金沙js333娱乐场 53金沙js333娱乐场,Current_User,
金沙js333娱乐场 54Current_TimeStamp
金沙js333娱乐场 55From inserted
金沙js333娱乐场 56End
金沙js333娱乐场 57Else If(@DeletedCount>0)

after update ON CurrentLocation   

金沙js333娱乐场 58create Trigger TrackCustomerUpdates
金沙js333娱乐场 59On AppDta.dbo.Customer
金沙js333娱乐场 60Instead Of Update
金沙js333娱乐场 61As
金沙js333娱乐场 62Insert Into AppDta.dbo.CustUpdLog
金沙js333娱乐场 63(CustId,
金沙js333娱乐场 64Action,
金沙js333娱乐场 65UpdUser,
金沙js333娱乐场 66UpdDateTime)
金沙js333娱乐场 67Select CustId,
金沙js333娱乐场 68‘Update’,
金沙js333娱乐场 69Current_User,
金沙js333娱乐场 70Current_TimeStamp
金沙js333娱乐场 71From inserted

下面是原来用在MS SQL2005上的一个触发器:

    正如本例所示,无论何时Insert 或者Update 语句影响一个或者多行时,inserted 临时表都有记录行。无论何时Delete 或者Update 语句影响一个或者多行时,deleted 临时表都有记录行。对于一个Update 语句,deleted 临时表有旧行,inserted 临时表有新行。这个示例还反映了触发器的另一个重要方面:对于某个表的Update 或者Delete 操作,即使该语句没有影响到行,也激活触发器 (也就是说没有满足Where 子句的行)。 触发器的存储过程应该预测这种可能性。

   www.2cto.com  

对比MySQL与SQL SERVER2005的触发器写法

go  

本文由金沙js333娱乐场发布于网络频道,转载请注明出处:前触发器和后触发器简介(downmoon)金沙js333娱乐场

关键词: