はじめに

こんにちは。Oracle Databaseの検証チームです。
今回は、Oracle Database 23aiの新機能である「読み取り専用ユーザ」をご紹介いたします。

Oracle Database 23aiに関する過去記事はこちら

今回の執筆者はORACLE MASTER Bronze DBA 2019を取得しました!に登場した事業部員です。

読み取り専用ユーザについて

読み取り専用ユーザとは

Oracle Database 23aiから、
データベースに接続しているユーザーの権限に関係なく、ユーザまたはセッションが
読み取り/書き込み操作を有効、または無効にするかどうかを制御する新しい機能が導入されました。

読み取り専用ユーザは、任意のデータベースユーザを「読み取り専用モード」へ変更することで、
書き込み不可となり、読み取りのみできるようになったユーザのこと
です。

この機能により、接続した際に誤って変更や削除コマンドを実行しても、適用される心配がなくなります
また、用途に合わせてユーザを制御できるため、柔軟性やセキュリティ強度の向上が期待できます。

なお、読み取り専用ユーザは、PDBローカルデータベースユーザーにのみ適用されます。

読み取り専用ユーザの検証

ここからは、実際に読み取り専用ユーザの検証をします。

手順の流れ

今回は以下のような流れで検証していきます。

    1. ユーザの作成と読み取り専用モードの有効化
    2. DML文の実行
    3. 接続し直し、SELECT文で状態確認
    4. 読み取り専用モードの無効化

ユーザの作成と読み取り専用モードの有効化

PDBユーザを作成し、SELECT文で読み取り専用モードが無効(READ ONLY)であることを確認します。
ユーザ名は「test_user」とします。

SQL> create user test_user
2 identified by "WelCome##123";
SQL>
SQL> select READ_ONLY from user_users where username='test_user';

READ_ONLY
---------------
NO

次に読み取り専用を有効(READ ONLY)にし、SELECT文で変更されたことを確認します。

SQL> alter user test_user READ ONLY;

User altered.
SQL>
SQL> select READ_ONLY from user_users where username='test_user';

READ_ONLY
---------------
YES

 

ちなみに共通ユーザで読み取り専用モードを有効(READ ONLY)に変更しようとすると、以下のようにエラーになります。

SQL> alter user test_user READ ONLY;
alter user test_user READ ONLY
*
ERROR at line 1:
ORA-28192: Enabling or disabling read-only property is not allowed on a common user.
Help: https://docs.oracle.com/error-help/db/ora-28192/

※ORA-28192: 共通ユーザでは読み取り専用プロパティを有効化または無効化することはできません。

 

DML文の実行

ユーザの読み取り専用モードを有効にした状態で、DML文(データ操作言語)を実行し、エラーになることを確認します。

SQL> create table test_table(value varchar(10));
create table test_table(value varchar(10))
*
ERROR at line 1:
ORA-28194: Can perform read operations only
Help: https://docs.oracle.com/error-help/db/ora-28194/

期待通り、「ORA-28194: Can perform read operations only(読み取り操作のみ実行可能)」エラーが出力されました。

接続し直し、SELECT文で状態確認

一度接続を切断し、再度対象ユーザで接続し直します。
ここでは、一度切断しても読み取り専用モードが解除されていないことを確認します。

[oracle@basedb-tky ~]$ sqlplus test_user/WelCome##123@pdb1

省略

Connected to:
Oracle Database 23ai Enterprise Edition Release 23.0.0.0.0 - for Oracle Cloud
Version 23.4.1.24.06

SQL> 
SQL> show user
USER is "TEST_USER"
SQL> 
SQL>select READ_ONLY from user_users where username='test_user';

READ_ONLY
---------------
YES

読み取り専用モードが有効であったため、
一時的なセッションのみの変更ではないことが確認できました。

読み取り専用モードの無効化

読み取り専用を無効(READ WRITE)に変更します。
また、SELECT文で状態確認し、READ ONLYが無効であることであることを確認します。

SQL> alter user test_user read write;

User altered.

SQL>
SQL> select READ_ONLY from user_users where username='test_user';

READ_ONLY
---------------
NO

読み取り専用ユーザは、読み取りしかできないため、
自分自身で読み取り専用モードを無効(READ WRITE)にはできません。
変更しようとすると、先ほどと同様にORA-28194エラーが出力されます。
そのため、別の管理ユーザから入り、変更する必要があります。

SQL> alter user test_user read write;
alter user test_user read write
*
ERROR at line 1:
ORA-28194: Can perform read operations only
Help: https://docs.oracle.com/error-help/db/ora-28194/

おわりに

いかがでしたでしょうか。

今回は読み取り専用ユーザについて紹介、検証をしてみました。
読み取り専用モードへの変更の手軽さを実感しました。
みなさまもぜひ試してみてください。

最後までお読みいただきありがとうございました。

Oracle 23aiに興味をお持ちのお客様、是非お気軽にお問合せください!
お問い合わせはこちら

投稿者プロフィール

技術チーム
技術チーム
DBひとりでできるもんを盛り上げるべく、技術チームが立ち上がり早6年。ひとりでできるもんと言いつつ、技術者が読んでプッとなるような、極めてピンポイントでマニアックな技術ネタを執筆しています!