-- ---------------------------- -- 操作记录页:sys_oper_log 扩三列 —— 对应数据id + 操作者昵称 + 操作者手机号 -- -- 目标库 hugray(sys_oper_log 属系统库,与 sys_user/sys_menu 同库)。 -- 表里已有数据,故用幂等过程做存在性判断,绝不 DROP;脚本可重复执行。 -- -- 【为什么新开三列,而不是查询时 join sys_user】 -- 昵称/手机号是**写日志时快照**:员工改名、换手机号、乃至离职删号之后, -- 历史操作记录仍能还原"当时是谁操作的"。若改成查询时 join sys_user, -- 删号后 join 不到、改名后历史记录整体变味,审计价值就没了。 -- 代价是同一人的多行记录可能带着不同昵称 —— 这是刻意的,不是数据不一致。 -- 注意:这与 oper_name(登录账号)是两回事,oper_name 是登录名、改不了。 -- -- 【对应数据id 是定位线索,不是外键】 -- 由切面按"路径变量优先"自动提取,取不到就留空,宁可空也不猜。 -- 新增类接口(id 由库自增、响应不回传)天然为空,属预期。 -- 故:不加外键、不加索引(检索是前后 % 的模糊匹配,索引用不上)、 -- 也不保证一定是单值 —— 批量删除接口传的是逗号串(如 "1,2,3"),原样存。 -- -- 【oper_data_id 为什么给 255 而不是 64】 -- 批量删除(/{ids})的逗号串会随选中条数增长。列宽不足时 MySQL 严格模式下 -- 是整行插入失败,而写日志的异常被切面 try/catch 吞掉 —— 表现为 -- 「业务一切正常、日志静默少一行」,是最难排查的失败模式。给足余量更划算。 -- -- 【存量 163 行不回填】 -- 三列留 NULL,前端「操作者」列回退显示 oper_name、「对应数据id」显示 -。 -- ---------------------------- USE `hugray`; -- ---------- 幂等辅助过程(末尾删掉,不在库里留痕) ---------- -- MySQL 的 ALTER TABLE 不支持 ADD COLUMN IF NOT EXISTS,重复执行会因 -- Duplicate column name 中断,故用临时过程做存在性判断。 DROP PROCEDURE IF EXISTS `hugray_add_column`; DELIMITER $$ CREATE PROCEDURE `hugray_add_column`(IN p_table VARCHAR(64), IN p_column VARCHAR(64), IN p_definition TEXT) BEGIN IF NOT EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = p_table AND COLUMN_NAME = p_column) THEN SET @ddl = CONCAT('ALTER TABLE `', p_table, '` ADD COLUMN `', p_column, '` ', p_definition); PREPARE stmt FROM @ddl; EXECUTE stmt; DEALLOCATE PREPARE stmt; END IF; END$$ DELIMITER ; -- ---------- 1. 对应业务数据id(切面自动提取) ---------- CALL `hugray_add_column`('sys_oper_log', 'oper_data_id', "varchar(255) DEFAULT NULL COMMENT '对应业务数据id(切面自动提取,定位线索)'"); -- ---------- 2. 操作者昵称(写时快照) ---------- -- 宽度对齐 sys_user.nick_name 的 varchar(30) CALL `hugray_add_column`('sys_oper_log', 'oper_nick_name', "varchar(30) DEFAULT NULL COMMENT '操作者昵称(写时快照)'"); -- ---------- 3. 操作者手机号(写时快照) ---------- -- 宽度对齐 sys_user.phonenumber 的 varchar(11) CALL `hugray_add_column`('sys_oper_log', 'oper_phone', "varchar(11) DEFAULT NULL COMMENT '操作者手机号(写时快照)'"); -- ---------- 4. 收尾:删掉临时过程 ---------- DROP PROCEDURE IF EXISTS `hugray_add_column`; -- ---------- 5. 结果核对 ---------- -- 应回三行:oper_data_id varchar(255) / oper_nick_name varchar(30) / oper_phone varchar(11) SELECT `ordinal_position`, `column_name`, `column_type`, `is_nullable`, `column_default`, `column_comment` FROM `information_schema`.`columns` WHERE `table_schema` = 'hugray' AND `table_name` = 'sys_oper_log' AND `column_name` IN ('oper_data_id', 'oper_nick_name', 'oper_phone') ORDER BY `ordinal_position`; -- 存量数据:三列应为 NULL(新版本写入的行才会有值,此时都还是 NULL) SELECT `oper_id`, `oper_name`, `oper_data_id`, `oper_nick_name`, `oper_phone` FROM `sys_oper_log` ORDER BY `oper_id` DESC LIMIT 3; -- 临时过程必须已经删掉,应返回 0 行 SELECT `routine_name` FROM `information_schema`.`routines` WHERE `routine_schema` = 'hugray' AND `routine_name` = 'hugray_add_column';