多记录更新触发一次触发

时间:2009-11-02 12:47:18

标签: sql-server-2005

我有一个表,在单个记录更新中,触发器在另一个记录中添加历史记录 表

当我在表上运行多记录更新时,触发器不起作用,因为它被实现为仅使用一个记录,并且触发器仅对语句运行一次,无论它是否影响多个记录。有没有办法使这项工作?

我可以使用以下支票:

**if @@rowcount = 1** 

以现在处理的方式处理单个记录,而在else语句中以另一种方式处理它(我不知道)?

问题是当我有多条记录时如何以原子方式处理每个案例?如何从INSERTED表中获取每条记录?

触发器当前从INS​​ERTED表初始化一些变量,更新同一个表上的datetime列,然后尝试使用前面提到的初始化变量插入历史记录。所以这些是我希望支持多个记录的步骤。

有人能为我提供一个简单的例子或指南吗?

提前谢谢

2 个答案:

答案 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不是实际的,因为我不能在这里发布我公司的代码,但你得到了图片。

谢谢!!!