102 lines
5.3 KiB
SQL
102 lines
5.3 KiB
SQL
-- 修复 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;
|