本コンテンツはORACLE MASTER Gold DBA 2019(Oracle Database AdministrationⅡ)の試験トピックであるOracle Multitenant Architectureに関する内容をご紹介します。今回は「マルチテナント環境の権限付与について」の問題を解きながら詳しく解説していきます。
————————————————-
それでは問題文を確認していきましょう。
次の構成を確認してください。
・CDB1はコンテナ・データベースです。
・PDB1とPDB2はCDB1内のプラガブル・データベースです。
・COMMON_USER_PREFIXの設定はされていません。
ルート・コンテナに接続して、次のように共通ロールを作成しました。
SQL> create role C##ROLE1 container=all;
引き続き、ルート・コンテナ上で次のコマンドを実行しました。
SQL> grant CREATE SESSION to C##ROLE1;
結果として正しい内容を述べているものを選択してください。
1. 各コンテナに存在する共通ロールC##ROLE1にCREATE SESSION権限が付与される。
2. ルート・コンテナ上のC##ROLE1のみにCREATE SESSION権限が付与される。
3. ルート・コンテナ上での操作は container=all の指定が必要のためエラーになる。
4. ルート・コンテナ上での操作は container=current の指定が必要のためエラーになる。
5. PDB1とPDB2に存在する共通ロールC##ROLE1のみCREATE SESSION権限が付与される。
(解説)
今回の問題はマルチテナント環境の権限付与に関する内容になりますが、こちらの内容を確認する前に「第4回 マルチテナント環境のユーザー、ロールについて」を理解してから取り組んでいただくとよいと思います。第4回では共通ユーザーや共通ロール、ローカル・ユーザーやローカル・ロールについて解説をしましたが、ユーザーやロールの作成の際に「CONTAINER句」を指定すると説明をしました。あらためて第4回で紹介したCONTAINER句の指定についてまとめた表を次に記載します。
今回は権限付与の内容ですからGRANT、REVOKEの項目に着目してください。注意点としては赤文字で記載してあるCONTAINERを省略したときの動作になりますね。少しややこしい部分もあるので詳しく解説していきましょう。
ユーザーやロールについては「共通」「ローカル」という概念がありました。権限につきましても「共通権限」「ローカル権限」という用語がありますが、ユーザーやロールの作成で解説した「共通」「ローカル」とは意味合いが異なります。そもそも権限については「各コンテナに存在する」とか「ローカルにしか存在しない」という概念はありません。どのコンテナでも権限自体は付与することが可能です。権限については付与を行う時にどのように付与したか?によって「共通権限」や「ローカル権限」と表現したりします。
ちょっと分かりにくいですよね?サンプル例も含めて次の図解で解説します。
CREATE SESSION権限を共通ユーザーC##USER1に付与しているイメージ図になります。GRANT文にてCONTAINER=ALLとしていますので各コンテナに存在しているC##USER1に付与する動作となります。
この権限付与の方法を「共通権限として付与」と言ったりしますが、以下のように表現しておきたいと思います。
「ルート・コンテナにて、CREATE SESSION権限を共通ユーザーC##USER1に共通に付与する」
では、次のサンプル例も確認してください。
こちらもCREATE SESSION権限を共通ユーザーC##USER1に付与しているイメージ図になりますが、CONTAINER句を省略しています。ルート・コンテナでGRANT文を実行した際にCONTAINER句を省略した場合のデフォルト値は何だったでしょう?デフォルト値はCURRENTでしたね。そのためルート・コンテナ上に存在している共通ユーザーC##USER1のみに権限が付与されています。これを「ローカル権限として付与」
と言ったりしますが、以下のように表現しておきましょう。
「ルート・コンテナにて、CREATE SESSION権限を共通ユーザーC##USER1にローカルに付与する」
共通ユーザーに権限を付与したからといって自動的に各コンテナに存在している共通ユーザーに権限が付与されるというわけではないという点が重要です。先に説明したとおり、権限そのものに対しては共通やローカルという概念はないため、ユーザーやロールの共通・ローカルという意味合いと混乱しないために、権限については「共通に付与する」「ローカルに付与する」という表現で区別しておくと理解しやすいかと思います。
尚、今回の例はCREATE SESSION権限をユーザーに対して付与する内容で説明しましたが、権限を付与する先がロールであっても同じです。ロールに付与した場合の以下の内容も合わせて確認しておきましょう。
- GRANT create session TO c##role1 COTAINER=ALL;
⇒「ルート・コンテナにて、CREATE SESSION権限を共通ロールC##ROLE1に共通に付与する」
- GRANT create session TO c##role1; or GRANT create session TO c##role1 CONTAINER=CURRENT;
⇒「ルート・コンテナにて、CREATE SESSION権限を共通ロールC##ROLE1にローカルに付与する」
それでは今度はロールをユーザーに付与する例を見ていきましょう。
考え方は権限付与のときと同じです。以下のように表現するとよいでしょう。
「ルート・コンテナにて、共通ロールC##ROLE1を共通ユーザーC##USER1に共通に付与する」
ちょっと「共通」「共通」と同じ用語が出てきてますがイメージ図も参考にしながらしっかり確認しておきましょう。次はCONTAINER句を省略したイメージ図ですね。
こちらはCONTAINER=CURRENTと同じ動作になるので
「ルート・コンテナにて、共通ロールC##ROLE1を共通ユーザーC##USER1にローカルに付与する」
という表現になるかと思います。
では最後にプラガブル・データベースPDB2に着目したユーザーに対するロールの付与について確認しておきましょう。
PDBに接続して操作する場合はCONTAINER句はCURRENTのみしか指定できませんので省略してもCURRENTになります。①~④の操作をこれまでのように日本語で表現しておきます。
- 「PDB2にて、共通ロールC##ROLE1を共通ユーザーC##USER1にローカルに付与する」
- 「PDB2にて、ローカル・ロールL_ROLE1を共通ユーザーC##USER1にローカルに付与する」
- 「PDB2にて、共通ロールC##ROLE1をローカル・ユーザーL_USER1にローカルに付与する」
- 「PDB2にて、ローカル・ロールL_ROLE1をローカル・ユーザーL_USER1にローカルに付与する」
いかがでしょうか。第4回の内容でも触れましたが、マルチテナント環境に慣れていない方はCONTAINER句を省略せずに操作することをお勧めします。自分が現在どのコンテナにいて、どのユーザー(あるいはロール)に何を付与しようとしているのか?というのを意識づけるために明示的にCONTAINER句を指定して操作するとよいでしょう。また操作に混乱してしまった場合は今回の解説のように簡単な図を書いて「何をしたいのか?」を意識しながら作業をしていただくとよいと思います。
これでマルチテナント環境における権限・ロールの付与について確認ができました。問題の選択肢を見ていく前に問題文の内容で補足です。「COMMON_USER_PREFIXの設定はされていません」と記載がありますが、こちらの初期化パラメータのデフォルト値は「C##」となっておりますので合わせて覚えておきましょう。
今回の問題の内容をこれまでの解説と同じように表現すると、
「ルート・コンテナにて、CREATE SESSION権限を共通ロールC##ROLE1にローカルに付与する」
となりますね。それを踏まえて選択肢を見ていきましょう。
選択肢1は、CREATE SESSION権限を共通ロールC##ROLE1に共通に付与するという内容になりますので誤りです。
選択肢2が正しい内容になりますね。ルート・コンテナ上のC##ROLE1のみに付与する、つまりローカルに付与するという意味になります。
選択肢3は誤りです。ルート・コンテナ上の操作でCONTAINER句は省略可能です。GRANT文実行時の省略時はCURRENTと同じ動作になる点もおさえておきましょう。
選択肢4は誤りです。CONTAINER句の指定でCURRENTが必須ということはありません。
選択肢5も誤りですね。ルート・コンテナ上でCONTAINER句を省略した場合はCURRENT指定と同じ動作になりますが特定のPDB上のロールに権限が付与されるということはありません。
以上を踏まえまして正解は 2 になります。
今回はマルチテナント環境の権限やロールの付与に関する内容を解説しました。マルチテナント環境のユーザーやロールがまだしっかりと理解できていない方は、先に「第4回 マルチテナント環境のユーザー、ロールについて」を確認しておきましょう。権限・ロールの付与については言葉だけで理解しようすると混乱しがちになってしまうので、頭の中でイメージしながら(あるいは図を書いて)実機での操作を是非行ってください。実機操作を行うと確実に力が付きますし、操作ミスを無くすこともできますので実践してみてください。
今回の講義はこれまでとします。お疲れ様でした。
————————————————-
【Oracle University講師によるORACLE MASTER Gold DBA 2019 試験トピック解説講座】トピック一覧
————————————————-
その他の ORACLE MASTER 試験トピック解説講座シリーズ:
【Oracle University 講師による ORACLE MASTER Silver SQL 2019 試験トピック解説講座】-トピック一覧-
————————————————-
