# LisgloSIPS V2 数据库 Schema 与迁移 Runbook ## 范围 本文对应 `S08 - 数据库 Schema 与迁移`。业务数据库使用 MySQL,Schema 由 `prisma/schema.prisma` 管理,初始化迁移位于 `prisma/migrations/20260621090000_init_v2_schema/`。 ## 本次产物 - `prisma/schema.prisma`:V2 核心业务表、索引、关系、枚举和审计列。 - `prisma/migrations/20260621090000_init_v2_schema/migration.sql`:从空库初始化的 SQL 迁移。 - `prisma/seed.ts`:内置权限和角色种子;不创建默认密码用户。 - `packages/database/src/schema-contract.spec.ts`:Schema 合同测试。 ## 标准初始化 只在空库或明确的新环境执行: ```bash export DATABASE_URL='mysql://@127.0.0.1:3306/' pnpm prisma:generate pnpm exec prisma migrate deploy pnpm db:seed ``` `DATABASE_URL` 示例不包含密码。实际凭据必须来自受控 Secret 文件或部署环境变量,禁止写入仓库。 ## 验证命令 ```bash pnpm prisma:validate pnpm typecheck pnpm test pnpm build ``` 数据库侧验收: ```bash pnpm exec prisma migrate deploy pnpm exec prisma migrate status pnpm db:seed pnpm db:seed ``` 重复执行 `migrate deploy` 和 `db:seed` 应安全:迁移不会重复应用,seed 使用 upsert。 ## 回滚与恢复 初始化迁移只允许用于空库。若在临时库验证失败: ```sql DROP DATABASE ; DROP USER ''@'127.0.0.1'; DROP USER ''@'localhost'; ``` 生产或准生产环境禁止依赖破坏性 down migration 回滚。若迁移已进入共享环境,应优先发布向前兼容修复迁移;上线窗口不执行不可逆删列。 ## 重要约束 - 金额字段统一 `DECIMAL(20,6)`。 - 充值、CDR、审计日志不做物理删除。 - `raw_cdrs.event_id` 和 `raw_cdrs.call_id + ended_at` 保证 CDR 幂等。 - 充值表和 `idempotency_keys` 均有幂等唯一键。 - 所有管理类表包含 `created_at`、`updated_at`、`created_by`、`updated_by`、`version`。 - 密码字段只保存 hash 或 SIP Digest HA1,seed 不写入明文密码。