在mysql中使用触发器记录表的增删改所发生的数据前后变化存储到log表里
时间: 2024-03-27 11:39:08 浏览: 222
可以使用 MySQL 的触发器功能来记录表的增删改操作,并将操作前后的数据变化存储到另一个表中,例如 log 表。
以下是一个基本的示例,演示如何使用触发器记录表的增删改操作:
1. 创建 log 表,用于存储表的增删改操作记录。
```mysql
CREATE TABLE log (
id INT NOT NULL AUTO_INCREMENT,
table_name VARCHAR(50) NOT NULL,
action_type ENUM('INSERT', 'UPDATE', 'DELETE') NOT NULL,
old_data TEXT,
new_data TEXT,
modified_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (id)
) ENGINE=InnoDB;
```
2. 创建触发器,用于在表的增删改操作时记录数据变化。
```mysql
DELIMITER //
CREATE TRIGGER trigger_name
AFTER INSERT ON target_table
FOR EACH ROW
BEGIN
INSERT INTO log (table_name, action_type, new_data)
VALUES ('target_table', 'INSERT', JSON_OBJECT('column1', NEW.column1, 'column2', NEW.column2, ...));
END//
CREATE TRIGGER trigger_name
AFTER UPDATE ON target_table
FOR EACH ROW
BEGIN
INSERT INTO log (table_name, action_type, old_data, new_data)
VALUES ('target_table', 'UPDATE', JSON_OBJECT('column1', OLD.column1, 'column2', OLD.column2, ...), JSON_OBJECT('column1', NEW.column1, 'column2', NEW.column2, ...));
END//
CREATE TRIGGER trigger_name
AFTER DELETE ON target_table
FOR EACH ROW
BEGIN
INSERT INTO log (table_name, action_type, old_data)
VALUES ('target_table', 'DELETE', JSON_OBJECT('column1', OLD.column1, 'column2', OLD.column2, ...));
END//
DELIMITER ;
```
上述代码中,`target_table` 表示要记录增删改操作的目标表,`trigger_name` 表示触发器的名称。在触发器中,使用 `JSON_OBJECT` 函数将数据转换为 JSON 格式,并将数据记录到 log 表中。`OLD` 和 `NEW` 关键字分别表示修改前和修改后的数据。
需要注意的是,上述代码中的 `JSON_OBJECT` 函数和 `ENUM` 类型需要 MySQL 5.7.8 及以上版本才支持。
通过以上步骤,就可以在 MySQL 中使用触发器记录表的增删改操作,并将操作前后的数据变化存储到 log 表中。
阅读全文