我的問題有點理論性,因爲我沒有任何具體的工作例子。但我認爲值得回答。在SQL Server中編寫插入觸發器的正確方法是什麼?
什麼是在SQL Server中編寫插入觸發器的正確方法?
比方說,我創建像這樣(或多或少僞代碼)觸發
CREATE TRIGGER MY_TRIGGER
ON MY_TABLE
FOR INSERT AS
DECLARE @myVariable;
DECLARE InsertedRows CURSOR FAST_FORWARD FOR SELECT A_COLUMN FROM INSERTED;
OPEN InsertedRows;
FETCH NEXT FROM InsertedRows INTO @NewOrderCode;
...
INSERT INTO ANOTHER_TABLE (
CODE,
DATE_INSERTED
) VALUES (
@myVariable,
GETDATE()
);
...etc
現在,如果別人創建在同一個表的另一觸發條件和觸發會改變插入的行一些列?這樣
CREATE TRIGGER ANOTHER_TRIGGER
ON MY_TABLE
FOR INSERT AS
UPDATE MY_TABLE
SET A_COLUMN = something
WHERE ID IN (SELECT ID FROM INSERTED);
...etc
然後我的觸發(如果另一個觸發後被解僱)上的東西不對數據進行操作,因爲插入的數據是不一樣的,其已經改變與其他觸發右表中的實際插入的數據?
總結:
觸發器A於表T更新新插入的行,觸發器B,則對髒數據進行操作,因爲從觸發器A中的更新並不在其中觸發B操作插入的僞代碼表可見。但是如果觸發器B直接在工作臺上工作而不是在僞表INSERTED上,它會通過觸發器A看到更新的數據。
這是真的嗎?我是否應該始終使用表中的數據而不是從INSERTED
表中處理數據?
我不明白。誰被誰攔截?兩個觸發器都在插入之後。其中之一是更新兩個觸發器所屬的表,第二個插入另一個表。 – Behnil
是的。但第二次寫入是由第一次寫入觸發的,第一次寫入在執行時尚未完成其事務。它試圖更新的行由原始事務更新,因此被鎖定。試圖在新的環境中更新它們只會給你一個僵局。 – eftpotrm
但我在觸發器中更新。這是否意味着在其表上發生更新時觸發後插入觸發器? – Behnil