【问题标题】:MS SQL AuditingMS SQL 审计
【发布时间】:2009-01-08 18:40:24
【问题描述】:

我在工作中遇到了数据库问题。目前有审计,但它笨重,需要大量维护,并且在某些方面存在不足。所以我要替换它。

我希望以尽可能通用的方式完成此操作,并设计了表格,以及所有内容的链接和更新方式。

现在,这一切都很好,但我希望能够编写一种通用方法将记录插入这些审计表。 (无需为正在更改的每个表中的每一列输入命令。)

在存储过程中是否有遍历表中所有列的方法?而且我想以这样的方式编写它,它可以与多个表一起使用,并自动拾取和审核添加的列等。

有什么想法吗?

编辑:我想我应该澄清一下。我将审核表中的数据。但我将使用相同的表来存储数据库中每个表的审计数据。

而且我不能使用触发器,因为通常,当更新发生时,它会发生在多个表中,但我希望所有这些更新都成为单个变更集的一部分。

这不是问题,因为我可以在单个存储过程中进行所有更新。我更喜欢循环之类的方式,我可以获取所有更新的字段,找出哪些已更改,并将这些更改的字段插入到审计表中。

而且我想在没有长长的 if 语句列表和每列的 insert 语句的情况下执行此操作。 (通过在通用循环中执行此操作,它将自动处理添加的列,而不会被删除的列打扰)

【问题讨论】:

    标签: sql-server stored-procedures auditing


    【解决方案1】:

    通过“添加的列”,我猜您正在寻找审核 DDL。如果您使用 SQL 2005,那么您需要this link

    如果不使用 SQL 2005,那么您可能想要使用众多 SQL 模式比较工具之一,例如 SQL Red Gates 工具集,其中可能有一些东西。

    如果您没有用于工具的 $,那么您可能只想对 information_schema.tables 和 information_schema.columns 运行定期查询。通过在永久表中定期捕获这些,您可以确定它们何时获得或丢失行(因此发生架构更改)

    如果您改为进行数据审计,那么您需要编写代码生成一些触发器,再次使用 information_schema.tables 和 information_schema.columns。

    【讨论】:

      【解决方案2】:

      会有性能考虑,但您可以将插入和更新触发器添加到所有表中,并将触发器插入到您的审计表中。

      【讨论】:

      • 我宁愿不必这样做,因为那样我就必须提前知道每一列。我希望这个系统能够自动拾取新列,并在没有任何干预的情况下忽略已删除的列。我想从存储过程中做所有事情。
      • 我可以理解想要通过 procs 做所有事情,但是使用 COLUMNS_UPDATED ( ) 您应该能够在不知道表中有哪些列的情况下确定更新了哪些列。
      【解决方案3】:
      【解决方案4】:

      如果您使用的数据访问层可以捕获正在更新的表和列并为审计表生成插入语句,则可以做到这一点。在存储过程中?哪个存储过程?你有一个可以更新的吗?还是您要为每张桌子创建一个?

      【讨论】:

      • 每“一组”更新将是一个存储过程。而且我更愿意在数据端执行此操作,因为多个应用程序访问这些数据。
      【解决方案5】:

      如果您愿意,只需升级到 sql server 2008 并打开更改数据捕获。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-08
        • 2017-02-13
        相关资源
        最近更新 更多