【问题标题】:How to track data changes in a database table如何跟踪数据库表中的数据更改
【发布时间】:2023-03-18 08:17:01
【问题描述】:

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

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

【问题讨论】:

标签: database


【解决方案1】:

一般来说,如果您的应用程序是分层结构的,请让数据访问层调用数据库服务器上的存储过程来写入数据库更改的日志。

在支持这种事情的语言中,aspect-oriented programming 可能是一种用于此类应用程序的好技术。审计数据库表更改是您通常希望为所有操作记录的那种操作,因此 AOP 可以很好地工作。

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

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

【讨论】:

  • 如果您想让用户查看自己的历史记录或其他人的历史记录,他们似乎无法访问日志文件。
【解决方案2】:

您在这里遇到了一些彼此不相关的问题。

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

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

没有正确的方法可以做到这一点,您可能希望有一个单独的表,您的应用程序代码将在用户更新另一个表中的某些数据时插入一条记录,包括用户、时间戳和 id更改记录。

确保使用事务,这样您就不会在没有插入的情况下完成更新,或者如果您执行相反的顺序,您最终不会在没有更新的情况下插入。

【讨论】:

    【解决方案3】:

    我经常看到的一种方法是使用审计表。然后,您可以显示发生了什么变化、发生了什么变化以及从什么变化,或者任何您想要的内容:) 然后您可以编写一个触发器来进行实际的日志记录。如果操作得当,不会太痛苦...

    不过,无论您如何操作,这都取决于您的用户如何连接到数据库。他们是通过应用程序内的安全上下文使用单个应用程序用户,他们是使用自己在域上的帐户进行连接,还是应用程序只是让每个人都使用通用 sql 帐户进行连接?

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

    在应用程序内完成所有操作会使您对应用程序外部所做的更改有更多了解,但如果您有多个应用程序都使用相同的数据,并且您只是想看看您的应用程序进行了哪些更改,也许这就是你想要什么... 耸耸肩>

    祝你好运!

    --凯文

    【讨论】:

      【解决方案4】:

      在研究同样的问题时,我发现here 的讨论非常有用。它建议设置一个用于跟踪更改的并行表,其中每个更改跟踪表都具有与其跟踪的相同的列,以及更改它的人员、时间以及是否被删除的列。 (通过使用预先存在的脚本的正则表达式版本,应该可以或多或少地自动生成模式。)

      【讨论】:

      • 截至 2021 年 12 月 31 日的链接似乎指向了一篇跑题的博文。
      【解决方案5】:

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

      1. 创建 person_log 表

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

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

        在 dbo.Person 上创建触发器 tr
        更新
        作为 insert into person_log(date, sid) select updatedDTTM, PersonSID from insert

      任何更新后,查询 person_log 表,您将能够看到 personSid 已更新。 插入、删除也可以这样做。

      以上示例适用于 SQL,如有任何疑问,请告诉我或使用此链接: http://www.4guysfromrolla.com/webtech/042507-1.shtml

      【讨论】:

        【解决方案6】:

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

        您是否也想要撤消更改 - 也许预先创建撤消语句(每个 INSERT 的 DELETE,每个正常 UPDATE 的 (un-) UPDATE)并将其保存在跟踪中?

        【讨论】:

          【解决方案7】:

          让我们试试这个开源组件:

          https://tabledependency.codeplex.com/

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

          【讨论】:

            【解决方案8】:

            如果所有更改都来自 php.ini。您可以在查询前使用class 记录每次插入/更新/删除。它将保存 action、table、column >、newValue、oldValue、日期、 系统(如果需要)、ip、UserAgent >、clumnReference、operatorReference、valueReference。所有需要记录的表/列/操作都是可配置的。

            【讨论】:

              猜你喜欢
              • 2021-05-16
              • 1970-01-01
              • 2018-07-07
              • 2011-08-09
              • 1970-01-01
              • 1970-01-01
              • 2015-02-27
              • 2011-09-30
              • 2011-08-15
              相关资源
              最近更新 更多