触发器导致超出最大触发器嵌套级别
Trigger causing Maximum trigger nesting level exceeded
我创建了一个新触发器,如果交付的商品数量等于订购数量,它会更新我的 [Purchase Table]
,但每次 运行 我都会收到以下错误。
ODBC--update on a linked table 'dbo_Purchase Table' failed.
Maximum stored procedure, function, trigger or view nesting level exceeded (limit 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
这里真正的答案是使用计算列, .
但是,如果你真的想为此使用触发器,可以将以下代码放在顶部以提早退出
ALTER TRIGGER [dbo].[trUpdatePurchaseTableStatus]
ON [dbo].[Purchase Table]
AFTER UPDATE
AS
SET NOCOUNT ON;
IF TRIGGER_NESTLEVEL(OBJECT_ID('dbo.trUpdatePurchaseTableStatus')) > 1
OR NOT EXISTS (SELECT 1 FROM inserted)
RETURN;
UPDATE PT
..........
我创建了一个新触发器,如果交付的商品数量等于订购数量,它会更新我的 [Purchase Table]
,但每次 运行 我都会收到以下错误。
ODBC--update on a linked table 'dbo_Purchase Table' failed.
Maximum stored procedure, function, trigger or view nesting level exceeded (limit 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
这里真正的答案是使用计算列,
但是,如果你真的想为此使用触发器,可以将以下代码放在顶部以提早退出
ALTER TRIGGER [dbo].[trUpdatePurchaseTableStatus]
ON [dbo].[Purchase Table]
AFTER UPDATE
AS
SET NOCOUNT ON;
IF TRIGGER_NESTLEVEL(OBJECT_ID('dbo.trUpdatePurchaseTableStatus')) > 1
OR NOT EXISTS (SELECT 1 FROM inserted)
RETURN;
UPDATE PT
..........