ここではOracleのエラー「ORA-65096: 共通ユーザーまたはロール名が無効です」の対処法について紹介します。

エラー現象と原因

Oracle Database 21c Express Edition をインストールして SQL*Plus からユーザーを作成しようと CREATE USER 文を実行したら「ORA-65096: 共通ユーザーまたはロール名が無効です」というエラーが発生しました。
Oracleの「リカバリ・アプライアンスのエラー・メッセージ・リファレンス」の処置としては「有効な共通ユーザーまたはロール名を指定してください。」とのこと。
Oracle 11g では問題なくユーザーは作成できたのですが、Oracle 21c が問題なのか?

C:\>sqlplus / as sysdba

SQL*Plus: Release 21.0.0.0.0 - Production on 日 3月 3 12:46:58 2024
Version 21.3.0.0.0

に接続されました。
SQL> CREATE USER test IDENTIFIED BY pass;
CREATE USER test IDENTIFIED BY pass

行1でエラーが発生しました。:
ORA-65096: 共通ユーザーまたはロール名が無効です

SQL>

 

原因を Copilot に聞いてみると、「ルートコンテナにローカルユーザーを作成しようとした場合に発生します。ルートコンテナには共有ユーザー (common user) と呼ばれる特殊なユーザーしか作成できません。このエラーは、マルチテナントアーキテクチャにおいて、ルートコンテナ内でローカルユーザーを作成しようとした際に発生します。」と返ってきた。

 

エラーの対処法

Copilot が教えてくれた解決方法は、
1.プラガブルデータベース (PDB) に接続します。ルートコンテナではなく、個々のPDBに対してローカルユーザーを作成する必要があります。
2.接続識別子にユーザーを作成したPDBを指定し、そのPDBに接続したのち、ユーザーを作成してください。

現在接続しているコンテナ名を確認する

まずは現在接続しているコンテナ名を確認します。

show con_name;
SQL>show con_name;

CON_NAME
------------------------------
CDB$ROOT
SQL>

 

現在、CDBに接続されていることが確認できました。これが原因です。

 

PDBに関する情報を表示する

次に V$PDBS から現行のインスタンスに関連するPDBの名前とOPEN_MODEを表示します。

select name, open_mode from v$pdbs;
SQL>select name, open_mode from v$pdbs;

NAME
------------------------------
OPEN_MODE
--------------------
PDB$SEED
READ ONLY

XEPDB1
READ WRITE

SQL>

 

XEPDB1 が Oracle Database 21c Express Edition で作成されるデフォルトのPDBコンテナです。

 

接続先コンテナを変更する

次に接続先のコンテナを「XEPDB1」に変更します。

alter session set container = XEPDB1;
SQL>alter session set container = XEPDB1;

セッションが変更されました。

SQL>

 

接続先コンテナを変更したらユーザーを作成してみます。

SQL>alter session set container = XEPDB1;

セッションが変更されました。

SQL>

 

無事にユーザーが作成されました。