パラメータ COMMON_USER_PREFIX は既定値(C##)のまま、CDB$ROOT に SYSDBA で接続している。次の文を順に実行したとき、結果として正しいものを選べ。
SQL> show con_name CON_NAME ------------------------------ CDB$ROOT SQL> CREATE USER hr_admin IDENTIFIED BY pw CONTAINER=ALL; -- 文(1) SQL> CREATE USER c##ops IDENTIFIED BY pw CONTAINER=ALL; -- 文(2)
- A文(1)・文(2) ともに成功する
- B文(1) は
ORA-65096で失敗し、文(2) は成功する - C文(1) は成功し、文(2) は「プレフィックスが不正」で失敗する
- D文(1)・文(2) ともに失敗する(
CONTAINER=ALLは root では使えない)
正解・解説・誤答理由・ひっかけを見る▼ open
解説
マルチテナント環境では、CDB$ROOT で CONTAINER=ALL(または root 接続時の既定)として作る
共通ユーザー(common user)の名前は、COMMON_USER_PREFIX で定義されたプレフィックスで始まらなければならない。
既定値は C## である。
文(1) の hr_admin は C## で始まらないため、共通ユーザーとして作成できず失敗する。
文(2) の c##ops は C##(大文字小文字は不問)で始まるため有効な共通ユーザー名として成功する。
なお、プレフィックス規則が課されるのは共通ユーザーのみ。特定の PDB に接続して
CONTAINER=CURRENT で作るローカルユーザーには C## プレフィックスは不要(むしろ付けてはならない)。
- A文(1) は
C##プレフィックスを欠くため成功しない。両方成功はあり得ない。 - C正誤が逆。
c##opsは正しいプレフィックスを持つので失敗するのは文(1) の方。 - Droot で
CONTAINER=ALLを使うのは共通ユーザー作成の正規手段であり、それ自体はエラーではない。
C## は大文字でないとダメ」と思い込む。プレフィックス照合は大文字小文字を区別しない(c## でも可)。
また「root だから CONTAINER=ALL が要らない/使えない」という思い込み。root では CONTAINER 既定が ALL だが明示も可。ORA-65096: 共通ユーザー名またはロール名が無効です。 (英語:ORA-65096: invalid common user or role name)