我有一个表,在单个记录更新中,触发器在另一个记录中添加历史记录 表
当我在表上运行多记录更新时,触发器不起作用,因为它被实现为仅使用一个记录,并且触发器仅对语句运行一次,无论它是否影响多个记录。有没有办法使这项工作?
我可以使用以下支票:
**if @@rowcount = 1**
以现在处理的方式处理单个记录,而在else语句中以另一种方式处理它(我不知道)?
问题是当我有多条记录时如何以原子方式处理每个案例?如何从INSERTED表中获取每条记录?
触发器当前从INSERTED表初始化一些变量,更新同一个表上的datetime列,然后尝试使用前面提到的初始化变量插入历史记录。所以这些是我希望支持多个记录的步骤。
有人能为我提供一个简单的例子或指南吗?
提前谢谢
答案 0 :(得分:1)
一个非常基本的例子,没有看到你当前的确切触发逻辑:
-- First update the datetime column for each record inserted
UPDATE t
SET t.DateField = GETDATE()
FROM UnderlyingTable t
JOIN inserted i ON t.RecordId = t.RecordId
-- then insert history record for each record inserted
INSERT HistoryTable (DateCreated, RecordId, SomeOtherField)
SELECT GETDATE(), i.RecordId, i.SomeOtherField
FROM inserted i
答案 1 :(得分:0)
我找到了解决方案如何使其考虑多行。
首先,我从PKs匹配的INSERTED表中更改每个Table1记录的日期
UPDATE Table1 set status_changed_on = (SELECT CASE WHEN Table1.status is null THEN null ELSE @now END)
FROM INSERTED i
WHERE Table1.table1_id = i.table1_id
然后添加如下历史记录:
INSERT INTO [History] ([table1_id ], [status_changed_on])
SELECT table1_id, @now
FROM INSERTED
就是这样。对于从INSERTED表中获取的每个更新记录,我插入一条历史记录,其中@now对于所有记录都是相同的。它只是一个保存日期时间的时间戳变量。
上面的DML不是实际的,因为我不能在这里发布我公司的代码,但你得到了图片。
谢谢!!!