我在更新表中的一列时发生错误,而触发器配置

2022-01-30 14:50:05 标签 sqlsql-servertsqltriggers

我得到这个错误:

Msg 217 Level 16 State 1 Procedure trg_upd Line 7 [Batch Start Line 0]

超过存储过程函数触发器或视图嵌套级别的最大值(限制32)。

当我使用这个触发器在我的数据库:

CREATE TRIGGER trg_upd_inrt
ON [dbo].[tbl_A]
AFTER UPDATE
AS
BEGIN
    SET NOCOUNT ON;
    UPDATE A
    SET [Desc] = CASE i.[Desc]
                     WHEN 'HR DD' THEN 'HRDD'
                     WHEN 'H PP' THEN 'HPP'
                     WHEN 'RPT AR' THEN 'RPTARIN'
                     WHEN 'APPP PPLE' THEN 'APPLE'
                     WHEN 'HR DD' THEN 'HRDD'
                     ELSE Desc
                 END 
    FROM tbl_A a
    INNER JOIN deleted i ON a.id = i.id 
END

###不幸的是,SQL Server并没有让你想做的事情变得很简单。你需要使用instead of trigger and update all columns:

触发和更新所有列:

CREATE TRIGGER trg_upd_inrt ON [dbo].[tbl_A] INSTEAD OF UPDATE
AS BEGIN
    SET NOCOUNT ON;
    UPDATE A
        SET [Desc] = CASE i.[Desc]
                         WHEN 'HR DD' THEN 'HRDD'
                         WHEN 'H PP' THEN 'HPP'
                         WHEN 'RPT AR' THEN 'RPTARIN'
                         WHEN 'APPP PPLE' THEN 'APPLE'
                         WHEN 'HR DD' THEN 'HRDD'
                         ELSE i.[Desc]
                     END,
            COL1 = i.Col1,
            COL2 = i.Col2,
            . . . -- all the rest of the columns that might be updated
        FROM tbl_A a INNER JOIN
             inserted i
             ON a.id = i.id ;
END;

注意,这将使用新值而不是旧值进行替换。这对我来说是有道理的。我假设由于表别名的原因,您确实想要插入而不是删除。

如果你确实需要这两个值,只要在FROM子句中包含这两个值:

    FROM tbl_A a INNER JOIN
         inserted i
         ON a.id = i.id INNER JOIN
         deleted d
         ON d.id = d.id
阅读全文

▼ 版权说明

相关文章也很精彩
推荐内容
更多标签
相关热门
全站排行
随便看看

错说 cuoshuo.com —— 程序员的报错记录

部分内容根据CC版权协议转载;网站内容仅供参考,生产环境使用务必查阅官方文档

辽ICP备19011660号-5

×

扫码关注公众号:职场神器
发送: 1
获取永久解锁本站全部文章的验证码