修复:校验 MySQL 菜单固定ID冲突

This commit is contained in:
焦龙言
2026-07-27 14:24:30 +08:00
parent 3d1b64971f
commit 9b5f479f0d
2 changed files with 191 additions and 6 deletions
@@ -419,8 +419,18 @@ where dict_id = 12
delete from sys_menu
where menu_id = 99;
-- INSERT IGNORE 使明确 ID 的菜单 seed 可重复应用而不会生成重复记录。
insert ignore into sys_menu values
-- 保存当前会话模式,再无空项、无重复地启用 STRICT_ALL_TABLES,确保菜单冲突按错误中止。
set @pallet_workflow_original_sql_mode = @@session.sql_mode;
set session sql_mode = concat_ws(',',
nullif(@pallet_workflow_original_sql_mode, ''),
if(find_in_set('STRICT_ALL_TABLES', @pallet_workflow_original_sql_mode) = 0,
'STRICT_ALL_TABLES',
null));
-- 固定 ID 已存在时,只有全部稳定字段一致才允许幂等空操作。
-- 任一稳定字段冲突都会令 menu_name 为 NULL,触发 menu_name NOT NULL 约束并中止整条语句。
-- 必须人工解决冲突;本补丁不会静默覆盖未知 ID。
insert into sys_menu values
(121, '基础资料维护', 1, '10', 'businessMaster', null, '', '', 1, 0, 'M', '0', '0', '', '#', 'admin', sysdate(), '', null, ''),
(122, '业务管理', 1, '11', 'businessOperation', null, '', '', 1, 0, 'M', '0', '0', '', '#', 'admin', sysdate(), '', null, ''),
(123, '报表查询', 1, '12', 'businessReport', null, '', '', 1, 0, 'M', '0', '0', '', '#', 'admin', sysdate(), '', null, ''),
@@ -484,6 +494,41 @@ insert ignore into sys_menu values
(1105, '使用新增', 511, '2', '', '', '', '', 1, 0, 'F', '0', '0', 'business:usage:add', '#', 'admin', sysdate(), '', null, ''),
(1106, '退回查询', 512, '1', '', '', '', '', 1, 0, 'F', '0', '0', 'business:return:query', '#', 'admin', sysdate(), '', null, ''),
(1107, '退回申请', 512, '2', '', '', '', '', 1, 0, 'F', '0', '0', 'business:return:request', '#', 'admin', sysdate(), '', null, ''),
(1108, '退回确认', 512, '3', '', '', '', '', 1, 0, 'F', '0', '0', 'business:return:confirm', '#', 'admin', sysdate(), '', null, '');
(1108, '退回确认', 512, '3', '', '', '', '', 1, 0, 'F', '0', '0', 'business:return:confirm', '#', 'admin', sysdate(), '', null, '')
on duplicate key update
menu_name = if(
menu_name <=> values(menu_name)
and parent_id <=> values(parent_id)
and order_num <=> values(order_num)
and path <=> values(path)
and component <=> values(component)
and query <=> values(query)
and route_name <=> values(route_name)
and is_frame <=> values(is_frame)
and is_cache <=> values(is_cache)
and menu_type <=> values(menu_type)
and visible <=> values(visible)
and status <=> values(status)
and perms <=> values(perms)
and icon <=> values(icon),
menu_name,
null
);
-- seed 成功后立即恢复原会话模式;后续仅执行只读人工核对,无需继续保持严格模式。
set session sql_mode = @pallet_workflow_original_sql_mode;
-- 人工核对业务菜单固定 ID;查询结果必须为 64 行,且各字段应与本补丁 seed 一致。
select menu_id, menu_name, parent_id, order_num, path, component, query, route_name,
is_frame, is_cache, menu_type, visible, status, perms, icon
from sys_menu
where menu_id in (
121, 122, 123,
502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518,
1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 1073, 1074, 1075,
1076, 1077, 1078, 1079, 1080, 1081, 1082, 1083, 1084, 1085, 1086,
1087, 1088, 1089, 1090, 1091, 1092, 1093, 1094, 1095, 1096, 1097,
1098, 1099, 1100, 1101, 1102, 1103, 1104, 1105, 1106, 1107, 1108
);
-- 应用完成后仅人工清理 /getRouters、用户信息以及 sys_dict:ai_provider_type 相关缓存;本补丁不执行缓存命令。