首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >插入和更新后未触发Server触发器

插入和更新后未触发Server触发器
EN

Stack Overflow用户
提问于 2013-09-10 08:25:34
回答 1查看 12.2K关注 0票数 2

我希望将列的内容复制到同一表中的另一列中。因此,我创建了这个触发器:

代码语言:javascript
运行
复制
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);

但是,当我使用表上的更新将KENNSCHT更新为不同的值时,PRODVERPT也不会被更新。现在,您可能会说,这是因为触发器在AFTER INSERT上而不是AFTER UPDATE上,但是当我更改它以便由UPDATEINSERT触发时,每当我更新任何行时,我都会收到Server的错误消息。

无法更新行,因为它会使行不唯一或更新多行(2行)

这里发生什么事情?要么是触发器什么也没做,要么就是搞乱了整个表,使它无法更新。

更新:我还尝试了以下触发器:

代码语言:javascript
运行
复制
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:表中没有多个行,我已经检查过了,因为我认为它可能与问题相连接。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-09-10 09:59:53

如果以AFTER UPDATE触发器的形式运行此触发器,则会递归运行,因为它总是针对同一个表发出另一个UPDATE语句,从而导致触发器的另一个执行。

要解决这个问题,您需要将update触发器设置为INSTEAD OF UPDATE触发器,或者测试是否修改了KENNSCHT列。对于后者,您可以像这样使用UPDATE()函数:

代码语言:javascript
运行
复制
ALTER TRIGGER [dbo].[kennscht_copy_to_prodverpt_after_update]
ON [dbo].[Stammdaten]
AFTER UPDATE
AS
BEGIN
    SET NOCOUNT ON
    IF (UPDATE(KENNSCHT))
    BEGIN
        UPDATE s
            SET s.PRODVERPT = i.KENNSCHT
            FROM Stammdaten s
            INNER JOIN INSERTED i ON i.SNR = s.SNR
    END
END
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18713994

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档