我需要跟踪数据库中的所有更改:更新,插入,删除。我想知道世界卫生组织和将会发生什么变化。
需要带有列的log
表:
日期。
表名。
柱。
旧值。
新价值。
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 }
]