【发布时间】:2013-09-10 08:25:34
【问题描述】:
我想将一列的内容复制到同一张表的另一列中。因此,我创建了这个触发器:
ALTER TRIGGER [dbo].[kennscht_copy_to_prodverpt]
ON [dbo].[Stammdaten]
AFTER INSERT
AS
UPDATE Stammdaten
SET PRODVERPT = (SELECT KENNSCHT FROM INSERTED)
WHERE SNR = (SELECT SNR FROM INSERTED);
但是当我在表上使用 UPDATE 将 KENNSCHT 更新为不同的值时,PRODVERPT 也不会更新。现在,您可能会争辩说这是因为触发器位于AFTER INSERT 而不是AFTER UPDATE,但是当我更改它以使其由UPDATE 和INSERT 触发时,每当我更新任何行时,我都会收到一条错误消息SQL 服务器
无法更新行,因为它会使行不唯一或更新多行(2 行)[原文如此]
这里发生了什么?要么触发器什么都不做,要么把整个表弄乱了,使它无法更新。
更新:我还尝试了以下触发器:
UPDATE s
SET s.PRODVERPT = i.KENNSCHT
FROM Stammdaten s
INNER JOIN INSERTED i ON i.SNR = s.SNR;
但它具有完全相同的行为。如果我只使用AFTER INSERT,没有任何变化,如果我使用AFTER INSERT, UPDATE,我会收到上面的错误消息。
更新2:表格中没有多行,我已经检查过了,因为我认为它可能与问题有关。
【问题讨论】:
-
您的触发器已损坏 - 它假定
inserted仅包含一行。最好切换到FROM/JOIN更新样式,这样您就可以将JOIN与inserted一起使用,但这似乎不是这里的only 问题,因为如果它导致您出现问题,则错误消息将是关于返回多个值的子查询。 -
我也尝试了 JOIN - 但效果相同。一旦我使用“UPDATE”作为触发器,它就会给我错误消息。
-
还将
SET NOCOUNT ON;添加到触发器中。 -
@MartinSmith 解决了它。我现在可以运行 JOIN 触发器。谢谢!您可以将其设置为答案吗?
-
@FlorianPeschka -
SET NOCOUNT ON也包含在 TToni 的答案中。另外,如果有人启用了递归触发器数据库选项,这会给您带来工作的好处!
标签: sql sql-server tsql triggers