我得到这个错误:
Msg 217 Level 16 State 1 Procedure trg_upd Line 7 [Batch Start Line 0]
超过存储过程函数触发器或视图嵌套级别的最大值(限制32)。
当我使用这个触发器在我的数据库:
CREATE TRIGGER trg_upd_inrt
ON [dbo].[tbl_A]
AFTER UPDATE
AS
BEGIN
SET NOCOUNT ON;
UPDATE A
SET [Desc] = CASE i.[Desc]
WHEN 'HR DD' THEN 'HRDD'
WHEN 'H PP' THEN 'HPP'
WHEN 'RPT AR' THEN 'RPTARIN'
WHEN 'APPP PPLE' THEN 'APPLE'
WHEN 'HR DD' THEN 'HRDD'
ELSE Desc
END
FROM tbl_A a
INNER JOIN deleted i ON a.id = i.id
END
###不幸的是,SQL Server并没有让你想做的事情变得很简单。你需要使用instead of
trigger and update all columns:
CREATE TRIGGER trg_upd_inrt ON [dbo].[tbl_A] INSTEAD OF UPDATE
AS BEGIN
SET NOCOUNT ON;
UPDATE A
SET [Desc] = CASE i.[Desc]
WHEN 'HR DD' THEN 'HRDD'
WHEN 'H PP' THEN 'HPP'
WHEN 'RPT AR' THEN 'RPTARIN'
WHEN 'APPP PPLE' THEN 'APPLE'
WHEN 'HR DD' THEN 'HRDD'
ELSE i.[Desc]
END,
COL1 = i.Col1,
COL2 = i.Col2,
. . . -- all the rest of the columns that might be updated
FROM tbl_A a INNER JOIN
inserted i
ON a.id = i.id ;
END;
注意,这将使用新值而不是旧值进行替换。这对我来说是有道理的。我假设由于表别名的原因,您确实想要插入而不是删除。
如果你确实需要这两个值,只要在FROM子句中包含这两个值:
FROM tbl_A a INNER JOIN
inserted i
ON a.id = i.id INNER JOIN
deleted d
ON d.id = d.id