如果我使用的触发器在我的付款表的每次更新或删除时触发,我如何识别发生的触发器类型(如果我解释更多,由于更新记录或删除记录而调用的触发器函数。)
因为我需要将这些信息存储在我的另一张桌子上。
说明:向表中插入数据时,只有 'inserted' 有新插入的行;当您从表中删除数据时,只有“已删除”具有已删除的行;当您更新表时,“插入”保存新行,“删除”保存旧行。
我认为这个样本可以给你一个提示。(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.'
测试结果:微软 SQL 服务器?
你没有。
SQL 中有单个命令会同时导致更新、插入和删除(例如,参见 MERGE)。触发器将被调用一次,并填充 [deleted]、[inserted] 和 [updated] 伪表。谈论一个或另一个是否发生是没有意义的。
我在调试时使用的一个技巧是在引用触发器名称的触发器内使用 PRINT。如果包含COUNT(*) FROM INSERTED
and COUNT(*) FROM DELETED
,则可以观察消息输出(至少在 SSMS 中)以查看触发了哪些触发器、它们触发的顺序以及触发它的是否是插入、更新或删除。插入将具有COUNT(*)=0
DELETED,删除将具有COUNT(*)=0
INSERTED,更新将具有COUNT(*)>0
INSERTED 和 DELETED。