我需要跟踪数据库中的所有更改:更新、插入、删除。我想知道谁和什么发生了变化。
需要包含列的log
表:
- 日期。
- 表名称。
- 专栏。
- 旧值。
- 新值(value)。
- 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/