Files
leaudit-platform-backend/scripts/创建sql/precheck_rag_public_orphan_defaults.sql
T

135 lines
3.7 KiB
SQL

-- ============================================================================
-- RAG 公共知识库未归属默认项迁移前检查
--
-- 用途:
-- 检查历史 tenant_code 为空,area 为空/default/公共,且 is_public=true 的 RAG 知识库/应用。
-- 这些记录在页面显示为“未分配地区”,且如果 is_default=true,会导致无法删除。
--
-- 执行:
-- psql -h <host> -U <user> -d <db_name> -v ON_ERROR_STOP=1 \
-- -f scripts/创建sql/precheck_rag_public_orphan_defaults.sql
-- ============================================================================
-- 1. 历史未归属公共知识库迁移候选
SELECT
d.id,
d.name,
d.description,
d.area,
d.tenant_code,
d.is_public,
d.is_default,
d.status,
d.created_at,
d.updated_at
FROM public.rag_dataset d
WHERE d.deleted_at IS NULL
AND (d.tenant_code IS NULL OR BTRIM(d.tenant_code) = '')
AND d.is_public IS TRUE
AND (
d.area IS NULL
OR BTRIM(d.area) = ''
OR LOWER(BTRIM(d.area)) = 'default'
OR BTRIM(d.area) = '公共'
)
ORDER BY d.is_default DESC, d.created_at DESC, d.id DESC;
-- 2. 当前 PUBLIC 组默认知识库
SELECT
d.id,
d.name,
d.description,
d.area,
d.tenant_code,
d.is_public,
d.is_default,
d.status,
d.created_at,
d.updated_at
FROM public.rag_dataset d
WHERE d.deleted_at IS NULL
AND BTRIM(COALESCE(d.tenant_code, '')) = 'PUBLIC'
ORDER BY d.is_default DESC, d.created_at DESC, d.id DESC;
-- 3. 迁移后 PUBLIC 组默认冲突预览
WITH candidate AS (
SELECT
d.id,
d.name,
d.area,
CASE
WHEN BTRIM(COALESCE(d.tenant_code, '')) = 'PUBLIC' THEN 'existing_public'
ELSE 'orphan_public'
END AS source_scope,
COALESCE(NULLIF(BTRIM(d.tenant_code), ''), 'PUBLIC') AS target_tenant_code,
d.is_default,
d.is_public,
d.created_at
FROM public.rag_dataset d
WHERE d.deleted_at IS NULL
AND (
BTRIM(COALESCE(d.tenant_code, '')) = 'PUBLIC'
OR (
(d.tenant_code IS NULL OR BTRIM(d.tenant_code) = '')
AND d.is_public IS TRUE
AND (
d.area IS NULL
OR BTRIM(d.area) = ''
OR LOWER(BTRIM(d.area)) = 'default'
OR BTRIM(d.area) = '公共'
)
)
)
),
ranked AS (
SELECT
c.*,
ROW_NUMBER() OVER (
PARTITION BY c.target_tenant_code
ORDER BY
c.is_default DESC,
CASE WHEN c.source_scope = 'existing_public' THEN 0 ELSE 1 END,
c.created_at DESC,
c.id DESC
) AS keep_default_rank
FROM candidate c
)
SELECT
target_tenant_code,
id,
name,
area,
source_scope,
is_public,
is_default AS current_is_default,
keep_default_rank,
CASE WHEN keep_default_rank = 1 THEN '迁移后保留默认' ELSE '迁移后取消默认' END AS planned_default_action
FROM ranked
ORDER BY target_tenant_code, keep_default_rank, id;
-- 4. 关联应用候选
SELECT
a.id,
a.name,
a.area,
a.tenant_code,
a.dataset_id,
a.is_default,
a.status,
a.created_at,
a.updated_at
FROM public.rag_chat_app a
JOIN public.rag_dataset d ON d.id = a.dataset_id
WHERE a.deleted_at IS NULL
AND d.deleted_at IS NULL
AND (a.tenant_code IS NULL OR BTRIM(a.tenant_code) = '')
AND (d.tenant_code IS NULL OR BTRIM(d.tenant_code) = '')
AND d.is_public IS TRUE
AND (
d.area IS NULL
OR BTRIM(d.area) = ''
OR LOWER(BTRIM(d.area)) = 'default'
OR BTRIM(d.area) = '公共'
)
ORDER BY a.is_default DESC, a.created_at DESC, a.id DESC;