我在我的數據庫上有一個觸發器,用於執行業務規則:當某個「事件」發生時,其中一個表上的標誌被更新。我知道這不是建議使用的觸發器,更好的做法是在生成事件的代碼中在數據庫之外執行此規則。但由於我無法控制的原因,這是不可能的,並且該標誌的維護屬於數據庫。T-SQL查詢可以手動工作,但不能觸發
所以,我設計了適當的查詢來維護這個標誌。查詢是這樣的:
UPDATE flg_tbl
SET flag = 'T'
FROM flag_table AS flg_tbl
INNER JOIN table1 AS tbl1 ON tbl1.id = flg_tbl.id
INNER JOIN table2 AS tbl2 ON tbl2.id = flg_tbl.id
...
WHERE tbl2.id IN (SELECT id FROM inserted)
當我手動運行此查詢時,一切都很好。但作爲觸發器,沒有任何反應。
此觸發器將在表插入後執行,這會影響查詢中的所有內連接表。我將觸發器作爲AFTER INSERT觸發器放在表的列表中更新的最後一個表上,但仍然無效。我覺得在這段插入過程中被執行的事實是罪魁禍首;也許這些表格全都還沒有提交,觸發器使用舊數據,儘管已被觸發。
有沒有辦法延遲觸發器,直到完成整個事務提交之後?還是等到它承諾,我只是沒有看到真正的原因?
全,查詢的模糊版本(X是要更新的表,我是觸發器在桌子上):
UPDATE X
SET X.flag = 'T'
FROM tableA AS A
INNER JOIN tableB AS B ON A.id = B.id
INNER JOIN tableX AS X ON X.otherrow = B.otherrow
INNER JOIN tableA AS A2 ON A.diffrow = A2.diffrow AND X.id = A2.id
INNER JOIN tableC AS C ON B.id = C.id AND C.otherflag = 'A'
INNER JOIN tableI AS I ON I.id = B.id
WHERE I.id IN (SELECT id FROM inserted)
你怎麼能手動運行呢? 「插入」不在觸發器的範圍之外。 – 2012-08-01 18:22:39
你在哪張表上放置觸發器? – hatchet 2012-08-01 18:29:41
@AaronBertrand我用已插入的ID替換(SELECT id FROM插入)。 – Klazen108 2012-08-01 18:45:13