-- 修复 data_perm_* 表非法 GUID(如 Id='1'、dp/dr 前缀含非 hex 字符) -- 症状:GET /rbac/data-perm/template/list → Could not parse CHAR(36) value as Guid: 1 -- -- ⚠️ 在 RBAC 库执行;执行前先跑 diagnose_data_perm_bad_guids.sql 确认脏数据 -- 若库中从未跑过 install_data_permission.sql,请先执行该脚本再跑本修复 SET @GUID_RE = '^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$'; SELECT 'before fix — bad template rows' AS stage, t.`Id`, t.`Name`, t.`Code` FROM `data_perm_template` t WHERE t.`Id` NOT REGEXP @GUID_RE; -- 1) 旧种子前缀 dp/dr → da(与 install_data_permission.sql 一致) UPDATE `data_perm_template_item` SET `TemplateId` = REPLACE(`TemplateId`, 'dp000001-', 'da000001-') WHERE `TemplateId` LIKE 'dp000001-%'; UPDATE `data_perm_template_item` SET `Id` = REPLACE(`Id`, 'dp200001-', 'da200001-') WHERE `Id` LIKE 'dp200001-%'; UPDATE `data_perm_template_item` SET `Id` = REPLACE(`Id`, 'dr200001-', 'da200001-') WHERE `Id` LIKE 'dr200001-%'; UPDATE `data_perm_template` SET `Id` = REPLACE(`Id`, 'dp000001-', 'da000001-') WHERE `Id` LIKE 'dp000001-%'; UPDATE `data_perm_template` SET `Id` = REPLACE(`Id`, 'dr000001-', 'da000001-') WHERE `Id` LIKE 'dr000001-%'; UPDATE `data_resource` SET `Id` = REPLACE(`Id`, 'dr000001-', 'da300001-') WHERE `Id` LIKE 'dr000001-%'; UPDATE `data_resource` SET `Id` = REPLACE(`Id`, 'dr300001-', 'da300001-') WHERE `Id` LIKE 'dr300001-%'; UPDATE `data_resource` SET `Id` = REPLACE(`Id`, 'dp300001-', 'da300001-') WHERE `Id` LIKE 'dp300001-%'; UPDATE `data_perm_field_mask` SET `Id` = REPLACE(`Id`, 'fm000001-', 'fa000001-') WHERE `Id` LIKE 'fm000001-%'; -- 2) 删除无法自动映射的脏模板 DELETE FROM `data_perm_template_item` WHERE `TemplateId` IN ( SELECT `Id` FROM ( SELECT `Id` FROM `data_perm_template` WHERE TRIM(`Id`) NOT REGEXP @GUID_RE ) AS bad_tpl ); DELETE FROM `data_perm_template` WHERE TRIM(`Id`) NOT REGEXP @GUID_RE; -- 3) 重新插入内置模板(与 install_data_permission.sql §12 一致,可重复执行) INSERT INTO `data_perm_template` (`Id`, `Name`, `Code`, `Description`, `RoleCode`, `IsBuiltIn`, `CreateUserId`, `CreateTime`) VALUES ('da000001-0000-4000-8000-000000000001', '普通销售', 'SalesStaff', '个人级+指定产品线+密级1-2', NULL, 1, 0, NOW()), ('da000001-0000-4000-8000-000000000002', '销售主管', 'SalesSupervisor', '部门级+全部产品线+密级1-3', NULL, 1, 0, NOW()), ('da000001-0000-4000-8000-000000000003', '分公司经理', 'BranchManager', '组织树级+密级1-3', NULL, 1, 0, NOW()), ('da000001-0000-4000-8000-000000000004', '总部产品经理', 'ProductManager', '全局级+单产品线+密级1-2', NULL, 1, 0, NOW()), ('da000001-0000-4000-8000-000000000005', '财务专员', 'FinanceStaff', '组织树级+密级含3-4', NULL, 1, 0, NOW()), ('da000001-0000-4000-8000-000000000006', '客服专员', 'CsStaff', '个人级+密级1-2', NULL, 1, 0, NOW()) ON DUPLICATE KEY UPDATE `Name` = VALUES(`Name`), `Description` = VALUES(`Description`), `IsBuiltIn` = VALUES(`IsBuiltIn`); INSERT INTO `data_perm_template_item` (`Id`, `TemplateId`, `DimensionType`, `ItemContent`, `SortOrder`) VALUES ('da200001-0000-4000-8000-000000000011', 'da000001-0000-4000-8000-000000000001', 'data_scope', '{"dataScope":1,"dataResourceCode":null}', 1), ('da200001-0000-4000-8000-000000000012', 'da000001-0000-4000-8000-000000000001', 'secret', '{"secretLevels":[1,2]}', 2), ('da200001-0000-4000-8000-000000000021', 'da000001-0000-4000-8000-000000000002', 'data_scope', '{"dataScope":3,"dataResourceCode":null}', 1), ('da200001-0000-4000-8000-000000000022', 'da000001-0000-4000-8000-000000000002', 'secret', '{"secretLevels":[1,2,3]}', 2), ('da200001-0000-4000-8000-000000000031', 'da000001-0000-4000-8000-000000000003', 'data_scope', '{"dataScope":4,"dataResourceCode":null}', 1), ('da200001-0000-4000-8000-000000000032', 'da000001-0000-4000-8000-000000000003', 'secret', '{"secretLevels":[1,2,3]}', 2), ('da200001-0000-4000-8000-000000000041', 'da000001-0000-4000-8000-000000000004', 'data_scope', '{"dataScope":5,"dataResourceCode":null}', 1), ('da200001-0000-4000-8000-000000000042', 'da000001-0000-4000-8000-000000000004', 'secret', '{"secretLevels":[1,2]}', 2), ('da200001-0000-4000-8000-000000000051', 'da000001-0000-4000-8000-000000000005', 'data_scope', '{"dataScope":4,"dataResourceCode":null}', 1), ('da200001-0000-4000-8000-000000000052', 'da000001-0000-4000-8000-000000000005', 'secret', '{"secretLevels":[1,2,3,4]}', 2), ('da200001-0000-4000-8000-000000000061', 'da000001-0000-4000-8000-000000000006', 'data_scope', '{"dataScope":1,"dataResourceCode":null}', 1), ('da200001-0000-4000-8000-000000000062', 'da000001-0000-4000-8000-000000000006', 'secret', '{"secretLevels":[1,2]}', 2) ON DUPLICATE KEY UPDATE `ItemContent` = VALUES(`ItemContent`), `SortOrder` = VALUES(`SortOrder`); SELECT 'after fix — bad template' AS stage, t.`Id`, t.`Name`, t.`Code` FROM `data_perm_template` t WHERE t.`Id` NOT REGEXP @GUID_RE; SELECT 'after fix — bad data_resource' AS stage, r.`Id`, r.`Code`, r.`Name` FROM `data_resource` r WHERE r.`Id` NOT REGEXP @GUID_RE; SELECT 'after fix — bad field_mask' AS stage, f.`Id`, f.`DataResourceCode`, f.`FieldName` FROM `data_perm_field_mask` f WHERE f.`Id` NOT REGEXP @GUID_RE;