如何跟踪数据库表中的数据更改
跟踪数据库表中更改的最佳方法是什么?
假设我们有一个应用程序,在该应用程序中,用户(在应用程序的上下文中,不是DB用户)可以更改存储在某些数据库表中的数据。跟踪所有更改历史的最佳方法是什么,以便可以显示哪个用户在什么时间更改哪些数据?
解决方案
回答
我们这里有一些彼此之间关系不佳的问题。
在基本数据库级别,我们可以通过拥有一个单独的表来跟踪更改,该表通过INSERT / UPDATE / DELETE语句上的触发器将条目添加到表中。这就是跟踪数据库表更改的一般方法。
我们想要做的另一件事是知道哪个用户进行了更改。通常,触发器不会知道这一点。我假设,如果我们想知道哪个用户更改了一条数据,那么多个用户可能会更改同一数据。
没有正确的方法,我们可能希望有一个单独的表,每当用户更新另一个表中的某些数据(包括用户,时间戳和更改后的记录的ID)时,应用程序代码就会在该表中插入一条记录。
确保使用事务,这样我们就不会遇到没有插入而完成更新的情况,或者,如果我们执行相反的顺序,则不会导致没有更新而导致插入的情况。
回答
在单独表中的跟踪日志(带有ID列,可能带有时间戳)?
我们是否还想撤消更改,或者预先创建撤消语句(对每个INSERT操作删除,对每个常规UPDATE操作取消(取消)UPDATE)并将其保存在跟踪中?
回答
通常,如果应用程序是分层的,请让数据访问层在数据库服务器上调用存储过程以写入数据库更改日志。
在支持此类事物的语言中,面向方面的编程可能是用于此类应用程序的好技术。审计数据库表更改是我们通常希望针对所有操作进行记录的一种操作,因此AOP可以很好地工作。
请记住,记录数据库更改会创建大量数据,并且会降低系统速度。根据应用程序的大小,使用消息队列解决方案和单独的数据库来执行审核日志可能是明智的。
使用存储过程来处理此问题也是完全可行的,尽管可能需要进行一些工作才能将用户凭据传递到数据库本身。
回答
我经常看到的一种方法是拥有审计表。然后,我们可以显示更改的内容,更改的内容以及更改的内容,或者我们心中所想的任何事情:)然后,我们可以编写触发器来进行实际的日志记录。如果做得好,不会太痛苦...
但是,不管我们如何执行,这都取决于用户如何连接到数据库。他们是通过应用程序内的安全上下文使用单个应用程序用户,还是使用自己在域上的帐户进行连接,或者应用程序只是让每个人都使用通用的sql-account连接?
如果我们无法从数据库连接中获取用户信息,那会有些麻烦。然后,我们可能会考虑在应用程序内进行日志记录,因此,如果我们有一个名为" CreateOrder"的流程或者任何其他内容,则可以登录到Order_Audit表或者任何其他内容。
在应用程序内完成所有操作可以使我们从应用程序外部进行的更改更多一些,但是如果我们有多个应用程序都使用相同的数据,而我们只是想查看自己所做的更改,也许就是我们想要的... <耸耸肩>
不过,祝我们好运!
-凯文