检测其他触发器SQL SERVER是否执行了某个操作?

时间:2017-09-19 10:18:36

标签: sql-server triggers sql-server-2014

我正在使用SQL SERVER 2014。

我有table,其中有2个触发器(for update)。

触发器1 - 更新列A。 (导致触发器2被调用)

触发器2 - 更新列B。 (导致触发器1被调用)

问题:

在触发器中 - 是否可以识别当前更新是通过触发器触发的?

示例:

1-用户更新了表格 2-触发器1更新列A
3 -Trigger 2由于步骤2而被调用。
4 - 在Trigger 2中 - 是否有任何代码可以通过步骤2中的触发检测到更新?

1 个答案:

答案 0 :(得分:1)

您是否尝试使用CONTEXT_INFO()

ALTER TRIGGER test1
   ON table
   AFTER UPDATE
AS 
BEGIN
    SET NOCOUNT ON;

    IF NOT UPDATE(x)
        RETURN;

    DECLARE @ci varbinary(128) = CAST('Trigger=' + cast(OBJECT_NAME(@@PROCID) AS varchar(128)) + REPLICATE(' ', 128) as varbinary(128));
    SET CONTEXT_INFO @ci;

    UPDATE table
        SET a = 1
        WHERE id = 1;

    SET CONTEXT_INFO 0x0; -- clear
END
GO

alter TRIGGER test2
   ON table
   AFTER UPDATE
AS 
BEGIN
    SET NOCOUNT ON;

    IF NOT UPDATE(a)
        RETURN;

    DECLARE @ci varchar(128) = (SELECT CAST(CONTEXT_INFO() AS varchar) FROM master.dbo.SYSPROCESSES WHERE spid = @@SPID);
    DECLARE @log varchar(2048) = CONCAT('CALLER:', @ci);
    EXEC xp_logevent 60000, @log, informational;

    -- update b
END
GO

这给我留言:

Date        19.09.2017 18:31:21
Log     SQL Server (Current - 19.09.2017 18:29:00)

Source      spid74

Message
CALLER:Trigger=test1