C# 如何记录系统用户所做的更改?

C# 如何记录系统用户所做的更改?,c#,asp.net,sql-server,logging,C#,Asp.net,Sql Server,Logging,我有一个系统(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上的某些记录时,都会将该记录插入P

我有一个系统(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时遇到了一个大问题,在记录一段时间后,许多寄存器将不会从系统中删除,因为它们在日志表中被引用为FKs:(

我会问,是否有其他选项或更好的方法来生成此类日志。
如果您知道这些方法的名称,请告诉我,这样我就可以在谷歌上搜索它。

删除FK约束,然后它就可以工作了。您需要的是所谓的“审核表”而且它们不需要引用完整性,因为它们一旦被写入就应该是不可变的,并且是永久的,所以将它们与其他表连接在一起是没有意义的。

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


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

这称为审核。与论坛网站不同,我们不使用“谢谢”或“感谢任何帮助”,或上的签名。请参阅”。这也将使审核成为可能,如果您对日志条目#5感兴趣,而有人在日志条目#1958中更改了相同的产品,该怎么办?如果您允许修改产品表并将您的产品#日志表链接到它,您将很难尝试将产品追溯到其确切的状态。