You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

添加UPDATE触发器后触发嵌套层级超限(限制32)错误,求解决方案

解决触发器嵌套层级超出限制的问题

错误原因

你的tu_PeopleGeneral是AFTER UPDATE触发器,当触发器内部执行UPDATE PEOPLEGENERAL操作时,会再次触发同一个触发器,形成无限循环,直到超过SQL Server默认的32层嵌套限制,就会抛出Maximum stored procedure, function, trigger, or view nesting level exceeded (limit 32)错误。而INSERT触发器能正常运行,是因为触发器内的UPDATE操作不会触发INSERT触发器,不会形成循环。

另外,原代码还有个问题:用变量@PeopleCodeID只能获取到最后一行更新的People_Code_ID,如果是批量更新,会漏掉其他行的处理。

修正方案

方案1:添加条件避免无意义更新(推荐)

在UPDATE语句中增加判断,只有当PICTURE_NAME的值修剪前后确实不同时才执行更新,既避免循环,也支持批量更新:

CREATE TRIGGER dbo.tu_PeopleGeneral
ON dbo.PEOPLEGENERAL
AFTER UPDATE
AS 
BEGIN
    SET NOCOUNT ON;

    -- 关联inserted表处理批量更新,仅当值需要修剪时才执行更新
    UPDATE pg
    SET pg.PICTURE_NAME = RTRIM(pg.PICTURE_NAME)
    FROM dbo.PEOPLEGENERAL pg
    INNER JOIN inserted i ON pg.PEOPLE_CODE_ID = i.PEOPLE_CODE_ID
    WHERE pg.PICTURE_NAME <> RTRIM(pg.PICTURE_NAME)
END

方案2:改用INSTEAD OF UPDATE触发器

直接在更新时就修剪PICTURE_NAME的值,避免后续触发循环。注意这种方式需要手动列出表中所有需要更新的列:

CREATE TRIGGER dbo.tu_PeopleGeneral
ON dbo.PEOPLEGENERAL
INSTEAD OF UPDATE
AS 
BEGIN
    SET NOCOUNT ON;

    UPDATE pg
    SET 
        pg.PICTURE_NAME = RTRIM(i.PICTURE_NAME),
        -- 手动添加表中其他所有需要更新的列,示例:
        pg.Name = i.Name,
        pg.Age = i.Age,
        pg.CreateTime = i.CreateTime
    FROM dbo.PEOPLEGENERAL pg
    INNER JOIN inserted i ON pg.PEOPLE_CODE_ID = i.PEOPLE_CODE_ID
END

内容的提问来源于stack exchange,提问作者azenk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 22:27:56