LoginSignup
12
7

More than 3 years have passed since last update.

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

Last updated at Posted at 2021-01-20

はじめに

Oracleの基本」という書籍で勉強した時に、書籍の手順通りに進めても、
新しく作成した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の基本

12
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
7