2014-10-03 80 views
0

我試圖編寫一個執行更新後運行的觸發器。我希望觸發器更新最後一個更新的行,並使用字符串「changed」填充名爲ACTION_TYPE的字段。更新後更新字段的SQL觸發器

表結構

USE BillingUI; 

CREATE TABLE tbl8_update_transactions 
(
    TID INT IDENTITY PRIMARY KEY, 
    TABLE_NUMBER nchar(2) NOT NULL, 
    HOLIDAY_DATE nchar(8) NOT NULL, 
    FIELD_DESCRIPTION nVARchar(43) NULL, 
    ACTION_TYPE nchar(6) NULL, 
    HID int, 

    FOREIGN KEY (HID) REFERENCES HOLIDAY_DATE_TABLE (HID) ON DELETE CASCADE 
); 

觸發

CREATE TRIGGER tbl8_ins 
ON tbl8_update_transactions 
AFTER UPDATE 
AS 
BEGIN 
    UPDATE tbl8_update_transactions 
    SET ACTION_TYPE = "change" 
    WHERE TID = inserted.TID; 
END 

我收到以下錯誤:

無效列名 「變化」。 - 我不知道爲什麼它認爲變化是列名

多部分標識符「inserted.TID」無法綁定。 - 我不確定這一個的語法,試圖在剛剛更新的行上執行更新。

+0

你的觸發器有** MAJOR **缺陷,你似乎認爲它會被稱爲每行** ** - 這是**不是**的情況。觸發器將在每個語句**中觸發一次**,所以如果你的UPDATE語句影響了25行,你將觸發**觸發**一次,但是,然後「插入」和「刪除」將分別包含25行。您的代碼在這25行中選擇哪一行:'...... WHERE TID = inserted.TID' - 它是非確定性的。你需要重寫你的觸發器來考慮這個問題! – 2014-10-03 18:49:29

回答

0

圍繞「更改」使用單引號引用,並引用From子句中的INSERTED。

UPDATE tbl8_update_transactions 
SET ACTION_TYPE = 'change' 
FROM inserted 
WHERE tbl8_update_transactions.TID = inserted.TID; 
+0

正如本答案所暗示的,觸發發生在SET上,而不是單個行上。 「插入」表中有N個行,而不僅僅是一個。 (除非你只更新一行,但邏輯必須寫成基於集合的) – granadaCoder 2014-10-03 18:55:03

+0

字段TID不明確。我也一次只更新一行,所以這不是問題。 – Dave 2014-10-03 19:00:31

+0

哎呦,對不明的領域抱歉。我已經編輯它以包含更新參考。 – Greenspark 2014-10-03 19:16:04

0

您需要使用單引號。

SET ACTION_TYPE = 'change' 

不能使用雙引號字符在SQL Server中的值。