Pluggable Database のローカル接続を試す (Oracle Database 19c)

# Pluggable Databaseへの接続方法

SQL*Plusを使ってPluggable Database (PDB)に接続するには以下の方法がありました。

- リスナー経由
- ALTER SESSION SET CONTAINER文の実行

PDBがOPEN状態であればリスナー経由で接続できます。tnsnames.ora ファイルに接続先サービスの情報を書き込んで接続するか、EZCONNECT記法を使って接続します。

```Shell:
$ sqlplus pdbadmin/{password}@localhost:1521/pdb1

SQL*Plus: Release 19.0.0.0.0 - Production on Sat May 9 10:43:22 2020
Version 19.7.0.0.0

Copyright (c) 1982, 2020, Oracle.  All rights reserved.

Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.7.0.0.0

SQL> SHOW CON_NAME

CON_NAME
------------------------------
PDB1
SQL>
```

CDBへ接続した後、ALTER SESSION SET CONTAINER文でPDBに接続することもできます。

```
$ sqlplus / as sysdba
SQL> SHOW CON_NAME;

CON_NAME
------------------------------
CDB$ROOT
SQL> ALTER SESSION SET CONTAINER=pdb2;

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

SQL> SHOW CON_ID;

CON_ID
------------------------------
4
SQL> SHOW CON_NAME

CON_NAME
------------------------------
PDB1
```

# 新しい接続方法
Oracle Database 19c (19.7) から、PDBに対する「AS SYSDBA」を指定したオペレーティング・システム認証がサポートされるようになりました。環境変数ORACLE_PDB_SIDにPDB名を指定します。

```
$ export ORACLE_SID=O19B
$ export ORACLE_PDB_SID=pdb1
$ sqlplus / as sysdba

SQL*Plus: Release 19.0.0.0.0 - Production on Sat May 9 10:50:03 2020
Version 19.7.0.0.0

Copyright (c) 1982, 2020, Oracle.  All rights reserved.

Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.7.0.0.0

SQL> SHOW CON_NAME

CON_NAME
------------------------------
PDB1

SQL> SELECT BANNER_FULL FROM V$VERSION;

BANNER_FULL
-----------------------------------------------------------------------
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.7.0.0.0

SQL>
```

接続先CDBを選択するため、従来からCDB接続のために使用してきた環境変数ORACLE_SIDも必要です。

## 非CDB環境に接続
環境変数ORACLE_SIDに非CDBデータベースを指定した場合は、環境変数ORACLE_PDB_SIDは無視されます。下記の例では、非CDBデータベースO19Aを指定しています。

```
$ export ORACLE_SID=O19A
$ export ORACLE_PDB_SID=pdb1
$ sqlplus / as sysdba

SQL*Plus: Release 19.0.0.0.0 - Production on Sat May 9 11:01:30 2020
Version 19.7.0.0.0

Copyright (c) 1982, 2020, Oracle.  All rights reserved.

Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.7.0.0.0

SQL> SHOW CON_NAME

CON_NAME
------------------------------
O19A
```

## 存在しないPDB
環境変数ORACLE_PDB_SIDに存在しないPDB名を指定すると、CDB$ROOTに接続されます。

```
$ export ORACLE_SID=O19B
$ export ORACLE_PDB_SID=pdb_not_exists
$ sqlplus / as sysdba

SQL*Plus: Release 19.0.0.0.0 - Production on Sat May 9 11:04:19 2020
Version 19.7.0.0.0

Copyright (c) 1982, 2020, Oracle.  All rights reserved.

Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.7.0.0.0

SQL> SHOW CON_NAME

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

## MOUNT状態のPDB
PDBがマウント状態でも接続できます。

```
$ export ORACLE_SID=O19B
$ export ORACLE_PDB_SID=pdb1
$ sqlplus / as sysdba

SQL*Plus: Release 19.0.0.0.0 - Production on Sat May 9 11:05:24 2020
Version 19.7.0.0.0

Copyright (c) 1982, 2020, Oracle.  All rights reserved.

Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.7.0.0.0

SQL> SHOW CON_NAME

CON_NAME
------------------------------
PDB1

SQL> SELECT OPEN_MODE FROM V$PDBS WHERE NAME='PDB1';

OPEN_MODE
----------
MOUNTED
SQL>
```

## 通常ユーザーによる接続
「AS SYSDBA」を指定しないユーザーを使ったPDB接続はできません。

```
$ export ORACLE_SID=O19B
$ export ORACLE_PDB_SID=pdb1
$ sqlplus pdbadmin/{password}

SQL*Plus: Release 19.0.0.0.0 - Production on Sat May 9 11:11:25 2020
Version 19.7.0.0.0

Copyright (c) 1982, 2020, Oracle.  All rights reserved.

ERROR:
ORA-01017: invalid username/password; logon denied


Enter user-name: ^C
$
```

# マニュアル
この機能は上記のように使えますが、SQL*Plusのマニュアルにも、Oracle Databaseの19.7パッチのREADMEにも公式な情報がありません。今後、マニュアルのアップデートにより公式化されることを期待しています。