admin/sql/fix_data_perm_template_bad_guids.sql
2026-07-03 11:58:24 +08:00

102 lines
5.3 KiB
SQL
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

-- 修复 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;