设计一种审计表更改的方法

Posted

技术标签:

【中文标题】设计一种审计表更改的方法【英文标题】:Designing a way to audit changes to tables 【发布时间】:2015-08-25 21:49:27 【问题描述】:

我希望能够审核在 db 表上执行的活动(更新、插入等)。设计这个最有效的方法是什么?我想到的一种解决方案是为每个表创建一个审计表,并在使用新值更新表之前使用 SQL 触发器插入前一个值。

【问题讨论】:

如果您需要保留历史记录,更好的方法是“软删除”。关键是您永远不会更新也永远不会删除记录,而是插入新记录并将旧记录标记为已删除(使用 datetime2 保持删除日期)。 触发器是实现数据审计的传统标准方式,恕我直言,触发器是少数几个正确的用例之一。但是,在 SQL Server 的更高版本中,还有多种管理工具可以执行此操作,这些工具可能更可取,特别是“数据库审核”功能。见这里:msdn.microsoft.com/en-us/cc280386.aspx 如果您已经创建了自己的触发器,“使用 SQL 触发器在使用新值更新表之前插入先前的值。”那么为什么不使用它们呢?顺便说一句,触发器是很好的工具,但需要非常小心地使用它们。在某些情况下,它们可能会显着降低性能。 SQL Server 不包括内置的 BEFORE 触发器,而只有 AFTER 和 INSTEAD OF 触发器(我说的是 DML 触发器,因为还有其他类型)。因此,如果你想实现 BEFORE 触发器,那么你可以使用触发器的 INSTEAD。 CodeSmith 非常适合创建所有这些触发器和历史表。 【参考方案1】:

SQL Server 2008 版包含一个内置选项,可满足您的需求。它命名为 CDC 或变更数据捕获。您可以在第一个链接中的 BOL(正式在线预订)中或从第二个链接中的博客中获取更多信息:

https://technet.microsoft.com/en-us/library/bb522489(v=sql.105).aspx https://www.simple-talk.com/sql/learn-sql-server/introduction-to-change-data-capture-(cdc)-in-sql-server-2008/

您还可以使用其他选项。但为了为您选择最佳选项,我们需要有关您的系统的更多信息。如果(1)您可以描述您的系统架构,以及(2)您希望在审计中存储哪些信息(您需要用户名还是只审计自己的数据),(3)您需要保留历史记录或仅获取事件,(4)这是临时需求还是数据库结构的一部分(CDC 将创建触发器等元素,不适合临时审计,为此您最好使用扩展事件或分析器)。 CDC 是审计数据更改的非常好的选择,如果它符合您的需要。

【讨论】:

我同意你的编辑@Ubaidullah Khan,但我认为这实际上是一个错误:-(。你只是从我的回答中删除了开头的“Good Day”,我认为开始没有任何问题礼貌用“Good day”祝福。我是新来的。注册很久了,但几乎没来过将此添加到我支持的论坛列表中。无论我以何种方式收到有关您的编辑的消息并刚刚批准它:-) 这并没有什么问题(在我看来),但它不是很“*** 精神”...read this 是否需要enterprice版本才能使用Change Data Capture? 是的@Ian Ringrose,它只是企业企业:msdn.microsoft.com/en-us/library/cc645993(en-us,SQL.100).aspx @zohar-peled,好吧.. 正如我所说,如果网站方法适合我,我需要做出决定。此时,乍一看,这不像是。这时候我感觉这是问答界面(只有问答和最终答案才重要),这不符合我只帮助想学习的人的方法。【参考方案2】:

对于应用程序方面,如果您仍处于设计阶段,我会查看 ORM 来帮助您解决此问题。我会尽可能地查看和限制有权访问原始数据表的用户。

Nhibernate Versioning Entity Framework Audit Log

仅供参考,根据您的情况,这可能处于过高的水平,因为您可能希望密切关注某人使用任何工具在数据库中所做的每一项更改。

【讨论】:

这是监控数据的非常糟糕的选择,因为您无法控制在应用程序之外更改的数据。 几年前,我为一家使用复杂的公司服务CMS 应用程序。首席执行官确信他了解自己在做什么,并且不时直接从服务器中删除数据。它导致应用程序崩溃(他总是撒谎并说他没有做任何事情)。一旦我在数据库级别添加了一些限制,就不会再发生这种情况了:-) 如果您想监控应用程序,这适合:-) @RonenAriely 这就是为什么我将 FYI 部分包含在底部的原因。这实际上取决于有多少愚蠢的人对数据的访问权限太深。 :-D @jbg:“今天的编程是软件工程师努力构建更大更好的防白痴程序与宇宙试图产生更大更好的白痴之间的竞赛。到目前为止,宇宙正在获胜。 " Rick Cook @ZoharPeled LOL,非常真实【参考方案3】:

SQL Server,从 2008 版开始,还包括 SQL Server Audit。有一些数据库级别的审计操作使您能够审计对表的这些操作。 (请注意,数据库级审计仅适用于 Enterprise 和 Developer 版本。请参阅 SQL Server Audit Support in Different Editions and Versions 上的博客。)

【讨论】:

以上是关于设计一种审计表更改的方法的主要内容,如果未能解决你的问题,请参考以下文章

关于捕获审计跟踪的数据库设计的想法[关闭]

LinqToSQL 和审计更改的字段

数据库表设计后不允许保存更改

审计日志的数据库设计[关闭]

为 MySQL 表实现审计

发票、发票行和修订的数据库设计