我是SQL Server觸發器的新手。AFTER INSERT觸發器可以在SQL Server中的同一個表中插入語句嗎?
假設我們寫一個after insert
觸發器表tableA
並且在觸發,我們可以在同一個表即tableA
的INSERT
操作?
有什麼建議嗎?
我是SQL Server觸發器的新手。AFTER INSERT觸發器可以在SQL Server中的同一個表中插入語句嗎?
假設我們寫一個after insert
觸發器表tableA
並且在觸發,我們可以在同一個表即tableA
的INSERT
操作?
有什麼建議嗎?
是的,如果你可以禁用遞歸觸發。
SP_CONFIGURE 'nested_triggers',0
GO
RECONFIGURE
GO
是的,你可以:
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
您可以使用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觸發器可以將行插入同一個表,但是根據在服務器的配置上它可以導致嵌套的觸發器執行。
除非你已經在使用context_info作別的東西... – Ben
真的,很好的捕捉。然而,如果是這樣的話,你有一個varbinary(128)字段來存儲任何東西,所以將它分成塊可以幫助很多。 – Pred