2026-04-26 23:57:40 +08:00
|
|
|
|
-- base_sys_user_role 角色授权去重
|
2026-04-27 00:57:18 +08:00
|
|
|
|
-- 只处理未软删除的有效授权;软删除历史记录不参与去重
|
2026-04-27 00:51:28 +08:00
|
|
|
|
-- 保留每组有效 userId + roleId 中 id 最小的一条,删除其余重复记录
|
2026-04-26 23:57:40 +08:00
|
|
|
|
|
|
|
|
|
|
-- 1. 执行前查看重复数据
|
|
|
|
|
|
SELECT
|
|
|
|
|
|
"userId",
|
|
|
|
|
|
"roleId",
|
|
|
|
|
|
COUNT(*) AS cnt,
|
|
|
|
|
|
MIN(id) AS keep_id,
|
|
|
|
|
|
ARRAY_AGG(id ORDER BY id) AS ids
|
|
|
|
|
|
FROM base_sys_user_role
|
2026-04-27 00:51:28 +08:00
|
|
|
|
WHERE deleted_at IS NULL
|
2026-04-26 23:57:40 +08:00
|
|
|
|
GROUP BY "userId", "roleId"
|
|
|
|
|
|
HAVING COUNT(*) > 1
|
|
|
|
|
|
ORDER BY cnt DESC, "userId", "roleId";
|
|
|
|
|
|
|
|
|
|
|
|
-- 2. 删除重复数据
|
|
|
|
|
|
DELETE FROM base_sys_user_role a
|
|
|
|
|
|
USING base_sys_user_role b
|
|
|
|
|
|
WHERE a."userId" = b."userId"
|
|
|
|
|
|
AND a."roleId" = b."roleId"
|
2026-04-27 00:51:28 +08:00
|
|
|
|
AND a.deleted_at IS NULL
|
|
|
|
|
|
AND b.deleted_at IS NULL
|
2026-04-26 23:57:40 +08:00
|
|
|
|
AND a.id > b.id;
|
|
|
|
|
|
|
|
|
|
|
|
-- 3. 执行后复查,应返回 0 行
|
|
|
|
|
|
SELECT
|
|
|
|
|
|
"userId",
|
|
|
|
|
|
"roleId",
|
|
|
|
|
|
COUNT(*) AS cnt
|
|
|
|
|
|
FROM base_sys_user_role
|
2026-04-27 00:51:28 +08:00
|
|
|
|
WHERE deleted_at IS NULL
|
2026-04-26 23:57:40 +08:00
|
|
|
|
GROUP BY "userId", "roleId"
|
|
|
|
|
|
HAVING COUNT(*) > 1;
|
2026-04-27 00:51:28 +08:00
|
|
|
|
|
2026-04-27 00:57:18 +08:00
|
|
|
|
-- 唯一约束统一在 约束类.sql 中维护。
|