【问题标题】:How to log changes made by users of a system? [closed]如何记录系统用户所做的更改? [关闭]
【发布时间】:2013-10-04 00:52:45
【问题描述】:

我有一个系统(c#/asp.net/sqlserver),用户可以在其中登录和管理商店的产品。我需要登录数据库用户对产品所做的每一次更改。例如:

Product A
Inserted by USER1 on 10/03/2013 10:00
Description changed to "Product AA" by USER2 on on 10/03/2013 12:00

实际上我有一个 PRODUCT_LOG 表,它与 PRODUCT 表类似,每次更改 PRODUCT 上的某些记录时,都会将记录插入到 PRODUCT_LOG 中。这样,我可以将“可读”日志返回给系统管理员(如上)。

但是,我在维护日志上的 FK 时遇到了一个大问题,经过一段时间的日志记录,许多寄存器不会从系统中删除,因为它们在日志表中被引用为 FK。 :(

我想问是否有其他选项或更好的方法来生成这种类型的日志。 如果您知道方法的名称,请告诉我,以便我可以通过 Google 搜索。

【问题讨论】:

标签: c# asp.net sql-server logging


【解决方案1】:

删除 FK 约束,然后它会工作。你想要的被称为“审计表”,它们不需要参照完整性,因为它们是不可变的 - 一旦编写并且永远存在,因此将它们包含在 JOIN 中没有意义其他表。

【讨论】:

    【解决方案2】:

    引用完整性(外键消失)是数据库保留的此类日志的问题之一。但是您也可以将表添加到您的架构中,您可以在其中从 FK 表中移动“已删除”的行。然后,您使用“活动”外键表和“已删除”外键表的并集计算日志表上的连接。砰@!没有缺少 FK。

    或者您可以对日志文件中的数据进行非规范化(将 FK 链接字段扩展到日志文件中的数据列)。是的,这需要更多空间,但可以节省查询时间并记录事件发生时出现的信息。

    【讨论】:

    • 这也将使审计实际上成为可能,如果您对日志条目 #5 感兴趣,而有人在日志条目 #1958 中更改了相同的产品怎么办?如果您允许修改 PRODUCT 表并将您的 PRODUCT_LOG 表链接到它,您将很难尝试将产品追溯到它的确切状态。
    猜你喜欢
    • 2023-02-07
    • 2020-12-13
    • 1970-01-01
    • 2014-04-24
    • 1970-01-01
    • 1970-01-01
    • 2011-04-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多