PostgreSQL 基线与用户归属字段
状态:implemented 类型:simplification Owner:backend/yuxi/migrations/main.py
问题
MCP 授权、展示清理、身份策略和 UID 容量产生连续的一次性升级分支。保留这些部署历史增加初始化入口的维护成本,用户要求直接处理已有数据库,并让代码仅声明当前结构的版本 1 基线。
决策
实现方案
业务域版本为 1,知识域版本为 2;知识域目录与导入回执的版本调整及显式离线转换由目录与导入决定补充。ORM、索引和当前基线 DDL 拥有完整结构,包含 MCP 个人授权表、工具结果约束、活动 Run 唯一索引及知识库名称约束。app-init 在 advisory lock 内初始化空库、恢复自身未完成的空库初始化并同步共享内容;API/worker 只读校验准确版本。LangGraph 自有的 checkpoint setup 拥有其初始表结构。
删除历史增量脚本与版本分支,不增加版本别名、自动重标记或旧库兼容入口。部署侧对已有库的处理独立于应用初始化,不能仅凭相同的版本编号判定实际结构就绪。
企业 OIDC UID 长度为 69,部分归属列原有 VARCHAR(64) 无法写入。业务域 agents、skills 的创建者/更新者,skill_versions、api_keys 的归属,以及知识域 knowledge_files 的创建者/更新者、knowledge_bases、evaluation_datasets、evaluation_runs 的归属,共 11 列使用 VARCHAR(128)。保留 UID 算法、原值、权限、索引、外键与 NULL 语义;已有足够容量的 100/128 位列及无长度限制列维持原定义。metadata 守卫检查当前生成身份可写入所有 UID 消费列。
主库的结构调整、备份与版本维护由部署侧私有操作材料负责。只有完成实际结构核对后才能在事务中更新版本记录;数据处置不进入产品代码。历史 business v1→v4 的直接调整保留旧工具记录归档,仅在结构化结果已存在时清理重复审计正文,移除退役协作列并建立当前约束;后续业务域 1、知识域 1 的重置只更新两条版本记录,不代表结构升级。
替代方案
保留历史链条继续自动升级与本次精简要求不符;清库重建会丢失业务数据;把任意旧版本直接视为版本 1 会掩盖结构缺失,均不采用。
后果
新库直接获得当前结构与约束,普通企业用户可用完整 UID 创建和编辑私有资源。已有部署需要独立维护窗口;列宽调整存在 DDL 持锁,先备份并暂停消费者。当前代码不提供历史版本自动升级,数据操作失败不能通过改版本号绕过。未来改变身份格式时重新核对所有消费列,不通过截断 UID 或由超管代建规避容量问题。
验证
以下是实现与部署阶段已执行的证据,文档合并不代表重新执行数据库操作或业务测试。
| 证据 | 结果与边界 |
|---|---|
| Schema、app-init、UID 与 MCP 的真实 PostgreSQL/HTTP integration | 基线收敛阶段 56 passed;空库完整建立 1/1,重跑保留哨兵,未版本化旧表及 4/1、5/1、6/1、7/1、8/2 均拒绝自动升级 |
| UID 容量与隔离 | 当前基线核对 11 列完整写入、69/128 位 UID 经真实 HTTP 创建和更新私有 Agent,其他用户读取和更新被拒绝;企业普通用户浏览器自行创建、编辑与本人考勤的完整 UID、最终 Run 和工具审计回读一致 |
| 约束与初始化恢复 | 原基线的 21 项初始化与 22 项关系/访问路径测试通过,包含知识库名称约束、索引、进程终止后恢复及 LangGraph checkpoint 建表;其中旧版本专属 fixture 已随实现调整,不把旧命令直接当作当前集合 |
| 直接处理主库的结构与数据回读 | 消费者暂停且全部非终态 Run(含 cancel_requested)为零;同一 advisory lock 内确认结构完整后仅重置两条版本记录;52 张公开 schema 表的内容摘要及结构导出前后一致,版本为 1/1 |
| 服务恢复 | 当时 API readiness 返回 200,API/worker 健康,真实 API → worker → 考勤 MCP 用例 1 passed;基线阶段完整 unit 2883 passed、97 skipped、7 subtests;未完成的中断运行不计入通过 |
历史 business v1→v4 的直接操作回读 1,695 条归档工具记录和 1,648 条结构化结果,完整 dump 经 pg_restore 校验可读。该证据证明当次数据保留,不构成当前初始化器的升级能力;备份、摘要与一次性脚本均由部署私有目录保管。版本标记不能替代实际结构证明,历史 1/1 库也必须先完成结构核对。
原实现的相关生产代码及 UID/app-init/unit 文件 Ruff 通过;Schema integration 文件仍有原有 9 处 E501,完整文件检查不计为通过。工程契约及其 66 项 unit 通过,独立审查核对非终态 Run 和版本 fixture。
旧能力不存在:历史增量脚本、导入、版本分支及 UID 截断映射均不存在,旧版本拒绝测试证明初始化器不会自动升级。
重新引入条件:未来确有跨部署升级承诺时,另行定义适用版本、数据转换 Owner 与真实 PostgreSQL 证据;身份格式改变时重新核对消费列,不恢复本轮删除的历史链条。