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

时间:2013-08-09 11:37:21

标签: sql database logging

我正在开始一个新的应用程序,并想知道最好的日志记录方法是什么。数据库中的某些表需要记录每个更改,以及进行更改的用户。其他表可能只需要记录最后修改时间。

在以前的应用程序中,我使用了不同的方法来做到这一点,但希望听到别人做过的事情。

我尝试了以下内容:

  1. 在表格中添加“已修改”的日期时间字段,以记录上次编辑的时间。
  2. 添加辅助表仅用于记录主表中的更改。辅助表中的每一行代表主表中的已更改字段。因此,主数据库中的一个记录更新可以在辅助表中创建多个记录。
  3. 添加一个类似于no.2的表格,但它会在三个或四个表格中记录编辑内容,并在附加字段中引用与之相关的表格。
  4. 您使用哪种方法并建议使用?

    记录删除数据的最佳方法是什么?我从不喜欢用户可以永久删除数据库中的记录的想法,所以通常我有一个布尔字段'已删除',当删除它时会更改为true,然后它将从模型级别的所有查询中过滤掉。还有其他任何建议吗?

    最后一个..记录用户活动的最佳方法是什么?目前我有一个表记录登录/注销/密码更改等,并根据操作的不同,给它一个代码1,2,3等。

    希望我没有在这个问题上挤满太多。感谢。

2 个答案:

答案 0 :(得分:1)

我知道这是一个非常老的问题,但是我想添加更详细的答案,因为这是我第一次搜索有关数据库日志的链接。

基本上有两种记录数据更改的方法:
-在服务器层上
-在数据库层上

如果可以的话,只需在服务器端使用登录即可。它更加清晰和灵活。

如果您需要登录数据库层,则可以使用触发器,如@StanislavL所说。但是触发器会降低数据库性能,并限制您将更改日志存储在同一数据库中。

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

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

答案 1 :(得分:0)

您可以将触发器添加到任何跟踪的表格以进行插入/更新/删除。在触发器中,只需检查NEW和OLD值,并将它们写入带有列

的特殊表中
table_name
entity_id
modification_time
previous_value
new_value
user

如果您在收听的表格中添加changed_by列,很难找出进行更改的用户。