---
name: database-change
when: '数据库变更, 表结构修改, migration, DDL, 加字段, 建表, 索引, 数据迁移, 表结构变更'
scope:
  - backend
products:
  - '*'
id: ka-artifact_template-database-change
asset_kind: artifact_template
lifecycle_status: active
authority: supporting
routes:
  - '*'
primary_triggers:
  - 数据库变更
  - 表结构修改
  - migration
  - DDL
  - 加字段
  - 建表
  - 索引
  - 数据迁移
  - 表结构变更
priority: P2
specificity: 3
version: 1.0.0
last_reviewed: '2026-05-22'
consumes: []
emits:
  - acceptance_report
secondary_triggers: []
negative_triggers: []
type: acceptance_template
status: active
---

## 验收项
- [AC-01] migration 脚本有对应回滚脚本 (check: ls U{version}__*.sql {dir})
- [AC-02] migration 脚本幂等（可重复执行不出错） (check: grep -c 'IF NOT EXISTS\|IF EXISTS' {file})
- [AC-03] 新增列有默认值或允许 NULL（向前兼容） (check: grep 'ALTER TABLE.*ADD COLUMN' {file} | grep -c 'DEFAULT\|NULL')
- [AC-04] migration 脚本无业务逻辑（无 SELECT/INSERT/UPDATE 业务数据） (check: grep -ic 'INSERT INTO\|UPDATE.*SET' {file})
- [AC-05] 大数据量迁移使用分批策略（每批 1000 条） (check: grep -c 'LIMIT.*OFFSET\|BATCH\|分批\|batchSize' {file})
- [AC-06] 禁止 DROP COLUMN（应标记 deprecated 后续清理） (check: grep -ic 'DROP COLUMN\|DROP TABLE' {file})
- [AC-07] 新建索引评估对大表的影响（>100 万行使用 ONLINE DDL） (check: grep -c 'ONLINE\|ALGORITHM\|pt-online' {file})
- [AC-08] 字段命名遵循项目约定（snake_case，无缩写歧义） (check: grep -P '[A-Z]' {file} | grep -v '^\s*--' | head -5)
- [AC-09] 迁移脚本是否向前兼容（先加列后删列，先加索引后删除旧索引） (check: grep -c 'ADD.*COLUMN\|ADD.*INDEX' {file})
- [AC-10] 是否有回滚脚本并在测试环境验证通过 (check: ls {dir}/rollback_*.sql {dir}/down_*.sql 2>/dev/null | wc -l)
- [AC-11] 新增字段是否有默认值（非 NULL 列必须有 DEFAULT） (check: grep 'ADD COLUMN' {file} | grep -cv 'DEFAULT\|NULL')
- [AC-12] 新增索引是否评估对写入性能的影响（大表需评审） (check: grep -c 'CREATE.*INDEX\|ADD.*INDEX' {file})
- [AC-13] 大表变更是否使用 ONLINE DDL（避免锁表） (check: grep -c 'ALGORITHM.*INPLACE\|ALGORITHM.*ONLINE\|pt-online\|ONLINE' {file})
- [AC-14] 数据迁移脚本是否有数据校验步骤（迁移前后行数对比/哈希校验） (check: grep -c 'COUNT(\*)\|checksum\|MD5\|SHA\|校验\|验证' {file})
- [AC-15] 迁移脚本是否纳入版本控制（Git tracked） (check: git ls-files {file} | wc -l)
