~CONTAINER句の使い分けも完全解説~
Oracle 12c以降のマルチテナントアーキテクチャでは、1つのCDB(コンテナ・データベース)に複数のPDB(プラガブル・データベース)が含まれます。
この構成下では、共通ユーザー(common user)を使ってCDB全体を効率よく管理できますが、PDBに接続するためには接続権限の付与が必要です。
本記事では、次の3パターンに分けて、共通ユーザーの接続権限付与手順を解説します。
CONTAINER=ALL:すべてのコンテナに権限を一括付与(既存のPDBのみ対象)CONTAINER=CURRENT:現在のコンテナ(CDB$ROOTやPDB)にのみ付与- PDB単位:各PDBに接続し、個別に付与
💰 【PR】Oracleエンジニアの市場価値、調べてみませんか?
Oracleのスキルは需要が高く、特定の資格や経験を持っていると年収が大幅にアップするケースがあります。まずはIT専門のエージェントで非公開求人をチェックしてみませんか?
■ 共通ユーザーとは?
| 特徴 | 内容 |
|---|---|
| ユーザー名 | C##で始まる(例:C##ADMIN) |
| 作成場所 | CDB$ROOT(親コンテナ) |
| 存在場所 | CDB$ROOT+全PDB(論理的に同じ名前で存在) |
| 権限管理 | 各コンテナ単位に行う必要あり(ALL, CURRENT, PDB個別) |
■ 構成イメージ
+------------------------------+
| CDB$ROOT |
| 共通ユーザー: C##ADMIN |
| CREATE SESSION(あり) |
| |
| +------------------------+ |
| | PDB01 | |
| | C##ADMIN → CREATE SESSION |
| +------------------------+ |
| | PDB02 | |
| | C##ADMIN → なし |
| +------------------------+ |
+------------------------------+
■ 手順①:共通ユーザーをCDB$ROOTで作成
-- CDB$ROOTに接続していることを確認
SQL> SHOW CON_NAME;
CDB$ROOT
-- 共通ユーザー作成(全コンテナに論理的に作成される)
SQL> CREATE USER c##admin IDENTIFIED BY oracle;
■ 手順②:接続権限の付与方法まとめ
✅ 方法1:CDB$ROOTから全コンテナへ一括付与(CONTAINER=ALL)
SQL> GRANT CREATE SESSION TO c##admin CONTAINER=ALL;
- CDB$ROOTとすでに存在するすべてのPDBに
CREATE SESSIONを一括付与 - 今後新しく作成されるPDBには反映されないので注意
✅ 方法2:CDB$ROOTのみに付与(CONTAINER=CURRENT)
SQL> GRANT CREATE SESSION TO c##admin CONTAINER=CURRENT;
- CDB$ROOTでのみ有効
- PDBには付与されない
- 管理者がCDB$ROOTにログインして操作するだけならこの設定で十分
[oracle@v19single ~]$ sqlplus / as sysdba
SQL*Plus: Release 19.0.0.0.0 - Production on 月 4月 14 11:54:48 2025
Version 19.21.0.0.0
Copyright (c) 1982, 2022, Oracle. All rights reserved.
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.21.0.0.0
に接続されました。
SQL> show con_name
CON_NAME
------------------------------
CDB$ROOT
SQL> CREATE USER c##admin IDENTIFIED BY oracle; ★共通ユーザー作成
ユーザーが作成されました。
SQL> connect c##admin/oracle ★権限付与していないためエラー
ERROR:
ORA-01045: user C##ADMIN lacks CREATE SESSION privilege; logon denied
警告: Oracleにはもう接続されていません。
SQL> connect / as sysdba
接続されました。
SQL> GRANT CREATE SESSION TO c##admin CONTAINER=CURRENT; ★CDB$ROOT に権限付与
権限付与が成功しました。
SQL> connect c##admin/oracle
接続されました。
SQL> show con_name
CON_NAME
------------------------------
CDB$ROOT ★CDB$ROOT に接続できている
SQL> connect c##admin/oracle@pdb01 ★PDB に接続しようとしてもエラー
ERROR:
ORA-01045: user C##ADMIN lacks CREATE SESSION privilege; logon denied
警告: Oracleにはもう接続されていません。
SQL> connect / as sysdba
接続されました。
SQL> GRANT CREATE SESSION TO c##admin CONTAINER=ALL; ★すべてのコンテナに権限付与
権限付与が成功しました。
SQL> connect c##admin/oracle@pdb01
接続されました。
SQL> show con_name
CON_NAME
------------------------------
PDB01 ★PDB に接続できている
💰 【PR】Oracleエンジニアの市場価値、調べてみませんか?
Oracleのスキルは需要が高く、特定の資格や経験を持っていると年収が大幅にアップするケースがあります。まずはIT専門のエージェントで非公開求人をチェックしてみませんか?
✅ 方法3:各PDBに切り替えて個別に付与
-- PDB01に切り替え
SQL> ALTER SESSION SET CONTAINER = PDB01;
SQL> GRANT CREATE SESSION TO c##admin;
-- PDB02に切り替え
SQL> ALTER SESSION SET CONTAINER = PDB02;
SQL> GRANT CREATE SESSION TO c##admin;
- PDB単位で権限を柔軟に管理可能
- 新しく作成したPDBにもこの対応が必要
■ PDB接続に必要なtnsnames.ora設定(例)
PDB01 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
(CONNECT_DATA =
(SERVICE_NAME = pdb01.localdomain)
)
)
■ 共通ユーザーでPDBに接続する
$ sqlplus c##admin/oracle@PDB01
エラーになる場合は、対象PDBに CREATE SESSION 権限がない可能性があります。
■ よくあるエラーと対処
❌ エラー例
ORA-01045: ユーザー C##ADMIN は CREATE SESSION 権限を持っていません。
✅ 対処法
対象のPDBで以下を実行:
SQL> ALTER SESSION SET CONTAINER = PDB01;
SQL> GRANT CREATE SESSION TO c##admin;
■ まとめ表
| 方法 | 実行場所 | コマンド例 | 対象範囲 |
|---|---|---|---|
| CONTAINER=ALL | CDB$ROOT | GRANT CREATE SESSION TO c##admin CONTAINER=ALL; | すべての既存コンテナ |
| CONTAINER=CURRENT | CDB$ROOT | GRANT CREATE SESSION TO c##admin CONTAINER=CURRENT; | CDB$ROOTのみ |
| PDB個別付与 | 各PDB | GRANT CREATE SESSION TO c##admin; | 指定したPDBのみ |
■ まとめ
- 共通ユーザーはCDB$ROOTとすべてのPDBに存在しますが、接続権限はコンテナごとに管理が必要です。
- CONTAINER=ALLを使えば一括で接続権限を付与できますが、CONTAINER=CURRENTやPDB単位での細かい制御も可能です。
- 必要に応じて適切なCONTAINER句を選び、セキュアかつ効率的なユーザー管理を行いましょう。
[参考]
4 CDBの作成および構成




コメント