查看更新语句后更改的值

时间:2011-09-29 14:58:42

标签: sql-server-2008 transaction-log

只是想知道在发生更新命令之后是否可以查看更新命令的更改?

事务日志会存储此类信息,即这是先前/当前值这是新值/更改值

不确定这是否可行。服务器是ms sql 2008

2 个答案:

答案 0 :(得分:0)

您可以使用OUTPUT将更改插入另一个表和/或返回更改的结果集:

set nocount on
DECLARE @Table     table (PK int, col1 varchar(5))
DECLARE @SavedPks  table (PK int)

INSERT INTO @Table VALUES (1,'g')
INSERT INTO @Table VALUES (2,'g')
INSERT INTO @Table VALUES (3,'g')
INSERT INTO @Table VALUES (4,'g')
INSERT INTO @Table VALUES (5,'x')
INSERT INTO @Table VALUES (6,'x')
set nocount off

UPDATE @Table
    SET col1='xyz'
    OUTPUT INSERTED.PK INTO @SavedPks --save in a table
    OUTPUT 'result set',INSERTED.PK, INSERTED.col1 AS new_col1, DELETED.col1 AS old_Col1 --result set
    WHERE col1='g'

select * from @Table
select * from @SavedPks

输出:

           PK          new_col1 old_Col1
---------- ----------- -------- --------
result set 1           xyz      g
result set 2           xyz      g
result set 3           xyz      g
result set 4           xyz      g

(4 row(s) affected)

PK          col1
----------- -----
1           xyz
2           xyz
3           xyz
4           xyz
5           x
6           x

(6 row(s) affected)

PK
-----------
1
2
3
4

答案 1 :(得分:0)

事务日志确实包含了这些信息,虽然对它进行解码并不是一件容易的事情 - 我写了一篇博客文章,其中包含了在事务日志中解码简单更新语句的示例 - http://sqlfascination.com/2010/02/21/decoding-a-simple-update-statement-within-the-transaction-log/

但是,根据正在执行的更新,日志中的条目变得更加复杂,并且没有关于如何解码它们的文档。对它们进行逆向工程非常困难。

我永远不会建议使用这种检查日志的技术来检索数据,只能从内部学习视角/取证角度进行研究。