【问题标题】:Better approaches to maintain audit for tables in a database维护数据库中表审计的更好方法
【发布时间】:2013-11-09 18:57:48
【问题描述】:

我们有一个使用变更数据捕获 (CDC) 功能的生产数据库来维护少数表的审计数据。但是由于性能影响以及需要对数据库结构进行更改(例如添加索引),但由于 CDC 无法做到这一点,我们现在想要禁用 CDC。

要求是从 Web 应用程序中为单个审计表中的一组表捕获所有插入、删除和更新操作。 举个例子,我必须在 TableB 中维护 TableA 的审核信息,以便通过 Web 应用程序 [in C#] 对 TableA 进行的每个 Add、Update 和 Remove 操作。

我目前正在更新每个存储过程,这可能会导致集合中每个表的这 3 个操作中的任何一个。但它太容易出错并且太费时了,因为我有大量的表格。

请提供一种更好的方法,在时间和性能方面都可以更有效地实现这一目标。

【问题讨论】:

  • 捕获所有插入、删除和更新操作意味着触发器。采纳意见:weblogs.asp.net/jgalloway/archive/2008/01/27/…
  • 我不认为我可以使用触发器,因为还有批处理过程也会更新这些表,我们不想通过它们来审计信息。只有通过 Web 应用程序执行的操作才需要进行审核。
  • 我不了解 CDC,但可能在表中插入/更新/删除后使用存储库模式或工作单元(在 webapp 中),您可以插入审计表中,或者您可以在表的插入/更新/删除之后使用AOP,并且可以异步(后台任务)并且不会阻塞webapp请求的“流”...
  • 然后执行另一个插入命令,每当用户在您的网页上使用影响您的数据库的控件时,该命令将数据插入到您的审计表中。 IE:你有一个按钮可以保存用户所做的更改。执行完更新命令后,对您拥有的审计表运行另一个插入命令。
  • 在这种情况下,我投票结束您的问题。我们还没有通过 X 射线查看您的 C# 应用程序内部结构:它使用存储过程来管理数据?它使用EF?阿多?数据库上下文?你的 CRUD 模式是什么?等

标签: c# sql-server-2008 audit


【解决方案1】:

快速回答:只需确保记录所有会更改 DATABASE 的操作!

在我们的项目中,我们创建了一个单独的表,其中包含以下字段

   Date_And_Time     Actions     UserID     Part_of_Program

每当用户执行插入、更新或删除命令,或登录或退出系统,或系统在我们的数据库中运行自动操作时,程序会自动在此处插入一条记录,告诉我们采取了哪些操作,谁做的以及该计划的哪一部分受到了影响。

..或者 您可以编写代码来不断检查表的当前大小。如果大小发生变化,则将其记录在审计表中。 如果大小增加,则插入数据。否则数据被删除。

【讨论】:

  • OP 没有询问如何设计他的审计表,他需要建议如何捕获所有相关事件(即从他的 Web 应用程序中更新、插入、删除)。
  • 好吧,这些事件不是在用户使用系统上的控件时触发的吗?然后让他执行另一个命令,只要控件在他的 web 应用程序上执行相关事件,就会将数据插入到他的审计表中。
  • 他在评论中写道,他不能使用触发器,因为它们运行他们不想在审计表中看到的批处理操作。
  • 如果是运行这些批处理的控件/触发器,则不要执行对 Audit 表的插入。
  • 在这种情况下,我投票结束您的问题。我们还没有通过 X 射线查看您的 C# 应用程序内部结构:它使用存储过程来管理数据?它使用EF?阿多?数据库上下文?你的 CRUD 模式是什么?等
猜你喜欢
  • 2016-11-26
  • 1970-01-01
  • 1970-01-01
  • 2010-12-14
  • 2012-10-15
  • 2017-01-09
  • 1970-01-01
  • 1970-01-01
  • 2022-01-01
相关资源
最近更新 更多