diff --git a/deploy/sql/2026-06-11-menu-cleanup.sql b/deploy/sql/2026-06-11-menu-cleanup.sql new file mode 100644 index 00000000..caea587c --- /dev/null +++ b/deploy/sql/2026-06-11-menu-cleanup.sql @@ -0,0 +1,37 @@ +-- ============================================================================= +-- 造梦AI · yudao 死菜单清理(2026-06-11 审计版) +-- 适用库:ruoyi-vue-pro(staging:mini-desktop docker game-staging-mysql,MySQL 8.4.8) +-- 性质:软删(deleted=1),全量可回滚(备份表 + 固化删除集表) +-- 判据:16 棵死顶级子树(views 已被 fork 删除,点开全空白);详见 +-- docs/agent-specs/2026-06-11-admin-cloud清理-codex执行单.md §1 层A +-- 执行方式:分 4 段执行,每段闸门校验通过才进下一段(勿一次性灌整个文件) +-- ============================================================================= + +-- ---------- 段1:备份(若备份表已存在=有前次执行残留,必须停下人核,禁止覆盖) ---------- +CREATE TABLE system_menu_bak_20260611 AS SELECT * FROM system_menu; +CREATE TABLE system_role_menu_bak_20260611 AS SELECT * FROM system_role_menu; + +-- ---------- 段2:固化删除集(递归收集 16 棵死子树全部后代) ---------- +DROP TABLE IF EXISTS cleanup_menu_del_20260611; +CREATE TABLE cleanup_menu_del_20260611 (id BIGINT PRIMARY KEY); +INSERT INTO cleanup_menu_del_20260611 +WITH RECURSIVE del AS ( + SELECT id FROM system_menu + WHERE id IN (1117,1185,1254,1281,2084,2159,2160,2262,2362,2397,2563,2758,4000,5100,6400,6500) + AND deleted = 0 + UNION ALL + SELECT m.id FROM system_menu m JOIN del d ON m.parent_id = d.id WHERE m.deleted = 0 +) +SELECT id FROM del; + +-- ---------- 段3:软删(带审计 updater,遵守审计列非空红线) ---------- +UPDATE system_menu m JOIN cleanup_menu_del_20260611 d ON m.id = d.id + SET m.deleted = 1, m.updater = 'cleanup-20260611', m.update_time = NOW(); + +UPDATE system_role_menu rm JOIN cleanup_menu_del_20260611 d ON rm.menu_id = d.id + SET rm.deleted = 1, rm.updater = 'cleanup-20260611', rm.update_time = NOW() + WHERE rm.deleted = 0; + +-- ---------- 段4(仅回滚时用,平时勿执行):全量恢复 ---------- +-- UPDATE system_menu m JOIN system_menu_bak_20260611 b ON m.id = b.id SET m.deleted = b.deleted; +-- UPDATE system_role_menu rm JOIN system_role_menu_bak_20260611 b ON rm.id = b.id SET rm.deleted = b.deleted;