Files
wyndham-ARR/database/APPLIED_MIGRATIONS.md
2026-07-29 16:38:05 +08:00

145 lines
7.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# ARR 测试数据库已执行记录
更新时间2026-07-29
状态ARR 数据落库 MVP v1、OSS 取件授权与 MCP 直接结构化结果提交基础已迁移到远程测试库并验收。
## 目标与隔离
- PostgreSQL`<ARR_DB_HOST>:5432`
- 数据库:`booking_test`
- 当前测试用户:`<TEST_DB_OWNER>`(数据库 owner、非超级用户尚非生产最小权限账号
- schema`ingestion``booking``finance`
- `public` 用户对象0
- 共享维护数据库 `postgres`:未修改
- 当前配置:`/path/to/private/booking-test-db.env`,权限 `0600`
- 旧 LAN 源库:`<LEGACY_DB_HOST>:5433/booking_test`,只读保留作临时回退
- 旧 LAN 配置:`/path/to/private/booking-test-lan-db.env`,权限 `0600`
应用和后续专项默认使用远程配置;只有明确执行回退核查时才使用 LAN 配置。本文不记录密码。
## 当前权威迁移
| 迁移 | SHA-256 | 状态 |
|---|---|---|
| `008_arr_mvp_v1_rebuild.sql` | `a29df928a2bcfca262216a9d53260528374b830266b3285f3687199cb802a530` | 已提交并验收 |
| `009_source_read_grants.sql` | `69c1dcea29b5148f4bf4aab4bd7e606109547849f6722d59bffd1ac756ecd8f8` | 已提交并验收 |
| `010_mcp_result_ingestion.sql` | `480a9d1c039d1b45aaa86e90470ef3f7057972be056731f0513a372588bffcf1` | 已提交并验收 |
`008``booking_test` 内仅重建 `ingestion``booking``finance` 三个 schema。它取代 001007 所形成的旧 schema 状态001007 文件只保留为历史记录,不得再对当前库补跑。
执行门禁:
- `current_database()` 必须为 `booking_test`
- 执行前核对旧库表计数和备份 manifest
- 整个重建在一个事务内完成;
- 不触碰 `public` 或其他数据库。
当前对象17 张基础表(`ingestion=8``booking=5``finance=4`、8 个视图、2 个约束触发器,未验证约束为 0。
## 009/010 增量迁移
`009` 新增 `ingestion.source_read_grants`,用于受控运行时的短时、单次源 XML 取件授权。表内不保存 OSS 密钥、URL 或 XML 内容。
`010` 按当前数据量收敛为单一 MCP 工具 `arr_submit_processing_result` 的入库账本:
- 新增 `ingestion.result_submission_grants``ingestion.result_submissions`
- 不创建 batch 表,也不保存明文 grant、数据库密码或 OSS 密钥;
- 单次 structured payload 上限为 3 MiB必须显式包含与 `record_count` 一致的 `records` 数组;
- grant 最长 30 分钟,只能在有效期内消费,且绑定唯一 processing attempt
- `payload_sha256` 索引故意不唯一,允许同一份 XML 在不同 run/attempt 下反复联调;
- 同一 attempt 仍由唯一 grant/submission 约束幂等,最终 Finance 事实继续使用现有版本身份去重;
- 终态必须清除可能含住客字段的临时 `payload_json`,只保留哈希、计数、状态和最小回执;
- `processing_runs``daily_versions` 新增 `result_delivery_mode`,旧行全部默认为 `artifact_callback`,新链路显式使用 `direct_mcp`
`010` 正式提交前已完成未提交事务探针、已提交 up/down 演练和独立恢复验证。正式提交后两张新表均为空旧表计数不变batch 表不存在,所有约束均已验证。
`010_mcp_result_ingestion.down.sql` SHA-256`ec937b7c046eaaaccc1e95466ef3e9367cab622cddceaecbab0e9570bbbc5c79`。回滚脚本只允许在新表无任何记录且无 `direct_mcp` 业务数据时使用。
## 远程完整迁移
2026-07-28 已把完整 MVP v1 结构、数据、identity sequence 状态和处理审计从旧 LAN 测试库迁移到当前远程测试库。
- 执行记录:`database/REMOTE_MIGRATION_20260728.md`
- 迁移前备份:`<PRIVATE_BACKUP_ROOT>/booking_test_pre_remote_migration_20260728T180747+0800`
- manifest SHA-256`db8ca84fed52123d10151b475aca31659be237c6e7d513484e4f25b1d9a89c4d`
- 双端结构 signature`0d64002b919d439dbbbbf78d1f5c5fab86d8f815f80dc6225f17a91ab5455e38`
- 双端 14 表内容 hash bundle`42faf898d67b3015e85baf00bbd66a1fa4448d80daa7f5d9d0207a4004fad35c`
- 迁移方式:完整事务回滚演练通过后正式提交;提交后再由独立只读连接复验
- 源库:未修改、未删除,观察期内保留
## 重建前备份
- 目录:`<PRIVATE_BACKUP_ROOT>/booking_test_pre_mvp_v1_20260728T161638+0800`
- manifest SHA-256`af0e7bec364ccbfe342bbb20ea5e3d44a31ba8fe22134b91a3f79d4bac3c1a7c`
- 内容:旧 20 张基础表的 gzip JSON 数据,以及列、约束、索引、视图和 sequence 元数据
- 完整性:逐文件 SHA-256 与 gzip 校验均通过
该备份可用于人工恢复旧测试基线;未执行恢复。
## 已导入预订样本
来源:`outputs/res_comment_20260727/RES_COMMENT_TYPE_OF_ROOM.md`
- 文件 SHA-256`ec2302170c5657d3e465691997e17f7694eb5a7f76feba7e43261632209b8c23`
- source batch1
- source rows867
- accepted parse versions867
- current row parses867
- room items867
- 不同 Group Code348
- 重复 Group Code122
- 工作表6
867 条来源行逐行保存,没有按 Group Code 合并;每条都保留工作表、行号、原文、数量和行哈希。重复导入返回 `already_applied_and_verified`,没有新增重复记录。
当前 MD 是用于跑通流程的预期结果样本,每行已经给出一个可查询房型,因此当前每行对应一个 room item。未来真实预订 Excel 仍由 Agent 输出行级 JSON 和一个或多个 room items。
## 已导入 Finance 合成日报
受控 fixture`outputs/database_fixtures/2026-07-27`
- DeliveryEnvelope SHA-256`dc227c099b15c559874a3612dbda398494962b4200a8af15c973f7e84850a2`
- 业务日期:`2026-07-27`
- source records3
- outcomes`retained=1``duplicate=1``excluded_rate_code=1`
- current daily version1
- 正式 retained 事实1
- 月报投影1 行
- 渠道明细投影1 行
- 公司报表源投影1 行
- Group Code`LT260720GAA`
- Booking Room 查询结果:`DBL × 1`
- `total_price`5400`1800 × 1 × 3 = 5400`
该 fixture 只含合成字段不含真实住客数据。它通过真实日报处理器、ARR 独立复验和正式 PostgreSQL repository 落库。幂等复跑计数不变。
## 最终验收
只读数据库验收结果:
- `booking`867/867/867/867 source/parse/current/item
- `finance`1 daily version、1 current pointer、3 all-outcome records
- 业务视图中非 retained 泄漏0
- 总价公式违规0
-`file_objects``processing_jobs``report_versions` 等关系0
- 未验证约束0
- `public` 用户对象0。
应用只读验收结果:
- 渠道 BI1 个渠道、1 条预订;
- 渠道明细1 行;
- 月报生成源1 行;
- QBD 公司报表源1 行Booking Room 为 `【DBL】1`
- Web 日报列表1 条;
- Web 月度数据源投影1 条。
完整自动化测试共 194 项192 项通过2 项仅因默认环境未配置可选 XLSX 渲染工具而跳过。最终代码同步后又执行了 65 项相关回归并全部通过,其中 Web 新 schema 契约与 Web 回归为 14 项。
## 当前模型的重要含义
- PostgreSQL 保存已验收的工件身份、预订事实、全部日报 outcome、current 指针和渠道指标。
- 月报行、渠道明细行、公司 10 日报表行由普通程序查询当前事实生成,不再重复存储 `report_versions` 或 report 行表。
- 生成的 XLSX/JSON 可以保存在私有 OSS 或受控输出目录,但不是重复的数据库业务事实。
- 后续变更必须新增迁移,不得编辑已执行的 `008`