单元 6:表变更练习(10 道题)
单元 6:表变更练习(10 道题)
#practice #abap #abap-dictionary #abap-tables
相关概念
📌关键模式(点击展开)
| Keyword (关键词) | Answer (答案) |
|---|---|
| 添加字段 | ALTER TABLE(无需转换) |
| 缩短键字段 | 转换(可能丢失数据) |
| 转换期间原表 | 不存在(被重命名为 QCMTAB) |
| 数据回填语句 | MOVE-CORRESPONDING |
| 每 N MB 提交 | 16 MB |
| Append 命名规范 | YY 或 ZZ 开头 |
| Append 需要转换吗 | 不需要(ALTER TABLE) |
问题 1 - 转换触发条件 [recall]
哪些表结构变更只需要 ALTER TABLE?哪些需要触发完整转换 (Conversion)?
📌显示答案
仅 ALTER TABLE(无需转换):
- 添加新字段
- 修改字段顺序(非键字段)
- Append 结构添加字段
需要转换 (Conversion):
- 缩短字段长度或键字段
- 更改数据类型
- 删除字段
如果表无数据,系统直接使用 DROP + CREATE。
问题 2 - 转换 7 步骤 [recall]
列出表转换过程 (Conversion Process) 的 7 个步骤。
📌显示答案
- LOCK TABLE — 禁止进一步结构变更,停用所有依赖视图
- RENAME — TAB → QCMTAB(临时表),删除所有索引
- CREATE NEW — 用新结构创建 QCM8TAB,创建主索引
- COPY DATA — MOVE-CORRESPONDING: QCMTAB → QCM8TAB,每 16MB 提交一次
- DROP OLD — 删除 QCMTAB
- RENAME BACK + REBUILD — QCM8TAB → TAB,重建二级索引,重新激活依赖视图
- UNLOCK — 释放锁
问题 3 - 转换期间表状态 [recall]
在转换的 Step 2 到 Step 6 期间,原表在数据库中是什么状态?
📌显示答案
原表在数据库中不存在于原名下(Step 2 被重命名为 QCMTAB)。所有访问该表的程序无法运行。这就是为什么转换必须在非生产时间执行。
问题 4 - QCM 表命名 [recall]
转换过程中使用的两个临时表分别叫什么?各自的作用是什么?
📌显示答案
- QCMTAB:原表重命名后的临时表(保存旧数据),在 Step 2 创建,Step 5 删除
- QCM8TAB:用新结构创建的空表,在 Step 3 创建,Step 4 填充数据,Step 6 重命名回原表名
问题 5 - SE14 工具 [recall]
事务 SE14 有什么用途?当转换失败时,有哪些处理选项?
📌显示答案
事务 SE14(数据库工具)用于处理表调整问题。
- 可查看**对象日志 (Object Log)**了解失败原因
- 两个关键选项:
- Continue adjustment:修正错误后继续转换(推荐)
- Unlock table:解锁表
绝对禁止:如果数据只在临时表中(Step 3/4 失败),绝不能选 Unlock table,否则原表为空,数据丢失。必须选 Continue adjustment。
问题 6 - Append 结构特性 [recall]
Append 结构有哪些关键特性?
📌显示答案
| 特性 | 详情 |
|---|---|
| 一对一关系 | 一个 Append 结构只能分配给一个表 |
| 多个 Append | 一个表可以有多个 Append 结构 |
| 自动激活 | Append 结构创建/修改时,父表自动激活 |
| 类型可用 | Append 结构本身也是一个可用的类型 |
| 升级安全 | 客户命名空间,升级时不会被覆盖 |
| 字段命名 | 客户开发以 YY 或 ZZ 开头 |
问题 7 - Append 结构限制 [recall]
哪些类型的表不能使用 Append 结构?为什么?
📌显示答案
| 限制 | 原因 |
|---|---|
| 池表 / 簇表 | 不支持 Table Append |
| 含 LCHR/LRAW 字段的表 | 长字段必须在字段列表的最后位置,Append 结构会追加到末尾,导致位置冲突 |
- Append 结构添加的字段通过 ALTER TABLE 实现,不需要表转换
问题 8 - 缩短键字段风险 [application]
一个表的主键字段从 CHAR(6) 缩短为 CHAR(3)。当前有两条记录的键值分别为 ‘ABC123’ 和 ‘ABC456’。转换时会发生什么?
📌显示答案
缩短后两条记录的键值都会变为 ‘ABC’,无法区分。系统只能加载回一条记录(随机选择),另一条数据丢失。
正确做法:必须在转换前:
- 使用 Where-Used List 分析影响
- 手动清理数据(合并或删除冲突记录)
- 确认没有键值冲突后再执行转换
问题 9 - 转换失败恢复 [application]
表转换在 Step 4(COPY DATA)期间因表空间不足而终止。此时数据处于什么状态?应该如何恢复?
📌显示答案
数据状态:
- QCMTAB(临时表):包含完整的旧数据
- QCM8TAB(新表):部分填充了数据
- 原表名 (TAB):不存在于数据库中
恢复步骤:
- 使用事务 SE14 → 查看对象日志确认失败原因
- 扩展表空间
- 选择 Continue adjustment 继续转换
- 绝对不能选 Unlock table — 此时原表不存在,解锁会创建空表导致数据丢失
问题 10 - 增强策略分析 [analysis]
一家客户需要在 SAP 标准表 ZEMPLOY## 中添加三个自定义字段(部门代码、办公室号、电话号码)。有两种方案:(A) 直接修改 SAP 标准表添加字段;(B) 使用 Append 结构。分析两种方案的优劣。
📌显示答案
| 对比项 | 方案 A:直接修改 | 方案 B:Append 结构 |
|---|---|---|
| SAP 升级 | 可能被覆盖,字段丢失 | 升级安全,客户命名空间不受影响 |
| 表转换 | 可能触发转换 | 不需要(ALTER TABLE) |
| 命名规范 | 可能与 SAP 新字段冲突 | ZZ 前缀,避免冲突 |
| 维护 | 需要修改请求 | 独立的 Append 结构 |
推荐方案 B(Append 结构):
- 字段命名为 ZZDEPT、ZZOFFNR、ZZTELNO
- 一个表可以有多个 Append 结构(也可以合成一个)
- 创建后父表自动激活,通过 ALTER TABLE 添加字段
- 升级时不受影响
📌模式总结(点击展开)
| Keyword (关键词) | Answer (答案) |
|---|---|
| ALTER TABLE 场景 | 添加字段、修改顺序、Append |
| 转换场景 | 缩短字段/键、更改类型、删除字段 |
| 转换 7 步 | LOCK → RENAME → CREATE → COPY → DROP → RENAME BACK → UNLOCK |
| 转换期间原表 | 不存在 |
| 数据回填 | MOVE-CORRESPONDING,每 16MB 提交 |
| SE14 处理 | Continue adjustment(Step 3/4 失败时不能 Unlock) |
| Append 命名 | YY 或 ZZ 开头 |
| Append 限制 | 不能用于池表/簇表/含 LCHR-LRAW 的表 |
| 缩短键字段 | 冲突记录只保留一条 |
| 表空间不足 | 扩展表空间 + Continue adjustment |