Dの小部屋

忘れやすい私のメモ帳

Oracle オンライン再定義についての復習

内容

オンライン再定義を学習したはずなのに、思い出せなかったため、メモ。

確認

▼接続ユーザの確認

SQL> show user
ユーザーは"TTT"です。

▼再定義元のテーブルを作成

SQL> create table t01 (
  2    n number(1) PRIMARY KEY,
  3    v varchar2(10)
  4  );
表が作成されました。

SQL> insert into t01 values(1,'abc');
1行が作成されました。

SQL> insert into t01 values(2,'def');
1行が作成されました。

SQL> insert into t01 values(3,'ghi');
1行が作成されました。

SQL> commit;
コミットが完了しました。

▼仮テーブルを作成

SQL> create table t02 (
  2    n number(1),
  3    v varchar2(10),
  4    v2 varchar2(10)
  5  );
表が作成されました。

▼再定義できることを確認

SQL> set serveroutput on
SQL> exec dbms_redefinition.can_redef_table('TTT','T01', dbms_redefinition.cons_use_pk);
PL/SQLプロシージャが正常に完了しました。

▼再定義実行

sql> begin
  2    dbms_redefinition.start_redef_table(
  3    uname        => 'TTT',
  4    orig_table   => 'T01',
  5    int_table    => 'T02',
  6    options_flag => dbms_redefinition.cons_use_pk);
  7  end;
  8  /
PL/SQLプロシージャが正常に完了しました。

▼索引・制約のコピー

sql> declare
  2    num_errors pls_integer;
  3  begin
  4    dbms_redefinition.copy_table_dependents(
  5    uname         => 'TTT',
  6    orig_table    => 'T01',
  7    int_table     => 'T02',
  8    copy_indexes  => dbms_redefinition.cons_orig_params,
  9    num_errors    => num_errors);
 10  end;
 11  /
PL/SQLプロシージャが正常に完了しました。

▼再定義終了

SQL> begin
  2    dbms_redefinition.finish_redef_table(
  3    uname      => 'TTT',
  4    orig_table => 'T01',
  5    int_table  => 'T02');
  6  end;
  7  /
PL/SQLプロシージャが正常に完了しました。

▼確認

SQL> @desc t01
 名前                                    NULL?    型
 ----------------------------------------- -------- ----------------------------
 N                                                  NUMBER(1)
 V                                                  VARCHAR2(10)
 V2                                                 VARCHAR2(10)

SQL> @desc t02
 名前                                    NULL?    型
 ----------------------------------------- -------- ----------------------------
 N                                         NOT NULL NUMBER(1)
 V                                                  VARCHAR2(10)

SQL> select * from t01;
         N V          V2
---------- ---------- ----------
         1 abc
         2 def
         3 ghi

SQL> select * from t02;
         N V
---------- ----------
         1 abc
         2 def
         3 ghi

▼仮テーブルの削除

SQL> drop table t02;
表が削除されました。

以上