Oracle Databaseでは、特定のテーブルを一時的に更新不可にして参照専用として扱いたい場面があります。そのような場合に利用できる機能の一つがALTER TABLE … READ ONLYです。
この記事では、ALTER TABLE … READ ONLYの仕組みや、実行するとテーブルにどのような制限がかかるのか、通常のロックとの違い、利用時に注意すべきポイントについて詳しく解説します。
Oracle DatabaseのALTER TABLE READ ONLYとは
ALTER TABLE … READ ONLYは、Oracle Databaseでテーブルを読み取り専用状態に変更するためのSQL文です。
この設定を行ったテーブルでは、SELECTによる参照は可能ですが、INSERT、UPDATE、DELETEなどのデータ変更操作は実行できなくなります。
例えば、月次集計が完了した売上テーブルや、監査用に保存している履歴テーブルなど、一定期間データを変更されたくない場合に利用できます。
ALTER TABLE READ ONLYはロックとは異なる
ALTER TABLE … READ ONLYを実行すると、テーブルが参照専用になりますが、これは一般的なロックとは仕組みが異なります。
通常のロックは、あるトランザクションが処理中のデータを他の処理から保護するために一時的に発生するものです。一方、READ ONLY設定はテーブル属性を変更し、データ変更操作そのものを禁止する機能です。
| 項目 | ロック | ALTER TABLE READ ONLY |
|---|---|---|
| 目的 | 同時更新による競合防止 | テーブルへの変更禁止 |
| 期間 | トランザクション単位など | 設定解除まで継続 |
| SELECT | 状況により待機する場合あり | 可能 |
| UPDATEやDELETE | ロック状態による | 実行不可 |
そのため、READ ONLYは「テーブルを一時的にロックする」というより、「変更操作を許可しない状態へ変更する機能」と考えると分かりやすくなります。
ALTER TABLE READ ONLYの基本的な使用方法
テーブルを参照専用に変更する場合は、以下のようなSQLを実行します。
ALTER TABLE テーブル名 READ ONLY;
例えば、SALES_TABLEというテーブルを読み取り専用にする場合は次のようになります。
ALTER TABLE SALES_TABLE READ ONLY;
実行後、そのテーブルに対してデータ変更を行おうとするとエラーになります。
UPDATE SALES_TABLE
SET AMOUNT = 1000;
このような更新処理は拒否されるため、誤操作によるデータ変更を防ぐことができます。
参照専用にしたテーブルを元に戻す方法
READ ONLYに設定したテーブルは、必要に応じて再び変更可能な状態へ戻すことができます。
解除する場合はALTER TABLE … READ WRITEを使用します。
ALTER TABLE テーブル名 READ WRITE;
例えば、SALES_TABLEを通常の更新可能な状態へ戻す場合は以下のように実行します。
ALTER TABLE SALES_TABLE READ WRITE;
この操作後は、通常通りINSERTやUPDATE、DELETEなどのデータ変更処理が可能になります。
ALTER TABLE READ ONLYを利用する場面
ALTER TABLE READ ONLYは、データを完全に固定したい場面で役立ちます。
例えば、次のようなケースがあります。
- 月次締め処理後の売上データを保護する
- 監査対象となる履歴データを変更不可にする
- マスターデータの誤更新を防止する
- 分析用データを一定期間固定する
具体例として、毎月1日に前月分の売上テーブルを確定させる運用では、集計完了後にREAD ONLYへ変更することで、誤った修正や削除を防ぐことができます。
ALTER TABLE READ ONLYを使用する際の注意点
READ ONLY状態ではデータ変更ができないため、アプリケーションやバッチ処理が対象テーブルへ書き込みを行っていないか確認する必要があります。
例えば、夜間バッチが対象テーブルへINSERTする設計になっている場合、READ ONLY設定後にバッチエラーが発生する可能性があります。
また、READ ONLYはテーブル単位の設定であるため、関連する複数テーブルを同時に保護したい場合は、それぞれのテーブルへ設定する必要があります。
まとめ
Oracle DatabaseのALTER TABLE … READ ONLYは、対象テーブルを参照専用状態に変更する機能です。SELECTによる参照は可能ですが、INSERT、UPDATE、DELETEなどの変更操作は禁止されます。
ただし、これは一時的なロックではなく、テーブル属性を変更して更新を禁止する仕組みです。データ保護や履歴管理、確定済みデータの保全などで活用できます。
利用する際は、通常のロックとの違いを理解し、アプリケーションやバッチ処理への影響を確認した上で適切に設定することが重要です。


コメント