トップ > DBA上級 マルチテナント > 4章
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と変わりはありません。

いかがでしてでしょうか。今回はマルチコンテナデータベースでのユーザ管理についてご紹介していきました。