## Context step2 套餐使用 SQL 已从 `tb_package` 读取流量、名称及价格配置快照,但遗漏计时条款快照列;新记录因此使用表默认空值和零值,触发数据库完整性校验失败。 ## Goals / Non-Goals **Goals:** - 从 SQL 已连接的目标套餐行直接写入四个计时条款快照。 - 保持现有套餐选择、状态、优先级和冲突幂等键不变。 **Non-Goals:** - 不修改套餐使用表、触发器或历史记录。 - 不推断或修正目标套餐自身的计时条款配置。 ## Decisions - 在 `INSERT` 列表和对应 `SELECT` 中加入 `p.expiry_base`、`p.calendar_type` 及按周期类型规范化后的时长快照:`natural_month` 保留 `p.duration_months` 并写零天数,`by_day` 保留 `p.duration_days` 并写零月数。这与正常下单的领域快照规则一致;目标套餐的非适用时长字段不进入使用记录快照。 - 不在 SQL 使用 `COALESCE` 或常量兜底有效时长。目标套餐配置无效时应由数据库完整性约束拒绝,不能静默写入错误快照。 ## Risks / Trade-offs - [目标套餐存在无效计时配置] → SQL 将被触发器拒绝;在正式执行前用隔离数据库检查生成 SQL,并修正目标套餐配置。 - [执行旧生成文件] → 仍会失败;必须重新生成并替换 `step2_02_package_usages.sql`。 ## Migration Plan 1. 修改生成器并重新生成 step2 输出。 2. 在隔离环境执行新的套餐使用 SQL,确认无快照触发器错误。 3. 维护者在生产环境按事务执行新生成文件;失败时事务自动回滚,无需数据回滚。