mysql - 如何实现记录mysql数据库的所有更改?

标签 mysql sql database triggers

我需要跟踪数据库中的所有更改:更新、插入、删除。我想知道谁和什么发生了变化。

需要包含列的log表:

  1. 日期。
  2. 表名称。
  3. 专栏。
  4. 旧值。
  5. 新值(value)。
  6. IP。

实现此目的的最佳方法是什么?

有现成的解决方案吗?

我尝试在更新/插入/删除时使用触发器。这是一个好的解决方案吗?或者也许我不知道 mysql 中正确的日志记录?

我的触发器:

CREATE TRIGGER `user_update_trigger`
AFTER UPDATE ON `users`
FOR EACH ROW
BEGIN

DECLARE done int default false;
DECLARE col_name CHAR(255);

DECLARE counter INTEGER(11);

DECLARE column_cursor cursor for SELECT `column_name`
                    FROM `INFORMATION_SCHEMA`.`COLUMNS` 
                    WHERE `TABLE_SCHEMA`='test' 
                    AND `TABLE_NAME`='users';

DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

open column_cursor;

myloop: loop

fetch column_cursor into col_name;

if done then
    leave myloop;
end if;

/*SET @old_val = OLD.{{col_name}}; <------ HOW GET VALUE? */
/*SET @new_val = NEW.{{col_name}};<------ HOW GET VALUE? */

if @old_val <> @new_val then
    /*INSERT INTO `log` ....*/
end if;


end loop;

close column_cursor;

END;

最佳答案

启用mysql audit log filtering 。 你可以做类似的事情

    {
  "filter": {
    "class": [
      {
        "name": "connection",
        "event": [
          { "name": "connect" },
          { "name": "disconnect" }
        ]
      },
      { "name": "general" },
      {
        "name": "table_access",
        "event": [
          { "name": "insert" },
          { "name": "delete" },
          { "name": "update" }
        ]
      }
    ]
  }
}

    "event": [
  { "name": "select", "log": false },
  { "name": "insert", "log": true },
  { "name": "delete", "log": true },
  { "name": "update", "log": true }
]

关于mysql - 如何实现记录mysql数据库的所有更改?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48793577/

相关文章:

mysql - 将参数传递给 mySQL 数据库的 IdbCommand

python - 将sql结果转换为list python

mysql - sql查询中的左外连接

c# - Asp.Net LINQ 组合三个表

mysql - 查看外键的依赖树

php - HTML 表单不保存已禁用的检查或单选字段

java - CrudRepository : find by multiple related entities

MySql:错误的字符串值:列为 '\xC5\x9Fe'

database - Scriptella - 使用输出中的行填充新表的数据库到数据库 ETL 脚本

android - 将数据库从云端下载到 Android