2017-09-19 28 views
1

我使用的是SQL SERVER 2014检测一个操作是否由其他触发器SQL SERVER执行?

我有一个table它有2个触发器(for update)。

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

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

问:

在触发器 - 是能够识别当前的更新是通过触发器触发?

实施例:

1-用户更新的表
2-触发1更新列A
3 - 触发器2调用由于步骤2
4 - 内触发2 - 没有任何代码可以检测到更新是通过步骤2中的触发器进行的?

+0

一个字段添加到表,并在触发1.更新比触发2可以读取场 – GuidoG

+0

@GuidoG围绕尼斯的工作 - 但加入指示我的所有表格(〜500)的列似乎都有问题.... :-) –

+0

列A是否仅由触发器1更新?如果是这样,你可以检查触发器2,如果插入.A不同于删除.A – GuidoG

回答

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 
+0

什么是UPDATE(C)? –

+0

'UPDATE(c)'如果列'c'已更新,则返回'true'。附:请检查最后一次编辑 - 我加了一个要紧的'cast' –

+0

此之前,如果运行1 2 –

相关问题