实现MySQL表操作日志

1. 流程图

flowchart TD
    A[开始] --> B[创建日志表]
    B --> C[开启表操作日志]
    C --> D[插入操作日志]
    D --> E[查询操作日志]
    E --> F[结束]

2. 创建日志表

首先,我们需要创建一个用于存储表操作日志的表。这个表需要记录操作的时间、类型、表名、以及操作的具体内容。下面是创建日志表的代码:

CREATE TABLE log (
    id INT AUTO_INCREMENT PRIMARY KEY,
    time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    operation ENUM('INSERT', 'UPDATE', 'DELETE'),
    table_name VARCHAR(255),
    content TEXT
);

代码解释:

  • CREATE TABLE:创建一个新表。
  • log:表名。
  • id:日志ID,作为主键,自动生成。
  • time:操作时间,使用TIMESTAMP类型,并设置默认值为当前时间。
  • operation:操作类型,使用ENUM枚举类型,包括INSERTUPDATEDELETE三种操作。
  • table_name:操作的表名,使用VARCHAR类型。
  • content:操作的具体内容,使用TEXT类型。

3. 开启表操作日志

在MySQL中,我们可以通过设置参数来开启或关闭表操作日志。下面是开启表操作日志的代码:

SET GLOBAL log_bin_trust_function_creators = 1;
SET GLOBAL binlog_format = 'ROW';

代码解释:

  • SET GLOBAL:设置全局变量。
  • log_bin_trust_function_creators:设置为1,允许创建函数。
  • binlog_format:设置为ROW,以行为单位记录日志。

4. 插入操作日志

在每次对表进行操作时,我们需要在日志表中插入一条相应的操作日志。下面是插入操作日志的代码:

DELIMITER //

CREATE TRIGGER log_trigger AFTER INSERT ON your_table FOR EACH ROW
BEGIN
    INSERT INTO log (operation, table_name, content)
    VALUES ('INSERT', 'your_table', CONCAT('Inserted data: ', NEW.column1, ', ', NEW.column2));
END //

DELIMITER ;

代码解释:

  • DELIMITER:设置分隔符,因为触发器中包含有多条SQL语句,所以需要设置分隔符才能正确执行。
  • CREATE TRIGGER:创建触发器。
  • log_trigger:触发器名称。
  • AFTER INSERT ON your_table:在your_table表中插入数据之后触发。
  • FOR EACH ROW:对每一行数据都执行触发器中的代码。
  • INSERT INTO log:向日志表中插入一条记录。
  • VALUES:插入的值。
  • NEW:关键字,表示插入的新数据。
  • CONCAT:连接字符串的函数,将操作的具体内容存入日志表。

5. 查询操作日志

如果需要查询某个时间段内的操作日志,我们可以使用如下代码:

SELECT * FROM log
WHERE time BETWEEN '2021-01-01 00:00:00' AND '2021-12-31 23:59:59';

代码解释:

  • SELECT *:查询所有字段。
  • FROM log:从日志表中查询。
  • WHERE:查询条件。
  • time BETWEEN:时间范围。
  • '2021-01-01 00:00:00''2021-12-31 23:59:59':时间范围的起始和结束时间。

6. 完整代码示例

下面是完整的代码示例,包含了创建日志表、开启表操作日志、插入操作日志和查询操作日志的代码:

-- 创建日志表
CREATE TABLE log (
    id INT AUTO_INCREMENT PRIMARY KEY,
    time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    operation ENUM('INSERT', 'UPDATE', 'DELETE'),
    table_name VARCHAR(255),
    content TEXT
);

-- 开启表操作日志
SET GLOBAL log_bin_trust_function_creators = 1;
SET GLOBAL binlog_format = 'ROW';

-- 插入操作日志
DELIMITER //

CREATE TRIGGER log_trigger AFTER INSERT ON your_table FOR EACH ROW
BEGIN
    INSERT INTO log (operation, table_name, content)
    VALUES ('INSERT', '