Oracleで、ユーザーが作成できない場合、接続できない場合

##はじめに##
「[Oracleの基本](https://www.amazon.co.jp/Oracle%E3%81%AE%E5%9F%BA%E6%9C%AC-%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%E5%85%A5%E9%96%80%E3%81%8B%E3%82%89%E8%A8%AD%E8%A8%88-%E9%81%8B%E7%94%A8%E3%81%AE%E5%88%9D%E6%AD%A9%E3%81%BE%E3%81%A7-%E6%B8%A1%E9%83%A8-%E4%BA%AE%E5%A4%AA/dp/4774192511)」という書籍で勉強した時に、書籍の手順通りに進めても、
新しく作成したuserで接続できなかったので、その時の調べたことを記載します。
12c以降での仕様です。
##行う事##
・学習用に新しくユーザーを作成する。
・作成したユーザーで接続する。
##エラー内容##
・ユーザー作成しようとした場合

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

・作成したユーザーで接続しようとした場合

```
ERROR:
ORA-01017: ユーザー名/パスワードが無効です。ログオンは拒否されました。
```
##原因##
・インスタンスには1つのCDBと、その下にPDBと呼ばれる子DB(複数作成可)がある。
　CDB(コンテナ・データベース)、PDB(プラガブル・データベース)
・ローカルユーザーはPDBに作成する必要がある。
・PDBは必ず、リスナー経由で接続する必要がある。
##解決方法##
####ユーザー作成####
新しくユーザーを作成しようと

```
CREATE USER test IDENTIFIED BY Pass123;
```
を実行しました。すると..

```
行1でエラーが発生しました。:
ORA-65096: 共通ユーザーまたはロール名が無効です
```
と表示されました。
これは、新しいユーザーをCDBに作成しようとしたからです。

現在接続しているデータベースを確認します。

```
SQL> show con_name

CON_NAME
-----------------------
CDB$ROOT
```
CDBに接続している事がわかります。

次に、PDBの名前と現在のOPEN_MODEを確認します。

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

NAME             OPEN_MODE
-----------------------------------
PDB$SEED         READ ONLY
ORCLPDB          MOUNTED
```
pdbが「MOUNTED」で起動していないので、起動します。

```
SQL> alter pluggable database orclpdb open;

プラガブル・データベースが変更されました。

```
確認すると...

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

NAME             OPEN_MODE
-----------------------------------
PDB$SEED         READ ONLY
ORCLPDB          READ WRITE
```
起動できていることが確認できました。

次は、PDBに接続しなおします。

```
alter session set container=orclpdb;


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

```
もう一度、現在接続しているデータベースを確認します。

```
SQL> show con_name

CON_NAME
-----------------------
ORCLPDB
```
PDBに接続できています。
この状態でユーザーを作成すると...

```
SQL> CREATE USER test IDENTIFIED BY Pass123;

ユーザーが作成されました。
```
無事ユーザーを作成することができました。

####作成したユーザーで接続####
書籍通り、作成したユーザーに権限を付与します。

```
SQL> grant create session to test;

権限付与が成功しました。

SQL> grant resource to test;

権限付与が成功しました。

SQL> grant unlimited tablespace to test;

権限付与が成功しました。
```
その後、接続しようとすると...

```
SQL> connect test/Pass123
ERROR:
ORA-01017: ユーザー名/パスワードが無効です。ログオンは拒否されました。
```
拒否されてしまいます。
これは、PDBは必ず、リスナー経由で接続する必要があるからです。

@をつけれ接続してみます。
```
SQL> connect test/Pass123@orclpdb
ERROR:
ORA-12154: TNS: 指定された接続識別子を解決できませんでした
```
接続できませんでした。
調べたところ、tnsnames.oraを編集して、定義する必要があるみたいです。

tnsnames.oraを開きます。(Oracleホーム下のnetwork\adminにありました)

```
ORCL =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1522))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = orcl)
    )
  )
```
の下に今回使うPDBの定義を追加して以下のようにします。
上記のものをコピーして、サービス名と接続文字列のみ変更しました。

```
ORCL =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1522))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = orcl)
    )
  )

ORCLPDB =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1522))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = orclpdb)
    )
  )
```
そして、もう一度接続してみます。

```
SQL> connect test/Pass123@orclpdb
接続されました。
```
無事に接続することができました。
##おわりに##
解決のためには、CDBとPDBという概念の理解をする事が必要でした。
PDBやCDBというキーワードを入れて検索しないと簡単に記事にたどりつけなかったので、
同じようにエラーにつまづいた人の参考になれば幸いです。
##参考記事##
https://www.dbsheetclient.jp/blog/?p=1566
https://www.projectgroup.info/documents/Oracle/ORA-120005.html
https://kenko-keep.com/pdb-ora-01017/
https://www.shift-the-oracle.com/oracle-net/tnsnames.html

[Oracleの基本](https://www.amazon.co.jp/Oracle%E3%81%AE%E5%9F%BA%E6%9C%AC-%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%E5%85%A5%E9%96%80%E3%81%8B%E3%82%89%E8%A8%AD%E8%A8%88-%E9%81%8B%E7%94%A8%E3%81%AE%E5%88%9D%E6%AD%A9%E3%81%BE%E3%81%A7-%E6%B8%A1%E9%83%A8-%E4%BA%AE%E5%A4%AA/dp/4774192511)