如何跟踪数据库表中的数据更改

如何跟踪数据库表中的数据更改

How to track data changes in a database table

跟踪数据库表中更改的最佳方法是什么?

假设您有一个应用程序,在该应用程序中,用户(在应用程序的上下文中,不是DB用户)可以更改存储在某些数据库表中的数据。 跟踪所有更改历史的最佳方法是什么,以便您可以显示哪个用户在什么时间更改哪些数据?


通常,如果您的应用程序是分层的,则让数据访问层在数据库服务器上调用存储过程以写入数据库更改日志。

在支持此类事物的语言中,面向方面的编程可能是用于此类应用程序的好技术。审计数据库表更改是您通常希望针对所有操作进行记录的一种操作,因此AOP可以很好地工作。

请记住,记录数据库更改会创建大量数据,并且会降低系统速度。根据应用程序的大小,使用消息队列解决方案和单独的数据库来执行审核日志可能是明智的。

使用存储过程来处理此问题也是完全可行的,尽管可能需要进行一些工作才能将用户凭据传递到数据库本身。


我经常看到的一种方法是拥有审计表。然后,您可以显示更改的内容,更改的内容以及更改的内容,或者您??衷心希望的任何内容:)然后,您可以编写触发器进行实际记录。如果做得好,不会太痛苦...

但是,无论您如何执行,都取决于用户如何连接到数据库。他们是通过应用程序内的安全上下文使用单个应用程序用户,还是使用自己在域上的帐户进行连接,或者应用程序仅使每个人都使用通用的sql-account连接?

如果您无法从数据库连接中获取用户信息,那会有些麻烦。然后,您可能会考虑在应用程序内进行日志记录,因此,如果您有一个名为" CreateOrder"的流程或其他内容,则可以登录到Order_Audit表或其他内容。

在应用程序内完成所有操作可以使您从应用程序外部进行的更改更多一些,但是如果您有多个应用程序都使用相同的数据,而您只是想查看自己所做的更改,也许就是您想要的... <耸耸肩>

不过,祝您好运!

-凯文


在研究这个问题时,我发现这里的讨论非常有用。它建议设置一个用于跟踪更改的并行表,其中每个更改跟踪表都具有与其跟踪的列相同的列,以及有关更改者,更改时间和删除时间的列。 (应该可以通过使用预先存在的脚本的重新版本来自动为此生成模式。)


您这里有一些彼此之间关系不佳的问题。

在基本数据库级别,您可以通过拥有一个单独的表来跟踪更改,该表通过INSERT / UPDATE / DELETE语句上的触发器将条目添加到表中。这就是跟踪数据库表更改的一般方法。

您想要做的另一件事是知道哪个用户进行了更改。通常,您的触发器不会知道这一点。我假设如果您想知道哪个用户更改了一条数据,那么多个用户可能会更改同一数据。

没有正确的方法,您可能希望有一个单独的表,只要用户更新另一个表中的某些数据(包括用户,时间戳和更改后的记录的ID),应用程序代码就会在其中插入一条记录。

确保使用事务,这样您就不会遇到没有插入而完成更新的情况,或者如果您执行相反的顺序,则不会导致没有更新而导致插入的情况。


假设我有一个包含10列的Person Table,其中包括PersonSid和UpdateDate。现在,我想跟踪人员表中的所有更新。
这是我使用的简单技术:

  • 创建一个person_log表

    创建表person_log(date datetime2,sid int);

  • 在Person表上创建一个触发器,该触发器将在Person表更新时将一行插入到person_log表中:

    在dbo.Person上创建触发器tr
    更新

    插入person_log(date,sid)中选择已更新的DTTM,PersonSID

  • 完成任何更新后,查询person_log表,您将能够看到已更新的personSid。
    与插入,删除操作相同。

    上面的示例是针对SQL的,如果有任何查询或使用此链接,请告知我:
    http://www.4guysfromrolla.com/webtech/042507-1.shtml


    在单独的表中的跟踪日志(带有ID列,可能带有时间戳)?

    您是否还要撤消更改-也许预先创建撤消语句(对每个INSERT操作删除一个,对每个普通UPDATE操作取消(取消)UPDATE)并将其保存在跟踪中?


    如果所有更改均来自php。您可以使用类在查询之前记录每个INSERT / UPDATE / DELETE。它将保存操作,表,列,newValue,oldValue,日期,系统(如果需要),ip,UserAgent,clumnReference,operatorReference,valueReference。所有需要记录的表/列/动作都是可配置的。


    让我们尝试使用此开源组件:

    https://tabledependency.codeplex.com/

    TableDependency是通用C#组件,用于在指定数据库表的内容更改时接收通知。


    推荐阅读