2016-10-12 25 views
0

我試圖創建一個觸發器,它將用另一個特定值替換插入到特定列中的特定值。創建一個觸發器,插入後用特定值替換空值

Ex。每次插入'1'時,'2'將在插入和更新後放置。

該觸發結束一個新的插入,而不是僅僅在新行已插入之後的列下更新的每一行以「2」:

CREATE TRIGGER trg_MakeFlag 
ON Production.Product 
AFTER INSERT, UPDATE AS 
    BEGIN 
    UPDATE Production.Product 
    SET MakeFlag = '2' 
    WHERE MakeFlag = '1' 
END 

任何幫助理解。

+0

您需要發佈您的架構。桌子的主要關鍵是什麼? – pmbAustin

+0

該表的主鍵是ProductID。 – SMD

回答

0

因此,您需要了解和使用觸發器中插入和刪除的集合。您當前的觸發器正在按照您所告訴的...在每次插入和更新時,將整個表中的所有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觸發器做類似的事情。

只是一些想法讓你思考。

+0

謝謝!這非常有幫助。 – SMD

+0

然後請將其標記爲您的答案。謝謝。 – pmbAustin