013_log_orphan_allowed_groups.sql 1.2 KB

1234567891011121314151617181920212223242526272829303132
  1. -- 013: 记录 users.allowed_groups 中的孤立 group_id
  2. -- 任务:fix-medium-data-hygiene 3.1
  3. --
  4. -- 目的:在删除 legacy allowed_groups 列前,记录所有引用了不存在 group 的孤立记录
  5. -- 这些记录可用于审计或后续数据修复
  6. -- 创建审计表存储孤立的 allowed_groups 记录
  7. CREATE TABLE IF NOT EXISTS orphan_allowed_groups_audit (
  8. id BIGSERIAL PRIMARY KEY,
  9. user_id BIGINT NOT NULL,
  10. group_id BIGINT NOT NULL,
  11. recorded_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
  12. UNIQUE (user_id, group_id)
  13. );
  14. -- 记录孤立的 group_id(存在于 users.allowed_groups 但不存在于 groups 表)
  15. INSERT INTO orphan_allowed_groups_audit (user_id, group_id)
  16. SELECT u.id, x.group_id
  17. FROM users u
  18. CROSS JOIN LATERAL unnest(u.allowed_groups) AS x(group_id)
  19. LEFT JOIN groups g ON g.id = x.group_id
  20. WHERE u.allowed_groups IS NOT NULL
  21. AND g.id IS NULL
  22. ON CONFLICT (user_id, group_id) DO NOTHING;
  23. -- 添加索引便于查询
  24. CREATE INDEX IF NOT EXISTS idx_orphan_allowed_groups_audit_user_id
  25. ON orphan_allowed_groups_audit(user_id);
  26. -- 记录迁移完成信息
  27. COMMENT ON TABLE orphan_allowed_groups_audit IS
  28. '审计表:记录 users.allowed_groups 中引用的不存在的 group_id,用于数据清理前的审计';