在 SQL 服务器 table 上更新时触发
Trigger on Update on SQL Server table
我想为 SQL 服务器 table 的特定条件更新一个列值。
我有以下用于创建 table
的代码
CREATE TABLE [dbo].[EQUIPMENT](
[ID] [int] IDENTITY(10000,1) NOT NULL,
[Equipment] [nvarchar](80) NOT NULL,
[Facility] [nvarchar](40) NULL,
[EquipmentType] [smallint] NULL,
[Active] [bit] NOT NULL)
插入和更新语句如下
INSERT INTO [Equipment] ([Equipment],[Facility],[EquipmentType],[Active]) VALUES ('E02','1029',10,1)
UPDATE [Equipment] Set Active = 0 where [Equipment] = 'E01'
以下是触发脚本
CREATE TRIGGER dbo.ATRG_EquipmentTypeUpdate
ON [dbo].[Equipment]
AFTER INSERT, UPDATE
AS
BEGIN
SET NOCOUNT ON;
-- update your table, using a set-based approach
-- from the "Inserted" pseudo table which CAN and WILL
-- contain multiple rows!
UPDATE [dbo].[Equipment]
SET EquipmentType = 15
FROM Inserted i
WHERE [dbo].[Equipment].ID = i.ID
AND [dbo].[Equipment].EquipmentType = 10
END
GO
当我尝试 运行 插入或更新语句时 - 我遇到以下错误。
Msg 217, Level 16, State 1, Procedure ATRG_EquipmentTypeUpdate1, Line 12 [Batch Start Line 9]
Maximum stored procedure, function, trigger, or view nesting level exceeded (limit 32).
任何人都可以建议吗? table 中还有其他三个触发器。
这个,我需要作为临时解决方案,以解决问题。
更新其 table 的触发器将不会再次触发,除非您选择加入 Recursive Triggers,因此请检查 RECURSIVE TRIGGERS 数据库设置,如果它已打开,请将其关闭:
alter database current set recursive_triggers off
或者将触发器编码为不执行零行的更新,例如
if not exists (select * from inserted) return
您可以使用 TRIGGER_NESTLEVEL
检查递归调用。
您还应该检查 inserted
中没有行。
CREATE TRIGGER dbo.ATRG_EquipmentTypeUpdate
ON [dbo].[Equipment]
AFTER INSERT, UPDATE
AS
BEGIN
SET NOCOUNT ON;
IF TRIGGER_NESTLEVEL(OBJECT_ID('dbo.ATRG_EquipmentTypeUpdate', 'AFTER', 'DML')) > 1
OR NOT EXISTS (SELECT 1 FROM inserted)
RETURN;
-- update your table, using a set-based approach
-- from the "Inserted" pseudo table which CAN and WILL
-- contain multiple rows!
UPDATE
SET EquipmentType = 15
FROM Inserted i
JOIN [dbo].[Equipment] e ON e.ID = i.ID
AND e.EquipmentType = 10;
END
另请注意在更新中使用正确的 JOIN
语法。
我想为 SQL 服务器 table 的特定条件更新一个列值。 我有以下用于创建 table
的代码CREATE TABLE [dbo].[EQUIPMENT](
[ID] [int] IDENTITY(10000,1) NOT NULL,
[Equipment] [nvarchar](80) NOT NULL,
[Facility] [nvarchar](40) NULL,
[EquipmentType] [smallint] NULL,
[Active] [bit] NOT NULL)
插入和更新语句如下
INSERT INTO [Equipment] ([Equipment],[Facility],[EquipmentType],[Active]) VALUES ('E02','1029',10,1)
UPDATE [Equipment] Set Active = 0 where [Equipment] = 'E01'
以下是触发脚本
CREATE TRIGGER dbo.ATRG_EquipmentTypeUpdate
ON [dbo].[Equipment]
AFTER INSERT, UPDATE
AS
BEGIN
SET NOCOUNT ON;
-- update your table, using a set-based approach
-- from the "Inserted" pseudo table which CAN and WILL
-- contain multiple rows!
UPDATE [dbo].[Equipment]
SET EquipmentType = 15
FROM Inserted i
WHERE [dbo].[Equipment].ID = i.ID
AND [dbo].[Equipment].EquipmentType = 10
END
GO
当我尝试 运行 插入或更新语句时 - 我遇到以下错误。
Msg 217, Level 16, State 1, Procedure ATRG_EquipmentTypeUpdate1, Line 12 [Batch Start Line 9]
Maximum stored procedure, function, trigger, or view nesting level exceeded (limit 32).
任何人都可以建议吗? table 中还有其他三个触发器。 这个,我需要作为临时解决方案,以解决问题。
更新其 table 的触发器将不会再次触发,除非您选择加入 Recursive Triggers,因此请检查 RECURSIVE TRIGGERS 数据库设置,如果它已打开,请将其关闭:
alter database current set recursive_triggers off
或者将触发器编码为不执行零行的更新,例如
if not exists (select * from inserted) return
您可以使用 TRIGGER_NESTLEVEL
检查递归调用。
您还应该检查 inserted
中没有行。
CREATE TRIGGER dbo.ATRG_EquipmentTypeUpdate
ON [dbo].[Equipment]
AFTER INSERT, UPDATE
AS
BEGIN
SET NOCOUNT ON;
IF TRIGGER_NESTLEVEL(OBJECT_ID('dbo.ATRG_EquipmentTypeUpdate', 'AFTER', 'DML')) > 1
OR NOT EXISTS (SELECT 1 FROM inserted)
RETURN;
-- update your table, using a set-based approach
-- from the "Inserted" pseudo table which CAN and WILL
-- contain multiple rows!
UPDATE
SET EquipmentType = 15
FROM Inserted i
JOIN [dbo].[Equipment] e ON e.ID = i.ID
AND e.EquipmentType = 10;
END
另请注意在更新中使用正确的 JOIN
语法。