跟踪数据库表更改的最佳方法是什么?
想象一下,您有一个应用程序,其中用户(在应用程序的上下文中不是 DB 用户)能够更改存储在某个数据库表中的数据。跟踪所有更改历史的最佳方法是什么,以便您可以显示哪个用户在什么时间更改了哪些数据?
跟踪数据库表更改的最佳方法是什么?
想象一下,您有一个应用程序,其中用户(在应用程序的上下文中不是 DB 用户)能够更改存储在某个数据库表中的数据。跟踪所有更改历史的最佳方法是什么,以便您可以显示哪个用户在什么时间更改了哪些数据?
通常,如果您的应用程序被结构化为层,请让数据访问层调用数据库服务器上的存储过程来写入数据库更改的日志。
在支持这种事物的语言中,面向方面的编程可能是一种用于此类应用程序的好技术。审计数据库表更改是您通常希望为所有操作记录的那种操作,因此 AOP 可以很好地工作。
请记住,记录数据库更改将创建大量数据并降低系统速度。根据应用程序的大小,使用消息队列解决方案和单独的数据库来执行审计日志可能是明智的。
使用存储过程来处理它也是完全可行的,尽管可能需要一些工作涉及将用户凭据传递到数据库本身。
您在这里遇到了一些彼此不相关的问题。
在基本数据库级别,您可以通过拥有一个单独的表来跟踪更改,该表通过 INSERT/UPDATE/DELETE 语句上的触发器添加一个条目。这是跟踪数据库表更改的一般方法。
您想要的另一件事是知道哪个用户进行了更改。通常,您的触发器不会知道这一点。我假设如果您想知道哪个用户更改了一条数据,那么多个用户可能会更改相同的数据。
没有正确的方法可以做到这一点,您可能希望有一个单独的表,每当用户更新另一个表中的某些数据时,您的应用程序代码将插入一条记录,包括更改记录的用户、时间戳和 id。
确保使用事务,这样您就不会在没有插入的情况下完成更新,或者如果您执行相反的顺序,您最终不会在没有更新的情况下插入。
我经常看到的一种方法是使用审计表。然后,您可以显示发生了什么变化、发生了什么变化以及从什么变化,或者任何您想要的内容:) 然后您可以编写一个触发器来进行实际的日志记录。如果操作得当,不会太痛苦...
但是,无论您如何操作,这都取决于您的用户如何连接到数据库。他们是通过应用程序内的安全上下文使用单个应用程序用户,他们是使用域上自己的帐户进行连接,还是应用程序只是让每个人都使用通用 sql 帐户连接?
如果您无法从数据库连接中获取用户信息,那就有点痛苦了。然后您可能会考虑在应用程序中进行日志记录,因此如果您有一个名为“CreateOrder”或其他的进程,您可以登录到 Order_Audit 表或其他任何内容。
在应用程序内完成这一切会使您对应用程序外部所做的更改有更多了解,但如果您有多个应用程序都使用相同的数据,并且您只是想看看您所做的更改,也许这就是您想要的... <耸耸肩>
不过,祝你好运!
——凯文
在研究同样的问题时,我发现这里的讨论非常有用。它建议设置一个用于跟踪更改的并行表,其中每个更改跟踪表都具有与其跟踪的相同的列,以及更改它的人员、时间以及是否被删除的列。(应该可以通过使用预先存在的脚本的正则表达式版本或多或少地自动生成模式。)
假设我有一个包含 PersonSid 和 UpdateDate 的 10 列的人员表。现在,我想跟踪 Person Table 中的任何更新。这是我使用的简单技术:
创建 person_log 表
创建表 person_log(date datetime2, sid int);
在 Person 表上创建一个触发器,该触发器将在 Person 表更新时向 person_log 表中插入一行:
在 dbo.Person 上创建触发器 tr 以
进行更新
,因为插入到 person_log(date, sid) 中选择 updatedDTTM,PersonSID 从插入
任何更新后,查询 person_log 表,您将能够看到更新的 personSid。你可以对插入、删除做同样的事情。
以上示例适用于 SQL,如有任何疑问,请告诉我或使用此链接: http ://www.4guysfromrolla.com/webtech/042507-1.shtml
单独表中的跟踪日志(带有 ID 列,可能带有时间戳)?
您是否也想要撤消更改 - 也许预先创建撤消语句(每个 INSERT 的 DELETE,每个正常 UPDATE 的(un-)UPDATE)并将其保存在跟踪中?
让我们试试这个开源组件:
https://tabledependency.codeplex.com/
TableDependency 是一个通用 C# 组件,用于在指定数据库表的内容发生更改时接收通知。
如果一切都从 php. 您可以在查询之前使用类记录 evry INSERT/UPDATE/DELETE。它将是 save action、table、column、newValue、oldValue、date、system(如果需要)、ip、UserAgent、clumnReference、operatorReference、valueReference。所有需要记录的表/列/操作都是可配置的。