Oracleエラー対応(ORA-01017):ORA-01017発生時の対応について

現役DBAが解説 ~Oracleエラー対応~

データベース接続時にORA-01017が発生する可能性があります。

本記事ではORA-01017発生時の対応方法を解説します。

1. エラーメッセージ

ORA-01017: ユーザー名/パスワードが無効です。ログオンは拒否されました。
ユーザー名を入力してください:	

ユーザー名/パスワードのどちらか、または両方が無効の場合に本エラーが発生します。

2. 対応方法

エラーが発生したら、まずは原因解明のための調査および対応を実施します。

① ユーザー名/パスワードが正しいかを確認

まずはユーザー名/パスワードが正しいか確認しましょう。
単純にユーザー名やパスワードが間違っている場合に本エラーが発生します。

【補足情報】
SEC_CASE_SENSITIVE_LOGON パラメータと
SQLNET.ALLOWED_LOGON_VERSION_SERVERパラメータの競合


下記は、12cより前のバージョンから12c以降にバージョンアップする場合に、よくある事例です。

<事象>

SEC_CASE_SENSITIVE_LOGON = falseでSQLNET.ALLOWED_LOGON_VERSION_SERVER = 12 の設定を行っている環境では競合が起き、ORA-01017によりログオンできなくなります。

<パラメータ説明>
SEC_CASE_SENSITIVE_LOGON

データベースにおけるパスワードの大/小文字の区別を有効または無効にするパラメータです。
しかし、12cより非推奨となっており、デフォルト値はtrueで下位互換性のために現在残されています。

バージョン大文字/小文字の区別パラメータ変更
10g以前 無し
11g以降 有り(デフォルト=TRUE)
12c以降 有り(デフォルト=TRUE) 可 ※非推奨

SQLNET.ALLOWED_LOGON_VERSION_SERVER

DB接続時に認められる最小の認証プロトコルを設定します。
12cでは、SQLNET.ALLOWED_LOGON_VERSION_SERVERパラメータのデフォルト値が12であり、大文字/小文字を区別する11gおよび12cのパスワードバージョンのみ使用可能な設定です。

<対処方法>

競合が発生しないようにどちらかの方式に統一します。

SEC_CASE_SENSITIVE_LOGON=TRUE、SQLNET.ALLOWED_LOGON_VERSION_SERVER=12
SEC_CASE_SENSITIVE_LOGON=FALSE、SQLNET. ALLOWED_LOGON_VERSION_SERVER=11以下

② 接続先DBの確認

ローカル接続の場合は環境変数のORACLE_SIDを確認してください。
リモート(リスナー)接続の場合はtnsnames.oraの定義を確認してください。

●tnsnames.oraの記載例(デフォルトの配置先:{環境変数 ORACLE_HOME}/network/admin)

接続文字列 =
  (DESCRIPTION =
	(ADDRESS = (PROTOCOL = TCP)(HOST = ホスト名)(PORT = ポート番号))
	(CONNECT_DATA =
	  (SERVER = DEDICATED)
	  (SERVICE_NAME = サービス名)
	)
  )

【補足情報】
プラガブル・データベースへの接続方法


12cからマルチテナント・アーキテクチャという機能で、コンテナ・データベース(CDB)とプラガブル・データベース(PDB)が登場しました。
プラガブル・データベースへの接続方法の間違いで本エラーに遭遇する方も多いようです。
PDBへの接続はTNS経由の接続しか受け付けられないため、ローカル接続の場合にはORA-01017が発生します。

●PDBへの接続

×(ORA-01017) sqlplus <ユーザー名>/<パスワード>
sqlplus <ユーザー名>/<パスワード>@<tnsnames.oraに記載したPDBへの接続文字列>

3. 最後に

ORA-01017に関する解説は以上となります。

ローカル接続かリモート接続かにより、確認対象が異なります。
また、ユーザーが存在しない場合にも本エラーが発生します。
ORA-01017が発生した場合にはユーザー名/パスワードおよび接続先DBを確認しましょう。