本コンテンツはORACLE MASTER Gold DBA 2019(Oracle Database AdministrationⅡ)の試験トピックであるOracle Multitenant Architectureに関する内容をご紹介します。今回は「マルチテナント環境のユーザー、ロールについて」の問題を解きながら詳しく解説していきます。
————————————————-
それでは問題文を確認していきましょう。
コンテナ・データベースCDB1には2つのプラガブル・データベースであるPDB1とPDB2が作成されています。以下、A~Eのユーザー作成の操作を行いました。尚、COMMON_USER_PREFIXの設定はC##となっています。
A. CDB$ROOTコンテナで「create user C##ADMIN identified by oracle_4U;」を実行
B. CDB$ROOTコンテナで「create user ADMIN identified by oracle_4U container=all;」を実行
C. PDB1コンテナで「create user C##USER1 identified by oracle_4U container=all;」を実行
D. PDB1コンテナで「create user USER1 identified by oracle_4U;」を実行
E. PDB2コンテナで「create user USER2 identified by oracle_4U container=current;」
操作結果として正しい内容を述べているものを選択してください(2つ選択してください)。
- Aの操作を実行すると container=all の指定が無いのでエラーになる。
- Bの操作を実行すると各コンテナにADMINという共通ユーザーが作成される。
- Cの操作を実行すると各コンテナにC##USER1という共通ユーザーが作成される。
- Dの操作を実行するとPDB1にUSER1というローカル・ユーザーが作成される。
- Eの操作を実行するとPDB2にUSER2というローカル・ユーザーが作成される。
(解説)
それでは解説していきましょう。今回の問題はコンテナ・データベース内にユーザーを作成する内容となります。従来の非CDBであれば使用するDBが1つなのでユーザーやロール作成において特に気にすることはありませんでしたが、CDBは複数のコンテナが存在しますので、どのコンテナでユーザーやロールの作成作業を行うか?という点を注意して操作する必要があります。
マルチテナント環境ではユーザー作成の場合「共通ユーザー」「ローカル・ユーザー」の違いを意識し、ロール作成でも「共通ロール」「ローカル・ロール」を意識して作成する必要があります。まずは以下の内容を確認しましょう。
共通ユーザーや共通ロールは、その名のとおり、すべてのコンテナ(将来作成するコンテナも含め)に共通して存在するリソースになります。事前定義として作成されているものがあり、共通ユーザーであれば「SYS」や「SYSTEM」といったユーザーで、共通ロールであれば「DBA」ロールなどが該当します。すべてのコンテナに存在するリソースとなるため、共通ユーザーは主に各コンテナの管理に使用し、共通ロールはコンテナ間の権限付与の利便性を考慮して使用するとよいでしょう。
この共通ユーザーや共通ロールはユーザーが新規で作成することも可能です。その場合はユーザー名やロール名の接頭辞として「C##」を付ける必要があります。また共通ユーザーや共通ロールの作成は、必ずCDBのルート・コンテナから行う必要があり、特定のPDBから作成することはできません。
次にローカル・ユーザーとローカル・ロールですが、これは従来の非CDBの環境で作成していたユーザーやロールの役割と同じと考えて問題ありません。特定のPDBのみに存在するユーザーおよびロールになるため、該当PDBに接続してから作成の操作を行います。尚、ローカル・ユーザーやローカル・ロールはルート・コンテナに作成することはできません。
続いてここまで紹介してきたユーザーやロールの作成方法について解説しましょう。
ユーザー作成であればCREATE USER文、ロールであればCREATE ROLE文を実行しますが、構文の最後に「CONTAINER句」を指定して作成します。共通ユーザーおよび共通ロールを作成する場合は「CONTAINER=ALL」を指定し、ローカル・ユーザー、ローカル・ロールの場合は「CONTAINER=CURRENT」を指定します。このCONTAINER句は省略することも可能ですが、省略した場合のデフォルト値と注意事項を合わせて後半部分で説明しますので、まずはこれまでの解説のまとめとして以下に実機操作の内容を記載しておきます。
$ sqlplus / as sysdba ※CDBのルート・コンテナに接続
…
SQL> show pdbs ※PDB1(CON_ID=3)、PDB2(CON_ID=4) があることを確認
CON_ID CON_NAME OPEN MODE RESTRICTED
————- ——————————— ———————– ———————
2 PDB$SEED READ ONLY NO
3 PDB1 READ WRITE NO
4 PDB2 READ WRITE NO
SQL> create user C##USER1 identified by oracle_4U container=all; ※共通ユーザーC##USER1作成
User created.
SQL> create user USER2 identified by oracle_4U container=all; ※接頭辞C##がないためエラー
create user USER2 identified by oracle_4U container=all
*
ERROR at line 1:
ORA-65096: invalid common user or role name
SQL> create user USER2 identified by oracle_4U container=current; ※ルート・コンテナでローカル
create user USER2 identified by oracle_4U container=current ユーザーは作成できない
*
ERROR at line 1:
ORA-65049: Creation of local user or role is not allowed in this
container.
SQL> select con_id, username, common from cdb_users where username=’C##USER1′;
CON_ID USERNAME COMMON
————- ——————————— —————-
1 C##USER1 YES
3 C##USER1 YES
4 C##USER1 YES
※すべてのコンテナに共通ユーザーC##USER1が作成されている。共通ユーザーの場合COMMON列はYES
SQL> alter session set container=PDB1; ※PDB1にセッションを切り替え
Session altered.
SQL> create user L_USER1 identified by oracle_4U container=current;
User created.
※ローカル・ユーザー L_USER1作成
SQL> create user C##L_USER1 identified by oracle_4U container=all;
create user C##L_USER1 identified by oracle_4U container=all
*
ERROR at line 1:
ORA-65050: Common DDLs only allowed in root.
※PDBで共通ユーザーは作成できない
SQL> connect / as sysdba ※CDBのルート・コンテナに接続
Connected.
SQL> select con_id, username, common from cdb_users where username=’L_USER1′;
CON_ID USERNAME COMMON
————- ——————————— —————-
3 L_USER1 NO
※ルート・コンテナからCDB_USERSで確認。PDB1のみ存在するローカル・ユーザーL_USER1が作成されている。ローカル・ユーザーの場合COMMON列はNO
今回の操作例はユーザー作成のみ記載しましたが、ロールも同じように作成できます。ロールの場合は作成後「CDB_ROLES」ビューで情報を確認するといいでしょう。是非、実機で操作してみてください。
さて、CONTAINER句についてもう少し詳細を確認しておきましょう。まずは以下にCONTAINER句の指定に関する内容を表にまとめてみましたので確認してください。
今回はユーザーやロールの作成についての説明をしているので、まずは表のCREATEが含まれる行の項目を確認してください。先に説明したとおり共通ユーザー、共通ロールはルート・コンテナからのみ作成できるリソースになるのでルート・コンテナ上で指定するCONTAINER句はALLのみが設定可能です。仮にCONTAINER句を省略してもALLが設定された場合と同等の動きをします。またローカル・ユーザー、ローカル・ロールはPDBでのみ作成できるリソースになるのでPDB上で指定するCONTAINER句はCURRENTのみが設定可能で、CONTAINER句を省略してもCURRENTが設定された場合と同等の動作をします。
あれ?そうするとCONTAINER句なんてそもそもいらないんじゃないの?と思う人もいるかもしれませんが、GRANT、REVOKEのところを見てください。赤文字で示したところが要注意事項になります。権限の付与、あるいは剥奪をする際にGRANTやREVOKEを使用しますが、ルート・コンテナで実行する場合はALLもCURRENTも指定することができ、かつ省略時のデフォルト値もCREATE、ALTER、DROPのときと異なります。こちらについての詳細は次回の「マルチテナント環境の権限付与について」にて詳しく解説しますので今回はユーザーやロール作成に関する内容のCONTAINER句についてしっかりおさえておきましょう。マルチテナント環境の操作にまだ慣れていない方や省略時のデフォルト値を正確に把握できていない方はCONTAINER句は省略せずに操作を行うことを強くお勧めします。「どのコンテナに接続していて何を作成したいか?」というのを意識するためにもCONTAINER句の指定を明示的に行うことで操作ミスを予防し、かつ知識が定着すると思います。
ここまでの解説で問題を解くことができるので各選択肢を見ていきましょう。
選択肢1は誤りです。操作Aはルート・コンテナ上で共通ユーザーC##ADMINを作成しようとしていてCONTAINER句が省略されていますがその場合はALLと同じ動作になりますのでエラーにはなりません。
選択肢2も誤りで、操作Bはルート・コンテナで共通ユーザーを作成しようとしてますがC##の接頭辞がありませんのでエラーになります。
選択肢3の操作CはPDB上で共通ユーザーC##USER1を作成しようとしてるのでエラーになりますね。
選択肢4と選択肢5が正解の内容となります。どちらもPDB上でローカル・ユーザーを作成する操作をしています。操作DはCONTAINER句を省略していますがCURRENTを指定した場合と同じ動作になるので正しく作成されます。操作EはCONTAINER=CURRENTを指定してローカル・ユーザーを作成しているのでこちらも正しく作成されます。
以上を踏まえまして正解は 4、5 になります。
今回はマルチテナント環境のユーザー、ロールについて解説を行いました。マルチテナント環境特有の共通ユーザー、共通ロールという概念がありますので、実際に作成をしてディクショナリ・ビューで確認するなどして操作に慣れていただくとよいでしょう。またCONTAINER句の指定は省略することも可能ですが、十分操作に慣れている方以外は省略はせず、自分が何を作成したいのかを意識するために明示的に指定して実行することをお勧めします。
今回の講義はこれまでとします。お疲れ様でした。
————————————————-
【Oracle University講師によるORACLE MASTER Gold DBA 2019 試験トピック解説講座】トピック一覧
————————————————
その他の ORACLE MASTER 試験トピック解説講座シリーズ:
【Oracle University 講師による ORACLE MASTER Silver SQL 2019 試験トピック解説講座】-トピック一覧-
————————————————-
