2012-08-01 21 views
0

我在我的數據庫上有一個觸發器,用於執行業務規則:當某個「事件」發生時,其中一個表上的標誌被更新。我知道這不是建議使用的觸發器,更好的做法是在生成事件的代碼中在數據庫之外執行此規則。但由於我無法控制的原因,這是不可能的,並且該標誌的維護屬於數據庫。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) 
+3

你怎麼能手動運行呢? 「插入」不在觸發器的範圍之外。 – 2012-08-01 18:22:39

+0

你在哪張表上放置觸發器? – hatchet 2012-08-01 18:29:41

+0

@AaronBertrand我用已插入的ID替換(SELECT id FROM插入)。 – Klazen108 2012-08-01 18:45:13

回答

0

引用表Ⅰ(帶有觸發)似乎沒有必要,因爲它的行在inserted。下面似乎是等同的,且可避免的問題:

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' 
WHERE B.id IN (SELECT id FROM inserted) 

UPDATE X 
SET X.flag = 'T' 
FROM tableX AS X 
INNER JOIN tableB AS B ON X.otherrow = B.otherrow 
INNER JOIN tableA AS A ON A.id = B.id 
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' 
WHERE B.id IN (SELECT id FROM inserted) 
+0

就是這樣,它現在起作用!我想通過在觸發器中引用「tableI」來使用舊數據並在那裏失敗。我非常感謝你的幫助! – Klazen108 2012-08-04 22:31:53

相關問題