添加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
相关产品推荐
相关产品推荐

