我想将对表中所有字段所做的更改记录到另一个表中。这将用于保存对该表所做的所有更改的历史记录(您的基本更改日志表)。
在SQL Server 2005中执行此操作的最佳方法是什么?
我将假设逻辑将放在一些触发器中。
在没有对所有字段进行硬编码的情况下,循环检查所有字段的好方法是什么?
正如您从我的问题中看到的那样,示例代码将非常受欢迎。
我注意到SQL Server 2008有一个名为Change Data Capture(CDC)的新功能。 (这是CDC上的一个很好的Channel9视频)。这与我们正在寻找的类似,除了我们使用的是SQL Server 2005,已经就地存在日志表布局,并且还记录了进行更改的用户。当一个字段可能改变时,我也发现很难证明写出整个记录的前后图像是合理的。
我们当前的日志文件结构有一个字段名称,旧数据,新数据列。
提前致谢,祝你有愉快的一天。
2008年12月22日更新:我做了更多研究,并在Live Search QnA上找到了这两个答案
您可以创建触发器来执行此操作。看到 How do I audit changes to sql server data
您可以使用触发器将数据更改记录到日志表中。您还可以从www.lumigent.com购买日志资源管理器,并使用它来读取事务日志以查看用户进行了更改。但是,数据库需要完全恢复此选项。
更新于12/23/08:我还想要一个简洁的方法来比较改变的内容,这看起来像是PIVOT的反面,我在SQL中发现它叫做UNPIVOT。我现在倾向于在INSERTED和DELETED表上使用UNPIVOT触发器。我很好奇这是否已经完成,所以我正在搜索“unpivot deleted inserted”。
答案 0 :(得分:5)
很晚但希望它对其他读者有用......
以下是我上周在similar topic.
上发布的答案的修改简短的回答是,没有适合所有人的“正确”解决方案。这取决于要求和被审计的系统。
<强>触发器强>
Creating audit triggers in SQL Server
Log changes to database table with trigger
<强> CDC 强>
阅读交易记录
Read the log file (*.LDF) in sql server 2008
SQL Server Transaction Log Explorer/Analyzer
第三方工具
我使用过ApexSQL的几个审核工具,但也有来自Idera(合规经理)和Krell software(全方位审核)的好工具
ApexSQL Audit - 基于触发器的审核工具。生成并管理审计触发器
ApexSQL Log - 允许通过阅读事务日志进行审核
答案 1 :(得分:4)
在SQL '05下,您实际上不需要使用触发器。只需看看OUTPUT子句。 OUTPUT适用于插入,更新和删除。
例如:
INSERT INTO mytable(description, phone)
OUTPUT INSERTED.description, INSERTED.phone INTO #TempTable
VALUES('blah', '1231231234')
然后,您可以使用#TempTable执行任何操作,例如将这些记录插入日志记录表。
作为旁注,这是捕获身份字段值的一种非常简单的方法。
答案 2 :(得分:0)
您可以使用Log Rescue。它与Log Explorer完全相同,但它是免费的。
它可以使用用户,操作和时间的记录信息查看任何表中每行的历史记录。
您可以撤消到任何版本的行,而无需将数据库设置为恢复模式。