OracleのCDB(Container Database)構成では、PDB(Pluggable Database)間でデータ連携を行うにはDBLINK(データベースリンク)の利用が便利です。
本記事では、PDB01からPDB02へDBLINKを作成し、テーブルを参照する方法を、tnsnames.ora の作成から順を追って丁寧に解説します。

💰 【PR】Oracleエンジニアの市場価値、調べてみませんか?
Oracleのスキルは需要が高く、特定の資格や経験を持っていると年収が大幅にアップするケースがあります。まずはIT専門のエージェントで非公開求人をチェックしてみませんか?
■ 0. tnsnames.ora の作成
DBLINK作成にはTNS名が必要です。まず、$ORACLE_HOME/network/admin/tnsnames.ora に以下の設定を追記します。
# PDB01 への接続定義
PDB01 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
(CONNECT_DATA =
(SERVICE_NAME = PDB01)
)
)
# PDB02 への接続定義
PDB02 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
(CONNECT_DATA =
(SERVICE_NAME = PDB02)
)
)
🔍
HOSTやSERVICE_NAMEは実環境に合わせて設定してください。
ローカル環境であればlocalhost、ポートは通常1521です。
設定後、接続確認を行います:
$ tnsping PDB01
$ tnsping PDB02
■ 構成イメージ(テキスト図)
[CDB$ROOT]
│
├── [PDB01] ── user1(DBLINK作成・使用)
│ │
│ └── dblink_to_pdb02(→ PDB02 へ接続)
│
└── [PDB02] ── user2(接続先)
│
└── employees表(PDB01から参照)
■ 1. PDB構成確認
SQL> show pdbs;
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
3 PDB01 READ WRITE NO
4 PDB02 READ WRITE NO
■ 2. PDB02に接続先ユーザーとテーブルを作成
-- PDB02に接続
SQL> ALTER SESSION SET CONTAINER = PDB02;
-- ユーザー作成
SQL> CREATE USER user2 IDENTIFIED BY password;
-- 必要な権限と表領域使用権限を付与
SQL> GRANT CONNECT, CREATE TABLE TO user2;
SQL> ALTER USER user2 QUOTA UNLIMITED ON USERS;
◉ user2でログイン → テーブル作成とデータ挿入
-- user2でログイン
SQL> CONNECT user2/password@PDB02
-- テーブル作成
CREATE TABLE employees (
emp_id NUMBER PRIMARY KEY,
emp_name VARCHAR2(100)
);
-- データ挿入
INSERT INTO employees VALUES (1, '佐藤太郎');
INSERT INTO employees VALUES (2, '鈴木花子');
COMMIT;
💰 【PR】Oracleエンジニアの市場価値、調べてみませんか?
Oracleのスキルは需要が高く、特定の資格や経験を持っていると年収が大幅にアップするケースがあります。まずはIT専門のエージェントで非公開求人をチェックしてみませんか?
■ 3. PDB01でDBLINK用ユーザーを作成
-- PDB01に接続
SQL> ALTER SESSION SET CONTAINER = PDB01;
-- ユーザー作成
SQL> CREATE USER user1 IDENTIFIED BY password;
-- DBLINK作成用権限を付与
SQL> GRANT CONNECT, CREATE DATABASE LINK TO user1;
■ 4. user1でDBLINKを作成してPDB02を参照
-- user1でログイン
SQL> CONNECT user1/password@PDB01
-- DBLINK作成(PDB02へ接続)
CREATE DATABASE LINK dblink_to_pdb02
CONNECT TO user2 IDENTIFIED BY password
USING 'PDB02';
-- DBLINK経由でデータ参照
SELECT * FROM employees@dblink_to_pdb02;
-- 実行結果
EMP_ID | EMP_NAME
-------+----------
1 | 佐藤太郎
2 | 鈴木花子
【DBLINK の使用例】
[oracle@v19single ~]$ vi $ORACLE_HOME/network/admin/tnsnames.ora ★tnsnames.ora 作成
[oracle@v19single ~]$ cat $ORACLE_HOME/network/admin/tnsnames.ora
PDB01 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
(CONNECT_DATA =
(SERVICE_NAME = PDB01)
)
)
PDB02 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
(CONNECT_DATA =
(SERVICE_NAME = PDB02)
)
)
[oracle@v19single ~]$ sqlplus / as sysdba
SQL*Plus: Release 19.0.0.0.0 - Production on 月 5月 26 11:45:41 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 pdbs
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
3 PDB01 READ WRITE NO
4 PDB02 READ WRITE NO
SQL> ALTER SESSION SET CONTAINER = PDB02; ★PDB02 に接続
セッションが変更されました。
SQL> show con_name
CON_NAME
------------------------------
PDB02
SQL> CREATE USER user2 IDENTIFIED BY password; ★ユーザー作成
ユーザーが作成されました。
SQL> GRANT CONNECT, CREATE TABLE TO user2;
権限付与が成功しました。
SQL> ALTER USER user2 QUOTA UNLIMITED ON USERS;
ユーザーが変更されました。
SQL> CONNECT user2/password@PDB02
接続されました。
SQL> CREATE TABLE employees ( ★テーブル作成
2 emp_id NUMBER PRIMARY KEY,
3 emp_name VARCHAR2(100)
4 );
SQL> INSERT INTO employees VALUES (1, '佐藤太郎');
1行が作成されました。
SQL> INSERT INTO employees VALUES (2, '鈴木花子');
1行が作成されました。
SQL> set lin 1000 pages 1000
SQL> col emp_name for a20
SQL> SELECT * FROM employees;
EMP_ID EMP_NAME
---------- --------------------
1 佐藤太郎
2 鈴木花子
SQL> commit;
コミットが完了しました。
SQL> CONNECT / as sysdba
接続されました。
SQL> ALTER SESSION SET CONTAINER = PDB01; ★PDB01 へ接続
セッションが変更されました。
SQL> show con_name
CON_NAME
------------------------------
PDB01
SQL> CREATE USER user1 IDENTIFIED BY password; ★ユーザー作成
ユーザーが作成されました。
SQL> GRANT CONNECT, CREATE DATABASE LINK TO user1;
権限付与が成功しました。
SQL> CREATE DATABASE LINK dblink_to_pdb02 ★DBLINK 作成
2 CONNECT TO user2 IDENTIFIED BY password
3 USING 'PDB02';
データベース・リンクが作成されました。
SQL> SELECT * FROM employees@dblink_to_pdb02; ★PDB02 に作成したテーブルを select
EMP_ID EMP_NAME
---------- --------------------
1 佐藤太郎
2 鈴木花子
■ 補足・注意点
| 項目 |
|---|
| DBLINKはCDB$ROOTではなくPDBで作成する必要あり |
tnsnames.ora の設定は必須(TNS名が必要) |
表領域エラー(ORA-01950)は QUOTA UNLIMITED で対応 |
| 本記事では PRIVATE DBLINK(ユーザー専用)を使用 |
■ まとめ
- PDB間のデータ参照にはDBLINKを使うことで柔軟に連携できる
- TNS構成(
tnsnames.ora)が最重要ポイント - 表領域の使用権限忘れがエラーの原因になるので注意
[参考]
SQL言語リファレンス – CREATE DATABASE LINK




コメント