アプリ (DML) を止めずにテーブルレイアウトの変更などを可能にするオンライン再定義ですが、CAN_REDEF_TABLEプロシージャを使用することで、オンライン再定義可能なテーブルか確認することが可能です。
167.7.4 CAN_REDEF_TABLE Procedure
主キーがないテーブル (testtab) を作成しCAN_REDEF_TABLEプロシージャで確認するとエラーとなりました。
オンライン再定義には PK方式と ROWID方式があり、PK方式の場合は主キーが必要なためです。(デフォルトは PK方式)
SQL> info testtab
TABLE: TESTTAB
LAST ANALYZED:
ROWS :
SAMPLE SIZE :
INMEMORY :DISABLED
COMMENTS :
Columns
NAME DATA TYPE NULL DEFAULT COMMENTS
COL1 NUMBER Yes
COL2 VARCHAR2(30 BYTE) Yes
SQL> BEGIN
2 DBMS_REDEFINITION.CAN_REDEF_TABLE(
3 uname => 'admin',
4 tname => 'testtab'
5 );
6 END;
7* /
BEGIN
*
ERROR at line 1:
ORA-12089: cannot online redefine table "ADMIN"."TESTTAB" with no primary key ★
ORA-06512: at "SYS.DBMS_REDEFINITION", line 363
ORA-06512: at "SYS.DBMS_REDEFINITION", line 6836
ORA-06512: at line 2
https://docs.oracle.com/error-help/db/ora-12089/
More Details :
https://docs.oracle.com/error-help/db/ora-12089/
https://docs.oracle.com/error-help/db/ora-06512/
SQL>
方式を変更するにはoptions_flagオプションを指定します。
dbms_redefinition.cons_use_pkを指定すると PK方式、dbms_redefinition.cons_use_rowidを指定すると ROWID方式です。
このオプションはSTART_REDEF_TABLEプロシージャにも存在します。
dbms_redefinition.cons_use_rowidを指定することで正常終了しました。
SQL> BEGIN
2 DBMS_REDEFINITION.CAN_REDEF_TABLE(
3 uname => 'admin',
4 tname => 'testtab',
5 options_flag => DBMS_REDEFINITION.CONS_USE_ROWID ★ROWID方式
6 );
7 END;
8* /
PL/SQL procedure successfully completed.
SQL>
制約は他にもいくつかあるので、机上チェックだけでなくCAN_REDEF_TABLEプロシージャを使用して確認しておくと安心です。