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

130 lines
3.8 KiB
PL/PgSQL

BEGIN;
-- ============================================================================
-- RAG 公共知识库未归属默认项迁移
--
-- 背景:
-- 历史 RAG 知识库存在 tenant_code 为空、area 为空/default/公共、is_public=true 的公共知识库。
-- 如果这类记录是默认知识库,后端会禁止直接取消默认/删除;同时 PUBLIC 组另有默认
-- 时,页面会出现两个“默认”,但它们属于不同默认组。
--
-- 目标:
-- 1. 将历史未归属公共 RAG 知识库迁移到 tenant_code='PUBLIC'、area='公共'
-- 2. 同步其关联 rag_chat_app 的 tenant_code/area
-- 3. 迁移后 PUBLIC 组只保留一个默认知识库/默认应用
--
-- 执行前:
-- 先执行 precheck_rag_public_orphan_defaults.sql,确认候选记录符合预期。
-- ============================================================================
ALTER TABLE public.rag_dataset
ADD COLUMN IF NOT EXISTS tenant_code VARCHAR(64);
ALTER TABLE public.rag_chat_app
ADD COLUMN IF NOT EXISTS tenant_code VARCHAR(64);
CREATE INDEX IF NOT EXISTS idx_rag_dataset_tenant_code
ON public.rag_dataset(tenant_code)
WHERE deleted_at IS NULL;
CREATE INDEX IF NOT EXISTS idx_rag_chat_app_tenant_code
ON public.rag_chat_app(tenant_code)
WHERE deleted_at IS NULL;
CREATE TEMP TABLE tmp_rag_public_orphan_dataset_ids (
id BIGINT PRIMARY KEY
) ON COMMIT DROP;
INSERT INTO tmp_rag_public_orphan_dataset_ids (id)
SELECT d.id
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) = '公共'
)
ON CONFLICT (id) DO NOTHING;
WITH
updated_dataset AS (
UPDATE public.rag_dataset d
SET tenant_code = 'PUBLIC',
area = '公共',
is_public = TRUE,
updated_at = NOW()
FROM tmp_rag_public_orphan_dataset_ids orphan
WHERE d.id = orphan.id
RETURNING d.id
)
UPDATE public.rag_chat_app a
SET tenant_code = 'PUBLIC',
area = '公共',
updated_at = NOW()
FROM updated_dataset ud
WHERE a.dataset_id = ud.id
AND a.deleted_at IS NULL;
WITH ranked_public_dataset AS (
SELECT
d.id,
ROW_NUMBER() OVER (
ORDER BY
d.is_default DESC,
CASE WHEN orphan.id IS NULL THEN 0 ELSE 1 END,
d.created_at DESC,
d.id DESC
) AS keep_default_rank
FROM public.rag_dataset d
LEFT JOIN tmp_rag_public_orphan_dataset_ids orphan ON orphan.id = d.id
WHERE d.deleted_at IS NULL
AND BTRIM(COALESCE(d.tenant_code, '')) = 'PUBLIC'
),
normalized_public_dataset AS (
UPDATE public.rag_dataset d
SET is_default = (rpd.keep_default_rank = 1),
updated_at = NOW()
FROM ranked_public_dataset rpd
WHERE d.id = rpd.id
RETURNING d.id, d.is_default
)
UPDATE public.rag_chat_app a
SET is_default = npd.is_default,
tenant_code = 'PUBLIC',
area = '公共',
updated_at = NOW()
FROM normalized_public_dataset npd
WHERE a.dataset_id = npd.id
AND a.deleted_at IS NULL;
-- 验收输出:PUBLIC 组当前默认知识库应只剩 1 条。
SELECT
COUNT(*) FILTER (WHERE is_default = TRUE) AS public_default_count,
COUNT(*) AS public_dataset_count
FROM public.rag_dataset
WHERE deleted_at IS NULL
AND BTRIM(COALESCE(tenant_code, '')) = 'PUBLIC';
SELECT
id,
name,
area,
tenant_code,
is_public,
is_default,
CASE
WHEN id IN (SELECT id FROM tmp_rag_public_orphan_dataset_ids) THEN 'migrated_orphan'
ELSE 'existing_public'
END AS source_scope,
created_at,
updated_at
FROM public.rag_dataset
WHERE deleted_at IS NULL
AND BTRIM(COALESCE(tenant_code, '')) = 'PUBLIC'
ORDER BY is_default DESC, created_at DESC, id DESC;
COMMIT;