4章 CDBでのユーザ管理
本章ではマルチコンテナデータベースでのユーザ管理方法について学んでいきます。
CDB,PDB上にユーザが存在する為、通常のデータベースと比較すると多少構成がことなります。
しっかり抑えて行きましょう。
マルチコンテナデータベースのユーザ
CDB,PDBのユーザは以下のユーザを作成できます。
・共通ユーザ
・ローカルユーザ
今回アプリケーション共通ユーザは紹介しません。
上記のユーザについて確認していきます。
共通ユーザ
共通ユーザとはCDB,PDBでログイン可能なユーザです。
SYS,SYSTEMユーザは共通ユーザであり、CDB,PDBにログインすることができます。
また新たに作成することも可能です。接頭辞にはC##(デフォルト)を付けて作成する必要があります。
ローカルユーザ
ローカルユーザは単一のPDBにログイン可能なユーザです。
各PDBごとに同じ名前のローカルユーザを作成可能ですが、スキーマは各PDBごととなり共有することはできません。
共通ユーザはルートDB(CDB)上で作成する必要があり、ルートDB上にオブジェクトを作成することも出来ます。
ただ、ルートDBは管理用のデータベースである為、アプリケーションで使用するオブジェクトはローカルユーザでPDB上に作成する方が望ましいです。
ユーザの作成と権限の付与
ユーザの作成方法は共通、ローカルユーザと変わりはありません。
共通ユーザはルートDB(CDB)で実行する必要があります。また接頭辞はC##が必要です。
[構文] 共通ユーザの作成
SQL> CREATE USER c##ユーザ名
2> [IDENTIFIED BY password]
3> [DEFAULT TABLESPACE data_ts]
4> [QUOTA 100M ON test_ts]
5> TEMPORARY TABLESPACE temp_ts]
6> [CONTAINER = ALL];
共通ユーザはC##接頭辞が必要です。
CONTAINER句は現在接続中のDB作成するか、PDB含めてすべてのDBに作成するかを指定します。
共通ユーザはALL以外は設定できません。
その他のコマンドはいつもと同じ構文です。
では共通ユーザを作成してみましょう。
SQL> show user
USER is "SYS"
SQL> sho con_name
CON_NAME
------------------------------
CDB$ROOT
SQL> create user c##comm_user identified by comm_user container = current;
create user c##comm_user identified by comm_user container = current
*
ERROR at line 1:
ORA-65094: invalid local user or role name
SQL> create user c##comm_user identified by comm_user container = all;
User created.
作成できました。上記の例の様にcontainer = currentはエラーになります。
共通ユーザ(C##COMM_USER)を作成できたので、権限を付与して接続してみます。
SQL> grant create session to c##comm_user;
Grant succeeded.
SQL> conn c##comm_user/comm_user
Connected.
SQL> show user
USER is "C##COMM_USER"
SQL> show con_name
CON_NAME
------------------------------
CDB$ROOT
SQL> conn c##comm_user/comm_user@pdb1
ERROR:
ORA-01045: user C##COMM_USER lacks CREATE SESSION privilege; logon denied
Warning: You are no longer connected to ORACLE.
権限付与にもCONTAINER句を設定できます。デフォルトはCONTAINER=CURRENTです。
CONTAINER=ALLの場合は、PDBを含めたすべてのDBにCREATE SESSION権限を与えます。
今回の例ではルートDB(CDB)のみのCREATE SESSION権限を付与しています。
他のPDBに接続する権限はありません。
次は、CREATE SESSION権限を取り消しした後で、CONTAINER=ALLで付与してみます。
SQL> show user
USER is "SYS"
SQL> revoke create session from c##comm_user;
Revoke succeeded.
SQL> grant create session to c##comm_user container = all;
Grant succeeded.
SQL> conn c##comm_user/comm_user
Connected.
SQL> show con_name
CON_NAME
------------------------------
CDB$ROOT
SQL> conn c##comm_user/comm_user@pdb1
Connected.
SQL> show con_name
CON_NAME
------------------------------
PDB1
接続できました。権限の取消し(REVOKEコマンド)の注意ですが、CONTAINER句はデフォルトCURRENTです。
CONTAINER=ALLで付与した権限はCONTAINER=ALLを明示的に指定しないと取り消しできません。
SQL> show user
USER is "SYS"
SQL> revoke create session from c##comm_user;
revoke create session from c##comm_user
*
ERROR at line 1:
ORA-65092: system privilege granted with a different scope to 'C##COMM_USER'
SQL> revoke create session from c##comm_user container = all;
Revoke succeeded.
またPDB上で共通ユーザは作成できません。
SQL> alter session set container = pdb1;
Session altered.
SQL> create user c##comm_user identified by comm_user;
create user c##comm_user identified by comm_user
*
ERROR at line 1:
ORA-65094: invalid local user or role name
ローカルユーザの作成
ローカルユーザの作成方法は一般ユーザの作成構文と同じです。
ユーザ作成はPDB上で実行します。CDB上には作成できません。
CONTAINER句はCURRENTであり、ALLは使用できません。
では試してみましょう。
SQL> alter session set container=pdb1;
Session altered.
SQL> show user
USER is "SYS"
SQL> show con_name
CON_NAME
------------------------------
PDB1
SQL> create user local_user identified by local_user container = all;
create user local_user identified by local_user container = all
*
ERROR at line 1:
ORA-65050: Common DDLs only allowed in CDB$ROOT
SQL> create user local_user identified by local_user container = current;
User created.
CDB上ではローカルユーザのエラーになります。
SQL> show user
USER is "SYS"
SQL> show con_name
CON_NAME
------------------------------
CDB$ROOT
SQL> create user local_user identified by local_user;
create user local_user identified by local_user
*
ERROR at line 1:
ORA-65096: invalid common user or role name
SQL> create user local_user identified by local_user container = current;
create user local_user identified by local_user container = current
*
ERROR at line 1:
ORA-65049: creation of local user or role is not allowed in CDB$ROOT
SQL> create user local_user identified by local_user container = all;
create user local_user identified by local_user container = all
*
ERROR at line 1:
ORA-65096: invalid common user or role name
CONTAINER句の部分は意識する必要がありますが、コンテナデータベース上でのユーザの作成は特に非CDBと変わりはありません。
いかがでしてでしょうか。今回はマルチコンテナデータベースでのユーザ管理についてご紹介していきました。