在mysql数据库的实际应用场景中,我们常常需要在数据发生增删改操作时,自动记录下执行该操作的用户信息,方便后续进行数据审计、问题追溯等工作。触发器可以在指定的表发生数据变更时自动执行预设的逻辑,而SESSION_USER函数能够返回当前连接数据库的用户账户信息,将二者结合就能实现自动记录操作用户的需求。

相关基础概念说明
mysql触发器
触发器是mysql中一种与表相关联的数据库对象,当表上发生INSERT、UPDATE、DELETE等指定事件时,触发器会自动执行定义好的逻辑。触发器可以在事件发生之前(BEFORE)或者之后(AFTER)执行,我们可以根据实际需求选择对应的触发时机。
SESSION_USER函数
SESSION_USER是mysql内置的系统函数,调用该函数会返回当前会话连接数据库的用户名和主机信息,返回值的格式通常为user_name@host_name。该函数不需要传入任何参数,直接在sql语句中调用即可获取当前操作用户的信息。
实现记录操作用户的整体思路
要实现在触发器中记录当前操作用户,整体可以分为三个步骤:
- 首先创建一个专门的日志表,用来存储数据变更的相关信息,包括操作类型、操作时间、操作用户、变更的数据主键等字段。
- 然后在需要监控的业务表上创建对应的触发器,触发器的逻辑中调用SESSION_USER函数获取当前用户,将用户信息和操作相关信息插入到日志表中。
- 最后测试触发器的效果,验证数据变更时是否能正确记录操作用户信息。
具体实现步骤
第一步:创建操作记录表
我们先创建一个通用的操作记录表,用来存储所有表的变更操作信息,表结构如下:
-- 创建操作记录表 CREATE TABLE IF NOT EXISTS `operation_log` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '记录主键', `table_name` varchar(50) NOT NULL COMMENT '操作的表名', `operation_type` varchar(10) NOT NULL COMMENT '操作类型:INSERT/UPDATE/DELETE', `operation_user` varchar(100) NOT NULL COMMENT '操作用户,SESSION_USER返回值', `operation_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '操作时间', `record_id` int(11) NOT NULL COMMENT '被操作记录的主键id', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='数据操作记录表';
第二步:创建业务表及对应触发器
假设我们有一个用户表user_info,需要监控该表的增删改操作,先创建用户表:
-- 创建用户表 CREATE TABLE IF NOT EXISTS `user_info` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户主键', `user_name` varchar(50) NOT NULL COMMENT '用户名', `age` int(11) DEFAULT NULL COMMENT '用户年龄', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户信息表';
接下来分别为user_info表创建INSERT、UPDATE、DELETE三种操作的触发器:
INSERT操作触发器
该触发器在用户表插入新数据之后触发,将操作用户和新插入记录的主键写入日志表:
-- 创建插入操作的触发器
DELIMITER //
CREATE TRIGGER `user_info_after_insert`
AFTER INSERT ON `user_info`
FOR EACH ROW
BEGIN
-- 调用SESSION_USER获取当前操作用户,插入操作记录
INSERT INTO `operation_log` (`table_name`, `operation_type`, `operation_user`, `record_id`)
VALUES ('user_info', 'INSERT', SESSION_USER(), NEW.id);
END //
DELIMITER ;
UPDATE操作触发器
该触发器在用户表更新数据之后触发,记录操作用户和被更新记录的主键:
-- 创建更新操作的触发器
DELIMITER //
CREATE TRIGGER `user_info_after_update`
AFTER UPDATE ON `user_info`
FOR EACH ROW
BEGIN
-- 调用SESSION_USER获取当前操作用户,插入操作记录
INSERT INTO `operation_log` (`table_name`, `operation_type`, `operation_user`, `record_id`)
VALUES ('user_info', 'UPDATE', SESSION_USER(), NEW.id);
END //
DELIMITER ;
DELETE操作触发器
该触发器在用户表删除数据之后触发,注意删除操作时NEW对象不存在,需要使用OLD对象获取被删除记录的主键:
-- 创建删除操作的触发器
DELIMITER //
CREATE TRIGGER `user_info_after_delete`
AFTER DELETE ON `user_info`
FOR EACH ROW
BEGIN
-- 调用SESSION_USER获取当前操作用户,插入操作记录
INSERT INTO `operation_log` (`table_name`, `operation_type`, `operation_user`, `record_id`)
VALUES ('user_info', 'DELETE', SESSION_USER(), OLD.id);
END //
DELIMITER ;
第三步:测试触发器效果
我们执行一些用户表的增删改操作,然后查看操作记录表的数据验证效果:
-- 插入一条用户数据
INSERT INTO `user_info` (`user_name`, `age`) VALUES ('张三', 25);
-- 更新用户数据
UPDATE `user_info` SET `age` = 26 WHERE `user_name` = '张三';
-- 删除用户数据
DELETE FROM `user_info` WHERE `user_name` = '张三';
-- 查询操作记录表,查看记录的操作用户
SELECT `id`, `table_name`, `operation_type`, `operation_user`, `operation_time`, `record_id` FROM `operation_log`;
执行上述查询后,就能看到三条操作记录,其中operation_user字段的值就是执行这些操作的当前数据库连接用户,由SESSION_USER函数获取得到。
注意事项
- SESSION_USER返回的是当前数据库连接使用的账户,如果是通过应用程序连接数据库,且使用了统一的连接账户,那么记录的会是应用程序的账户,而非最终的业务操作用户。这种情况下需要额外在业务层传递业务用户标识,再通过自定义变量传入触发器。
- 触发器的创建需要有对应的权限,通常只有数据库管理员或者表的所有者才能创建触发器。
- 如果不需要记录所有操作类型的日志,可以只创建对应操作类型的触发器,避免不必要的性能开销。
- 删除业务表之前需要先删除该表上的触发器,否则可能会删除失败。
mysql触发器SESSION_USER用户记录修改时间:2026-06-19 18:42:32