【发布时间】:2020-07-11 09:20:22
【问题描述】:
我所有的表都有一个用于 CRUD 操作的触发器。 这是一个示例:
ALTER TRIGGER [dbo].[Cities_tr] ON [dbo].[Cities] AFTER INSERT, UPDATE
AS
BEGIN
DECLARE @operation CHAR(6)
SET @operation = CASE WHEN EXISTS (SELECT * FROM inserted) AND EXISTS (SELECT * FROM deleted)
THEN 'Update'
WHEN EXISTS (SELECT * FROM inserted)
THEN 'Insert'
WHEN EXISTS(SELECT * FROM deleted)
THEN 'Delete'
ELSE NULL
END
IF @operation = 'Insert'
INSERT INTO history ([dt],[tname],[cuser] ,[id],op)
SELECT GETDATE(),'Cities', i.ldu, i.CityId,@operation
FROM inserted i
set nocount on
IF @operation = 'Update'
INSERT INTO history ([dt],[tname],[cuser] ,[id],op)
SELECT GETDATE(),'Cities', i.ldu, i.CityId,@operation
FROM deleted d, inserted i
END
如果我更新一行,一切正常,触发器会在历史记录中插入一行。
例如
update top(1) cities set f=1
但如果更新了不止一行,updatedrow^2 行将被插入。
例如 9 表示 3 行 100 表示 10 行...
我的触发器出了什么问题,我该如何解决?
【问题讨论】:
-
在 sql-server 中,AFTER 触发器多次触发 - 这在文档中有明确描述:docs.microsoft.com/en-us/sql/relational-databases/triggers/…
-
你能格式化你那里的代码块吗?这种格式使它成为上个月可读性最差的代码示例之一。
标签: sql sql-server sql-update sql-insert database-trigger