因此,您需要了解和使用觸發器中插入和刪除的集合。您當前的觸發器正在按照您所告訴的...在每次插入和更新時,將整個表中的所有MakeFlag值設置爲2(如果它們等於1)。在這裏你沒有任何限制,只是「受影響的行」。
所以,你真的需要更多的東西是這樣的:
CREATE TRIGGER trg_MakeFlag
ON Production.Product
AFTER INSERT, UPDATE AS
BEGIN
UPDATE p
SET MakeFlag = '2'
FROM Production.Product p
INNER JOIN inserted i ON p.ProductID = i.ProductID
WHERE MakeFlag = '1'
END
在這裏,我們與插入的集合加入您的表(被插入的行,或更新後的「更新後的價值觀) ,隻影響特定的行,而不是所有的行。
當然,這裏還有一個問題。你有一個觸發器,在一個給定的表更新後觸發,然後更新該表......這聽起來像遞歸給我的。可能不是最好的主意。
您可能想要查看創建兩個INSTEAD OF觸發器,一個用於插入,另一個用於更新,它基本上對錶中插入的集合執行INSERT或UPDATE,用2代替1列(其中1使用CASE語句)。
這將是這個樣子:
CREATE TRIGGER trg_MakeFlag
ON Production.Product
AFTER INSERT AS
BEGIN
INSERT INTO Production.Product (ProductID, MakeFlag, column3, column4, etc...)
SELECT ProductID,
CASE WHEN i.MakeFlag = 1 THEN 2 ELSE i.MakeFlag END,
column3,
column4,
...
FROM inserted;
END
你必須列出所有的列(把真實姓名在那裏到位欄3,column4等....)和確保您在SELECT FROM插入中按相同順序選擇所有相同的列。 CASE聲明將所有插入1的數據轉換爲2,同時保留所有其他值。
你會用INSTEAD OF UPDATE觸發器做類似的事情。
只是一些想法讓你思考。
您需要發佈您的架構。桌子的主要關鍵是什麼? – pmbAustin
該表的主鍵是ProductID。 – SMD