【问题标题】:Inserted and Deleted trigger about changeable primary key (SQL Server)关于可变主键的插入和删除触发器(SQL Server)
【发布时间】:2012-06-03 12:20:07
【问题描述】:

假设我有一个包含一列(主键)的表,并且我在该表上设置了触发器来记录任何更改。现在,当在 Deleted 中更新一行(主键)时,我有旧的主值,而在 Inserted 中我有新的主值。在多行更新中,如何将旧值(在 Deleted 中)绑定到新值(在 Inserted 中)?

例如:

myTable 一列(也是主键):

PK
---
1
2

现在我更新 1 到 4 和 2 到 3

Deleted
-------
1
2

Inserted
--------
3
4

如何在具有三列的审计表中记录这些更改:PK、old_value、new_value

Audit Table
-----------
PK | old_value | new_value
1  | 1         | 4
2  | 2         | 3

在 oracle 中我们有新旧值,但在 sql server 中没有。

【问题讨论】:

  • 您可以查看this SO article
  • SQL Server 没有行触发器,也没有在 inserteddeleted 表中提供任何类型的逻辑行标识符,可用于代替 PK 加入,因此有除了链接问题中@gbn 的答案中的技术之外,没有办法做到这一点。
  • 如果您可以改变看待 PK 变化的方式。将它们记录为删除和插入。

标签: sql-server triggers


【解决方案1】:

在触发器中使用光标记录更改:

Declare @AuditTable Table (PK Int, OldID int, [NewID] Int)
Declare @OldID Int,
        @NewID Int

Declare C1 Cursor For
Select ID
From Inserted

Declare C2 Cursor For
Select ID
From Deleted

Open C1
Open C2
Fetch Next From C1 Into @NewID
Fetch Next From C2 Into @OldID
While @@FETCH_STATUS=0 Begin
    Insert Into @AuditTable(PK, OldID, [NewID]) 
    Values (@OldID, @OldID, @NewID)

    Fetch Next From C1 Into @NewID
    Fetch Next From C2 Into @OldID
End
Close C1
Close C2
Deallocate C1
Deallocate C2

Select * FRom @AuditTable

【讨论】:

  • INSERTEDDELETED 表中执行SELECT 时的行顺序总是与您似乎依赖的方式相对应。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-09
相关资源
最近更新 更多