2012-06-03 38 views
2

假设我有一列有一列(是主键),并且我在该表上有触发器以记录任何更改。现在,当更新一个行(主键)在删除我有旧的主要价值,并在插入我有新的主要价值。在多行更新中,我怎样才能将旧值(在删除)绑定到新值(在插入)?插入和删除关于可更改主键的触发器(SQL Server)

例如:

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 no。

+0

你可以看看[本SO文章(http://stackoverflow.com/questions/6629283/sql-trigger-on-update-of-主键-如何到确定 - 这缺失记录-C)。 –

+0

SQL Server没有行触发器,也没有在'inserted','deleted'表中提供任何类型的逻辑行标识符,可以用来代替PK来加入,所以除了这个之外没有办法做到这一点@ gbn在链接问题中的答案。 –

+0

如果你可以改变你看PK变化的方式。将它们记录为删除和插入。 –

回答

-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 
+1

从'INSERTED'和'DELETED'表执行'SELECT'时,行的顺序不会总是与您似乎要处理的方式一致。 –