ABAP changes to database table

来源:互联网 发布:java多线程编程题代码 编辑:程序博客网 时间:2024/06/06 17:56

Abap程序正确使用数据库表的前提条件是数据字典tableruntime object必须与数据库中的表保持一致。当abap dictionary中的table被修改时你必须得确认相应的数据库中table的信息是否也需要被调整,不是abap dictionarytable的任何修改都需要在数据库中做相应的调整,比如调整tablefields的顺序就不需要反映导数据库中,key fields除外。

当改变ABAP dictionary定义的时候,可以通过三种方式调整数据库中的表:

l         数据库中的table被删除然后重新创建,表中的内容将会丢失。

l         修改表的catalog,数据库中表的definition只是被简单的修改,数据仍然保留。但是索引应该需要重新创建。

l         Covert table。这样可能会花费大量的时间。

表中没有数据时,数据表会被删除然后重新创建,如果表中有数据就会通过alter table的方式来实现,如果不能够实现就会通过covert table的方式来实现。

Tableconversion的过程当中,数据库中不会存在与dictionary同名的表,所以相应的程序将会得不到这张表,所以在conversion table时应尽量避免相关业务正在运行的情况。Tableconvert的过程当中,需要有两份数据同时存在,所以在convert大表时应当考虑存储空间是否够用。数据库会在每16M的数据被convert后执行一次commit。所以rollback segment也需要至少16MB的存储空间。Commit之后需要的lock就会被释放掉,直到下16M的数据被请求时就会产生新的锁。

如果你减少了key fields,一个key对应多条记录的情况只能有一条记录保留,不能确定那条记录会被保留,所以在这种情况下应当先对表中的数据进行清理。如果conversion terminatelock仍然存在,并产生restart log。在conversion过程中,数据库表的original name不会存在,所以不要在productionconvert table。在conversion之前你必须deactivate跟这个表相关的所有的applications。如果conversion由于某种原因比如tablespace overflow,相应的application也不能正常运行,你必须找的terminate的原因然后continue直到completeConversion可能会导致的问题:

l         Tablespace overflow

l         Data loss if key is reduced in size

l         Invalid change of type

conversion中数据的copy是通过MOVE-CORRESPONDING来实现的,所以只有那些可以让MOVE-CORRESPONDING正常执行的type改变才能在conversion中被允许。否则就会导致conversion terminate。这种情况下你就不得不把表恢复到conversion之前的状态。通过数据库工具删除QCM8表,将QCM表重新命名为原始名。重新创建runtime object(在数据库层次)。在dictionary中把table structure改回到原始状态,然后重新激活这个表。

conversion terminatelock依然存在,你将无法通过dictionary编辑table。你可以通过se14分析terminate原因并继续进行conversion。通过这个utility你可以分析错误的原因以及当前正在conversion的表的状态。可以通过object log来查看错误的原因还可以查看dumpsyslog。如果错误被排除可以通过点击continue来继续conversion。也可以unlock a table,不过如果数据仅存在于temporary table中就要禁止unlock table

Append structure可以使你在不修改标准表的情况下为表添加客户字段。一个append structure只能添加给一个表,一个表可以拥有多个append structure。当一个表被激活所有激活的append structure的字段就会被发现,他们也会被增加到相应的表中。当append structure被创建或修改时,相应的表也会被激活,相应的变化也会被反映。在ABAP程序中append structure可以像普通的structure type一样使用。4.6C以后,append structure中的字段在table中激活后可以用于foreign keysearch help

Append structure是在customer namespace中定义的,所以其不会受sap version upgrade的影响。在升级的过程当中,新的表被导入,那么激活的append structure中的字段也会被自动加入新的表当中。Abap dictionary中的字段顺序与数据库中的可以不同,所以在添加append structure或者在append structure中增加字段时不需要covert table。这些字段在数据库中都是被加入到了最后面,你可以通过alter table来调整数据库中表的结构。关于append structure的几点注意事项:

l         Pooled tablecluster table不能创建append structure

l         如果长字段(LCHR LRAW)在表中存在,那就不能使用append structure,因为这些字段必须位于表的最后

l         如果在SAP standard table中创建append structure,那么这些字段应当以ZZYY开始,以避免与标准字段的名字冲突。

l         如果作为合作伙伴,你有自己的namespace那么这些字段的命名也应当在这个命名空间中。

原创粉丝点击