单元 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 个步骤。

📌显示答案
  1. LOCK TABLE — 禁止进一步结构变更,停用所有依赖视图
  2. RENAME — TAB → QCMTAB(临时表),删除所有索引
  3. CREATE NEW — 用新结构创建 QCM8TAB,创建主索引
  4. COPY DATA — MOVE-CORRESPONDING: QCMTAB → QCM8TAB,每 16MB 提交一次
  5. DROP OLD — 删除 QCMTAB
  6. RENAME BACK + REBUILD — QCM8TAB → TAB,重建二级索引,重新激活依赖视图
  7. 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’,无法区分。系统只能加载回一条记录(随机选择),另一条数据丢失

正确做法:必须在转换前:

  1. 使用 Where-Used List 分析影响
  2. 手动清理数据(合并或删除冲突记录)
  3. 确认没有键值冲突后再执行转换

问题 9 - 转换失败恢复 [application]

表转换在 Step 4(COPY DATA)期间因表空间不足而终止。此时数据处于什么状态?应该如何恢复?

📌显示答案
数据状态
  • QCMTAB(临时表):包含完整的旧数据
  • QCM8TAB(新表):部分填充了数据
  • 原表名 (TAB):不存在于数据库中

恢复步骤

  1. 使用事务 SE14 → 查看对象日志确认失败原因
  2. 扩展表空间
  3. 选择 Continue adjustment 继续转换
  4. 绝对不能选 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