我的公司正在从分布式 Access 数据库模型转变为使用集中式 SQL 数据库。数据表的设计使得所有表都有修改日期。在讨论中有人建议,因为我们将在每个表上创建一个触发器来处理修改日期,也许我们应该让触发器也将一些信息记录到审计表中。
这是设置审计的最佳方式以便我们可以跟踪谁在更改信息还是有更好的方式?欢迎链接到有关该主题的文章。
对于审计,我正在寻找捕获表名、列名、修改日期、行 ID 和进行更改的人的用户名。是否有任何我没有想到的信息应该被捕获,以帮助我避免未来的陷阱?
我的公司正在从分布式 Access 数据库模型转变为使用集中式 SQL 数据库。数据表的设计使得所有表都有修改日期。在讨论中有人建议,因为我们将在每个表上创建一个触发器来处理修改日期,也许我们应该让触发器也将一些信息记录到审计表中。
这是设置审计的最佳方式以便我们可以跟踪谁在更改信息还是有更好的方式?欢迎链接到有关该主题的文章。
对于审计,我正在寻找捕获表名、列名、修改日期、行 ID 和进行更改的人的用户名。是否有任何我没有想到的信息应该被捕获,以帮助我避免未来的陷阱?
不要费心在每个字段的基础上跟踪审计数据。拥有一个与主表具有相同结构并在表上跟踪时间戳和用户信息的审计表要容易得多。
这种架构有几个优点:
审计信息应至少包括:创建/更改记录的用户、创建/更改的日期/时间、更改的性质(插入、更新、删除)。如果您可以选择这样做,您可能希望使用逻辑删除(即“已删除”标志)。否则,您需要从会话中捕获用户和日期/时间并将它们放在删除记录中,可能连同记录的最后状态。如果这在连接中不可用(通常是在 N 层应用程序中用户未在数据库级别被模拟的情况),那么您需要找到其他方法来获取它。
如果您使用的是 SQL Server 2008 Enterprise Edition 或更新版本,您还可以考虑使用Change Data Capture,它:
遗憾的是,CDC 无法作为替代品。
CDC 在捕获数据变化时不包括 WHO;只有什么和什么时候。如果您不需要知道是谁做出了改变,那么 CDC 将发挥作用,但如果 WHO 与什么和什么时候一样重要,那么可悲的是,CDC 达不到要求;很短。
您可以通过审计触发器执行此操作,审计触发器提供审计数据更改作为对以下问题的回答:
这意味着当触发触发器时,所有这些信息都必须从数据库或 SQL Server 实例中收集并存储在审计存储库中。例如,当记录插入 Currency.Sales 表时触发触发器是使用以下 SQL
然后,触发器必须插入执行 INSERT 的计算机名、插入记录的人的用户名和用于插入记录的应用程序的名称。触发器利用内置的 SQL Server 函数来获取这些值:
这些值存储在用作审计数据存储库的预定义表中