表转换过程 (★★★★★)

表转换过程 (★★★★★)

#abap #abap-dictionary #abap-tables

概览表

Change Type (变更类型) Adjustment (调整方式) Data Impact (数据影响)
字段顺序变化(非键) 无需调整
添加字段 ALTER TABLE
缩短字段/键 转换 (Conversion) 可能丢失
更改数据类型 转换 (Conversion) 可能失败

数据库结构调整方式

Method (方式) Data Loss Duration
DROP + CREATE 丢失所有数据
ALTER TABLE
Conversion (转换) 可能丢失
💡自动选择
如果表无数据 → DROP + CREATE
如果有数据 → 先尝试 ALTER TABLE,不行则转换

转换过程 (Conversion Process) — 7 个步骤

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
Step 1: LOCK TABLE (锁定表)
→ 禁止进一步结构变更
→ 停用所有依赖视图

Step 2: RENAME (重命名)
→ TAB → QCMTAB (临时表)
→ 删除所有索引

Step 3: CREATE NEW (创建新表)
→ 用新结构创建 QCM8TAB
→ 创建主索引
→ 此时 QCM8TAB 为空!

Step 4: COPY DATA (回填数据)
→ MOVE-CORRESPONDING: QCMTAB → QCM8TAB
→ 每 16MB 提交一次(释放并重获锁)
→ 缩短字段时多余内容被截断

Step 5: DROP OLD (删除临时表)
→ 删除 QCMTAB

Step 6: RENAME BACK + REBUILD (重命名+重建)
→ QCM8TAB → TAB
→ 重建二级索引
→ 重新激活依赖视图

Step 7: UNLOCK (释放锁)
转换期间表不可用
Step 2-6 期间,表不存在于数据库的原名下。
所有访问该表的程序无法运行
转换必须在非生产时间执行!

转换问题与风险

表空间溢出

1
数据同时存在于 QCMTAB + QCM8TAB → 存储需求翻倍
  • 如果表空间不足,转换终止
  • 解决:扩展表空间,然后在数据库工具中继续

键字段缩短

1
2
缩短前: KEY = 'ABC123' 和 'ABC123' (两条)
缩短后: KEY = 'ABC' (无法区分)
  • 只能加载回一条记录(随机选择)
  • 必须在转换前清理数据

类型不兼容

  • MOVE-CORRESPONDING 不支持的类型变更会导致终止
  • 需手动恢复原状态

处理终止的转换

使用事务 SE14(数据库工具):

Option (选项) When to Use (使用场景)
Continue adjustment 修正错误后继续转换
Unlock table 绝不在 Step 3/4 时使用(数据丢失)
1
2
3
SE14 → Enter Table Name → Edit → Analyze
→ 查看对象日志(Object Log)
→ Continue adjustment 或 Unlock table
⚠️绝对禁止
如果数据只在临时表中(Step 3/4 失败),绝不能选 Unlock table
否则原表为空,数据丢失。必须选 Continue adjustment。

ALTER TABLE 场景

不需要转换的修改(仅 ALTER TABLE):

  • 添加新字段
  • 修改字段顺序(非键字段)
  • Append 结构添加字段

考试/测试模式

Scenario/Keyword (场景/关键词) Answer (答案)
“转换期间原表是否存在?” 不存在(被重命名为 QCMTAB)
“转换失败在 Step 3/4,怎么办?” Continue adjustment(不能 Unlock)
“缩短键字段会怎样?” 无法区分的记录只保留一条
“添加字段需要转换吗?” 不需要(ALTER TABLE)
“数据回填用什么语句?” MOVE-CORRESPONDING
“每多少 MB 提交一次?” 16 MB