2014-10-03 119 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中的值。