## 数据完整性修复 (fix-critical-data-integrity) - 添加 error_translate.go 统一错误转换层 - 修复 nil 输入和 NotFound 错误处理 - 增强仓储层错误一致性 ## 仓储一致性修复 (fix-high-repository-consistency) - Group schema 添加 default_validity_days 字段 - Account schema 添加 proxy edge 关联 - 新增 UsageLog ent schema 定义 - 修复 UpdateBalance/UpdateConcurrency 受影响行数校验 ## 数据卫生修复 (fix-medium-data-hygiene) - UserSubscription 添加软删除支持 (SoftDeleteMixin) - RedeemCode/Setting 添加硬删除策略文档 - account_groups/user_allowed_groups 的 created_at 声明 timestamptz - 停止写入 legacy users.allowed_groups 列 - 新增迁移: 011-014 (索引优化、软删除、孤立数据审计、列清理) ## 测试补充 - 添加 UserSubscription 软删除测试 - 添加迁移回归测试 - 添加 NotFound 错误测试 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
33 lines
1.2 KiB
SQL
33 lines
1.2 KiB
SQL
-- 013: 记录 users.allowed_groups 中的孤立 group_id
|
||
-- 任务:fix-medium-data-hygiene 3.1
|
||
--
|
||
-- 目的:在删除 legacy allowed_groups 列前,记录所有引用了不存在 group 的孤立记录
|
||
-- 这些记录可用于审计或后续数据修复
|
||
|
||
-- 创建审计表存储孤立的 allowed_groups 记录
|
||
CREATE TABLE IF NOT EXISTS orphan_allowed_groups_audit (
|
||
id BIGSERIAL PRIMARY KEY,
|
||
user_id BIGINT NOT NULL,
|
||
group_id BIGINT NOT NULL,
|
||
recorded_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
||
UNIQUE (user_id, group_id)
|
||
);
|
||
|
||
-- 记录孤立的 group_id(存在于 users.allowed_groups 但不存在于 groups 表)
|
||
INSERT INTO orphan_allowed_groups_audit (user_id, group_id)
|
||
SELECT u.id, x.group_id
|
||
FROM users u
|
||
CROSS JOIN LATERAL unnest(u.allowed_groups) AS x(group_id)
|
||
LEFT JOIN groups g ON g.id = x.group_id
|
||
WHERE u.allowed_groups IS NOT NULL
|
||
AND g.id IS NULL
|
||
ON CONFLICT (user_id, group_id) DO NOTHING;
|
||
|
||
-- 添加索引便于查询
|
||
CREATE INDEX IF NOT EXISTS idx_orphan_allowed_groups_audit_user_id
|
||
ON orphan_allowed_groups_audit(user_id);
|
||
|
||
-- 记录迁移完成信息
|
||
COMMENT ON TABLE orphan_allowed_groups_audit IS
|
||
'审计表:记录 users.allowed_groups 中引用的不存在的 group_id,用于数据清理前的审计';
|