2015-09-11 64 views

回答

1

是的,如果你可以禁用遞歸觸發。

SP_CONFIGURE 'nested_triggers',0 
GO 
RECONFIGURE 
GO 
0

是的,你可以:

SqlFiddleDemo

CREATE TABLE tab(a INT); 

INSERT INTO tab(a) VALUES (1); 

CREATE TRIGGER trg_tab ON tab 
AFTER INSERT 
AS 
    INSERT tab 
    SELECT a+1 FROM inserted; 

INSERT INTO tab(a) VALUES (10); 

SELECT * 
FROM tab; 

結果:

a 
1 
10 
11 
1

您可以使用CONTEXT_INFO控制何時觸發應該或不應該運行:

CREATE TRIGGER TR_YourTable_AfterInsert ON YourTable 
    AFTER INSERT 
AS 
BEGIN 
    DECLARE @contextInfo VARBINARY(128) 
    SELECT @contextInfo = CONTEXT_INFO() 

    IF (@contextInfo != 0x123456) BEGIN 
    INSERT INTO YourTable ... 
    END 

    SET CONTEXT_INFO 0x123456 --Setting the context info to prevent nested execution. 
END 

現在你可以明確的INSERT前設置值:

SET CONTEXT_INFO NULL; -- resetting to default 
         -- (not necessary when you are on a new connection) 
INSERT INTO YourTable... 

要回答標題中的問題:是的,一個AFTER INSERT觸發器可以將行插入同一個表,但是根據在服務器的配置上它可以導致嵌套的觸發器執行。

+1

除非你已經在使用context_info作別的東西... – Ben

+0

真的,很好的捕捉。然而,如果是這樣的話,你有一個varbinary(128)字段來存儲任何東西,所以將它分成塊可以幫助很多。 – Pred

相關問題