テーブルを read only に変更できる

Oracle11g より、テーブルレベルで読み取り専用モードの設定が可能となった。
まず事前状態を確認するためには、dba_tables テーブルを参照すればよい。


例として、TEST スキーマの HOGE テーブルを変更する手順を紹介する。



事前確認

SQL> select table_name, status, read_only from dba_tables where table_name = 'HOGE';

TABLE_NAME   STATUS   READ_ONLY
------------ -------- ---------
HOGE         VALID    NO

READ_ONLY が NO (書き込みモード) となっている。

読み取り専用へ変更

SQL> alter table HOGE read only;

表が変更されました。

モード変更確認

SQL> select table_name, status, read_only from dba_tables where table_name = 'HOGE';

TABLE_NAME   STATUS   READ_ONLY
------------ -------- ---------
HOGE         VALID    YES

READ_ONLY が YES (読み取りモード) に変更された。

意図的にエラー(ORA-12081)を発生させてみる

  • insert を実行
  • SQL> insert into HOGE values('33333','33333');
                *
    行1でエラーが発生しました。:
    ORA-12081: 表"TEST"."HOGE"で更新操作は許可されません。
    

  • truncate table を実行
  • SQL> truncate table HOGE;
                   *
    行1でエラーが発生しました。:
    ORA-12081: 表"TEST"."HOGE"で更新操作は許可されません。
    

    → READ_ONLY の機能が有効になっていることを確認。

  • select を実行
  • SQL> select * from HOGE;
    
    COL1        COL2
    ----------- -----------
    11111       11111
    22222       22222
    

    → 当然、READ_ONLY でも参照は可能。

    書き込みモードへ戻す

    SQL> alter table HOGE read write;
    
    表が変更されました。
    

    戻し確認

    SQL> select table_name, status, read_only from dba_tables where table_name = 'HOGE';
    
    TABLE_NAME   STATUS   READ_ONLY
    ------------ -------- ---------
    HOGE         VALID    NO
    

    → READ_ONLY が NO (読み書きモード) に変更された。

    試行

  • insert を実行
  • SQL> insert into HOGE values('33333','33333');
    
    1行が作成されました。
    
  • truncate table を実行
  • SQL> truncate table HOGE;
    
    表が切り捨てられました。