在SQL数据库中记录数据更改和用户活动的最佳方法是什么?

3
我正在开始一个新的应用程序,想知道最佳的日志记录方法。数据库中的某些表格需要记录每个更改和进行更改的用户。其他表格可能只需要记录上次修改时间。
在以前的应用程序中,我尝试了不同的方法来实现这一点,但想听听别人的做法。我尝试过以下几种方法: 1. 在表格中添加一个“modified”日期-时间字段,记录上次编辑的时间。 2. 添加一个仅用于记录主表更改的辅助表格。辅助表格中的每一行表示主表中的一个更改字段。因此,主表中的一个记录更新会在辅助表格中创建多条记录。 3. 添加一个类似于第2种但记录三四个表格中的编辑的表格,在附加字段中引用它所关联的表格。
你使用和推荐哪些方法?
此外,记录已删除数据的最佳方法是什么?我从不喜欢用户可以永久地从数据库中删除记录的想法,因此通常我会有一个布尔字段“已删除”,当其被删除时将更改为true,并且它将从模型级别的所有查询中过滤出来。还有其他建议吗?
最后一个问题:记录用户活动的最佳方法是什么?目前,我有一个表格记录登录/注销/密码更改等信息,根据动作,分配1、2、3等代码。
希望我没有在这个问题中塞太多东西。谢谢。

你应该了解一下“数据更改捕获”(CDC)。它是一个众所周知的数据库习语。http://technet.microsoft.com/en-us/library/bb522489(v=sql.105).aspx - duffymo
2
你使用哪个关系型数据库管理系统?很多时候,关系型数据库管理系统会提供工具来捕获更改。跟踪登录活动也是特定于供应商的事情。 - N West
@duffymo,这个方法会记录谁做出了更改吗?看起来它只记录了SQL查询,我认为还需要一些控制器代码来捕获这些信息。 - rsmith
也许吧。你几乎没有提供任何细节,所以我的回答并没有涉及到它们。深入挖掘一下吧。 - duffymo
2个回答

3

我知道这是一个非常老的问题,但我想添加更详细的答案,因为这是我在谷歌搜索数据库日志记录方面得到的第一个链接。

基本上有两种记录数据更改的方法:

  • 在应用程序服务器层
  • 在数据库层

如果可以,尽量使用服务器端日志记录。它更加清晰和灵活。

如果需要在数据库层记录日志,您可以使用触发器,就像@StanislavL所说的那样。但是触发器可能会减慢数据库性能,并限制您将更改日志存储在同一数据库中的能力。

另外,您可以查看事务日志监视。 例如,在PostgreSQL中,您可以使用逻辑复制机制以json格式从您的数据库流式传输更改到任何地方。

在单独的服务中,您可以以任何形式和任何数据库(例如,只需将收到的json放入Mongo)接收、处理和记录更改。


1
您可以为任何已跟踪的表添加触发器以侦听插入/更新/删除操作。在触发器中,只需检查新旧值并将它们写入具有列的特殊表中。
table_name
entity_id
modification_time
previous_value
new_value
user

很难确定是哪个用户进行了更改,但如果在监听的表中添加changed_by列,则有可能确定。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接