41 lines
1.6 KiB
SQL
41 lines
1.6 KiB
SQL
-- ============================================================
|
|
-- 清理孤儿业务角色(指向不存在的应用)
|
|
-- 场景:角色授权页 RoleModuleTree?roleId=2 报 "角色所属应用不存在: 3"
|
|
-- 根因:sys_app_role 中存在 all_app_flag=0 的普通角色,其 app_id 指向
|
|
-- application_info 中已不存在的应用(应用被删,当时无级联清理)。
|
|
-- 说明:本脚本只读诊断 + 备份 + 清理,请先执行第 1 步确认,再执行第 2/3 步。
|
|
-- ============================================================
|
|
|
|
-- 1) 诊断:列出全部"指向不存在应用"的普通角色(孤儿角色)
|
|
SELECT r.id AS role_id,
|
|
r.name AS role_name,
|
|
r.app_id AS missing_app_id
|
|
FROM sys_app_role r
|
|
WHERE r.all_app_flag = 0
|
|
AND r.app_id IS NOT NULL
|
|
AND NOT EXISTS (
|
|
SELECT 1 FROM application_info a WHERE a.id = r.app_id
|
|
);
|
|
|
|
-- 2) 备份(执行清理前先保留,便于回滚)
|
|
CREATE TABLE IF NOT EXISTS _bak_orphan_role LIKE sys_app_role;
|
|
INSERT INTO _bak_orphan_role
|
|
SELECT * FROM sys_app_role r
|
|
WHERE r.all_app_flag = 0
|
|
AND r.app_id IS NOT NULL
|
|
AND NOT EXISTS (
|
|
SELECT 1 FROM application_info a WHERE a.id = r.app_id
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS _bak_orphan_role_rel LIKE sys_app_role_module_rel;
|
|
INSERT INTO _bak_orphan_role_rel
|
|
SELECT * FROM sys_app_role_module_rel
|
|
WHERE role_id IN (SELECT id FROM _bak_orphan_role);
|
|
|
|
-- 3) 清理:先删模块授权关系,再删孤儿角色本身
|
|
DELETE FROM sys_app_role_module_rel
|
|
WHERE role_id IN (SELECT id FROM _bak_orphan_role);
|
|
|
|
DELETE FROM sys_app_role
|
|
WHERE id IN (SELECT id FROM _bak_orphan_role);
|