C# 更新后的SQL触发器,使用值更新字段
我正在尝试编写一个在执行更新后运行的触发器。我希望触发器更新更新的最后一行,并用更改的字符串填充名为ACTION_TYPE的字段 表结构C# 更新后的SQL触发器,使用值更新字段,c#,sql,sql-server,C#,Sql,Sql Server,我正在尝试编写一个在执行更新后运行的触发器。我希望触发器更新更新的最后一行,并用更改的字符串填充名为ACTION_TYPE的字段 表结构 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_DESCRIPTI
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
我得到以下错误:
列名更改无效。-我不知道为什么它认为变更是一个列名
无法绑定插入的多部分标识符。TID。-我不确定这一行的语法,试图对刚刚更新的行执行更新
你需要使用单引号
SET ACTION_TYPE = 'change'
SQL Server中的值不能使用双引号。在From子句中插入的“change”和引用周围的引号使用单引号
UPDATE tbl8_update_transactions
SET ACTION_TYPE = 'change'
FROM inserted
WHERE tbl8_update_transactions.TID = inserted.TID;
您的触发器有一个主要缺陷,您似乎认为它每行调用一次,但事实并非如此。每个语句触发一次触发器,因此如果UPDATE语句影响25行,则触发一次触发器,但Inserted和Deleted语句将分别包含25行。您的代码将在此处选择这25行中的哪一行:。。。。其中TID=inserted.TID-它是不确定的。你需要重写你的触发器来考虑这一点!正如这个答案所暗示的,触发器发生在集合上,而不是单个行上。插入的表中有N行,而不仅仅是一行。除非您只更新一行,但必须为set-basedfield TID编写逻辑,否则该逻辑是不明确的。另外,我一次只更新一行,所以这不成问题。哎呀,对不起,字段不明确。我已经编辑了它以包含更新引用。