2017-09-19 43 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 –

相關問題