将表中所有字段的日志更改记录到另一个表(SQL Server 2005)

时间:2008-12-15 22:57:35

标签: sql sql-server sql-server-2005 tsql

我想将对表中所有字段所做的更改记录到另一个表中。这将用于保存对该表所做的所有更改的历史记录(您的基本更改日志表)。

在SQL Server 2005中执行此操作的最佳方法是什么?

我将假设逻辑将放在一些触发器中。

在没有对所有字段进行硬编码的情况下,循环检查所有字段的好方法是什么?

正如您从我的问题中看到的那样,示例代码将非常受欢迎。

我注意到SQL Server 2008有一个名为Change Data Capture(CDC)的新功能。 (这是CDC上的一个很好的Channel9视频)。这与我们正在寻找的类似,除了我们使用的是SQL Server 2005,已经就地存在日志表布局,并且还记录了进行更改的用户。当一个字段可能改变时,我也发现很难证明写出整个记录的前后图像是合理的。

我们当前的日志文件结构有一个字段名称,旧数据,新数据列。

提前致谢,祝你有愉快的一天。

2008年12月22日更新:我做了更多研究,并在Live Search QnA上找到了这两个答案

  1. 您可以创建触发器来执行此操作。看到 How do I audit changes to sq​l server data

  2. 您可以使用触发器将数据更改记录到日志表中。您还可以从www.lumigent.com购买日志资源管理器,并使用它来读取事务日志以查看用户进行了更改。但是,数据库需要完全恢复此选项。

  3. 更新于12/23/08:我还想要一个简洁的方法来比较改变的内容,这看起来像是PIVOT的反面,我在SQL中发现它叫做UNPIVOT。我现在倾向于在INSERTED和DELETED表上使用UNPIVOT触发器。我很好奇这是否已经完成,所以我正在搜索“unpivot deleted inserted”。

    1. 发布Using update function from an after trigger有一些不同的想法,但我仍然相信UNPIVOT将成为可行的路线。

3 个答案:

答案 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完全相同,但它是免费的。

它可以使用用户,操作和时间的记录信息查看任何表中每行的历史记录。

您可以撤消到任何版本的行,而无需将数据库设置为恢复模式。