【发布时间】:2018-02-14 18:04:42
【问题描述】:
我需要跟踪数据库中的所有更改:更新、插入、删除。我想知道谁和发生了什么变化。
需要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;
【问题讨论】:
-
您是否正在尝试创建版本历史记录表?如果是这样,如果原始架构发生变化,那会变得非常混乱。我发现通过应用程序层以某种中性格式(例如 JSON)将原始行转储到历史记录表中通常是解决此问题的最佳方法。这样您就不必将迁移应用到历史记录表,并且如果您需要回滚,您可以主观地解释旧记录。
-
不需要回滚...我只需要了解谁(IP)何时以及在数据库中编辑了什么。在 JSON 中转储数据的想法很好......我需要一个触发器吗?
-
MySQL 5.7 支持原生 JSON 列,因此比以前更好了。
-
我需要触发 update 。我将以 json 格式将新旧行保存到日志表中。我理解正确吗?
-
这个应用程序已经有 10 年的历史了。所以我不必选择......谢谢你的帮助。我会尝试 JSON + 触发器。
标签: mysql sql database triggers