繁体   English   中英

触发原因 超出最大触发嵌套级别

[英]Trigger causing Maximum trigger nesting level exceeded

我创建了一个新触发器,如果​​交付的商品数量等于订购的数量,它会更新我的[Purchase Table] ,但每次运行时都会出现以下错误。

ODBC--对链接表“dbo_Purchase Table”的更新失败。
超出最大存储过程、函数、触发器或视图嵌套级别(限制 32)。 (#217)

这是我创建的触发器:

USE [####]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER TRIGGER [dbo].[trUpdatePurchaseTableStatus]
    ON [dbo].[Purchase Table]
    AFTER UPDATE
AS
    BEGIN
        SET NOCOUNT ON;
        UPDATE PT
        SET PT.Delivered = 1
        FROM inserted as I
        INNER JOIN dbo.[Purchase Table] AS PT
        ON [PT].[ID] = I.[ID]
        WHERE PT.deliveredQTY >= PT.QTY
    END

如果Delivered的值纯粹基于deliveredQTY的值是否大于或等于QTY我建议改用计算列,那么您不需要TRIGGER

您不能将现有列更改为计算列(甚至不能ALTER计算列),您需要DROP列然后添加它:

--You would also need to DROP any CONSTRAINTs and/or INDEXes, etc, that use the column
ALTER TABLE dbo.[Purchase Table] DROP COLUMN Delivered;
GO
ALTER TABLE dbo.[Purchase Table]
ADD Delivered AS CONVERT(bit,CASE WHEN deliveredQTY >= QTY THEN 1 ELSE 0 END) /*PERSISTED*/; --If the column is to be indexed, you'll likely want the PERSISTED
GO

真正的答案是使用计算列就像@Larnu 说的那样。


但是,如果您真的想为此使用触发器,则可以将以下代码放在顶部以提早退出

ALTER TRIGGER [dbo].[trUpdatePurchaseTableStatus]
    ON [dbo].[Purchase Table]
    AFTER UPDATE
AS

SET NOCOUNT ON;

IF TRIGGER_NESTLEVEL(@@PROCID, 'AFTER', 'DML') > 1
  OR NOT EXISTS (SELECT 1 FROM inserted)
    RETURN;

UPDATE PT
..........

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM