如何识别触发的触发器(更新或删除)

时间:2013-03-24 00:17:43

标签: sql triggers

如果我使用的触发器在每次更新或删除我的支付表时触发,我如何识别发生的触发类型(如果我解释更多,由于更新记录或删除一个触发函数而被调用记录。)

因为我需要将这些信息存储在我的另一张桌子上。

3 个答案:

答案 0 :(得分:9)

指令:当您将数据插入表格时,只有'inserted'具有新插入的行;当您从表中删除数据时,只有“已删除”具有已删除的行;更新表时,'inserted'保存新行,'deleted'保存旧行。

我认为这个样本可以给你一个提示。 (SQL Server 2012)
样品:
样本表定义:


create table Customer (
          ID int identity(1,1) not null, 
          FirstName varchar(30), 
          LastName varchar(30))
触发:

CREATE TRIGGER TrackAction
ON Customer
AFTER INSERT, UPDATE, DELETE
AS 
BEGIN
   DECLARE @DELETEDCOUNT INT
   DECLARE @INSERTEDCOUNT INT
   SELECT @DELETEDCOUNT = COUNT() FROM deleted
   SELECT @INSERTEDCOUNT = COUNT() FROM inserted
   IF(@DELETEDCOUNT&@INSERTEDCOUNT > 0 )
       PRINT 'Trigger by update action'
   ELSE IF (@DELETEDCOUNT > 0 )
       PRINT 'Trigger by delete action'
   ELSE IF (@INSERTEDCOUNT > 0 )
       PRINT 'Trigger by insert action'
END
测试代码:

insert into Customer 
values ('Bob','Ryan')
update customer 
set FirstName = 'Bob Jr.'
where FirstName = 'Bob'
delete customer 
where FirstName = 'Bob Jr.'
测试结果:
1.通过插入动作触发
2.通过更新操作触发
3.通过删除操作触发

答案 1 :(得分:0)

我在调试时使用的一个技巧是在引用触发器名称的触发器内使用PRINT。如果您包含COUNT(*) FROM INSERTEDCOUNT(*) FROM DELETED,则可以观察消息输出(至少在SSMS中)以查看触发的触发器,触发的顺序以及是否为插入,更新或删除触发它。对于DELETED,插入将具有COUNT(*)=0,对于INSERTED,删除将具有COUNT(*)=0,对于INSERTED和DELETED,更新将具有COUNT(*)>0

答案 2 :(得分:-1)

MS SQL Server?

你没有。

SQL中有一些命令会导致同时更新,插入和删除 (例如,参见MERGE)。触发器将被调用一次,所有[deleted],[inserted]和[updated]伪表都被填充。谈论一个或另一个是否发生是没有意义的。