【Oracle】ORA-01017 完全ガイド|invalid username/password の原因・パスワード大文字小文字区別・対処法まで解説

ORA-01017: invalid username/password; logon deniedは、Oracle への接続時にユーザー名またはパスワードが正しくない場合に発生するエラーです。単純なパスワード入力ミスだけでなく、Oracle 11g 以降でパスワードが大文字小文字を区別するようになった仕様の変更が原因でアップグレード後に突然 ORA-01017 が発生するケースが多く見られます。

この記事でわかること

  • ORA-01017 が発生する主な原因パターン
  • パスワードの大文字小文字区別(SEC_CASE_SENSITIVE_LOGON)の仕組みと確認方法
  • CDB 環境での C## プレフィックスの要件
  • パスワードに特殊文字を含む場合の対処法
  • ログイン失敗の履歴を確認する方法(Unified Auditing)
  • OS 認証(IDENTIFIED EXTERNALLY)のケース
スポンサーリンク

ORA-01017 が発生する主な原因

原因 説明 確認方法
パスワード誤り(大文字小文字含む) Oracle 11g 以降はパスワードが大文字小文字を区別する SEC_CASE_SENSITIVE_LOGON の設定を確認する
ユーザー名の誤り 存在しないユーザー名を指定している(エラーメッセージは同じ) DBA_USERS でユーザーの存在を確認する
パスワードの有効期限切れ パスワードが有効期限切れ(EXPIRED)状態 DBA_USERS.ACCOUNT_STATUS を確認する
CDB 環境の C## プレフィックス CDB の共通ユーザーは C## から始まる名前が必要(12c 以降) 接続先がCDB/PDB かを確認する
パスワードに特殊文字が含まれる 特殊文字(@、/、# など)の扱いで接続文字列が正しく解釈されない パスワードを引用符で囲む
OS 認証の設定ミス IDENTIFIED EXTERNALLY の設定・OS_AUTHENT_PREFIX の不一致 OS ユーザー名と Oracle ユーザー名の対応を確認する

パスワードの大文字小文字区別(SEC_CASE_SENSITIVE_LOGON)

Oracle 11g 以降、パスワードはデフォルトで大文字小文字を区別します。Oracle 10g 以前は大文字小文字を区別しなかったため、11g へのアップグレード後に既存の接続設定が突然 ORA-01017 になることがあります。

SEC_CASE_SENSITIVE_LOGON の確認と設定
-- 現在の設定を確認する
SHOW PARAMETER sec_case_sensitive_logon;
-- TRUE: パスワードの大文字小文字を区別する(デフォルト: TRUE)
-- FALSE: 大文字小文字を区別しない(10g 以前の動作)

-- Oracle 12.2 以降では sec_case_sensitive_logon は非推奨
-- PASSWORD_VERSIONS を確認する(11G / 12C の両方サポート)
SELECT username, password_versions FROM DBA_USERS WHERE username = 'APP_USER';
-- PASSWORD_VERSIONS: 10G(10g 形式・大文字小文字区別なし), 11G, 12C の組み合わせ

-- ユーザーのパスワードをリセットして大文字小文字を含む新しいパスワードに設定する
ALTER USER app_user IDENTIFIED BY "NewPass123#";   -- 二重引用符で囲むと特殊文字も使える
-- Oracle 12c 以降は引用符なしでも大文字小文字区別あり

-- パスワードを更新後の PASSWORD_VERSIONS を確認する
SELECT username, password_versions FROM DBA_USERS WHERE username = 'APP_USER';
-- 12C, 11G の形式になっていれば OK

CDB 環境での C## プレフィックスと PDB への接続

CDB / PDB 接続時のユーザー名とサービス名
-- CDB(Multitenant)環境では共通ユーザーは C## から始まる名前が必要
-- CDB に接続しながら共通ユーザーを作成する場合:
CREATE USER c##app_admin IDENTIFIED BY "Pass123#" CONTAINER=ALL;
-- → CDB 全体(全 PDB)で使える共通ユーザー

-- PDB ローカルユーザー: C## プレフィックス不要
-- PDB に接続してからユーザーを作成する
ALTER SESSION SET CONTAINER = pdb1;
CREATE USER app_user IDENTIFIED BY "Pass123#";   -- PDB ローカルユーザー

-- 接続先を PDB に指定する(サービス名で PDB を指定する)
-- ORA-01017 が発生する場合: CDB$ ROOT に接続しているのに PDB ローカルユーザーでログインしようとしている
-- SQL*Plus での接続例
-- sqlplus app_user/"Pass123#"@localhost:1521/pdb1    ← サービス名に PDB を指定する
-- sqlplus c##app_admin/"Pass123#"@localhost:1521/orcl  ← CDB には C## ユーザー

-- 現在の接続先コンテナを確認する
SELECT sys_context('USERENV', 'CON_NAME') AS current_container FROM DUAL;
-- CDB$ROOT: CDB ルートに接続している
-- pdb1: PDB に接続している

パスワードに特殊文字が含まれる場合の対処

特殊文字を含むパスワードの接続方法
# 問題: パスワードに @ / # などが含まれる場合、接続文字列が正しく解釈されない

# NG: @ がサービス名の区切り文字として解釈される
sqlplus myuser/pass@word@localhost:1521/orcl

# OK: パスワードを二重引用符で囲む
sqlplus myuser/"pass@word"@localhost:1521/orcl

# OK: Easy Connect 形式(引用符が使いやすい)
sqlplus "myuser/"pass@word"@localhost:1521/orcl"

# OK: 環境変数またはウォレットを使う(パスワードを直接書かない)
# Oracle ウォレット(External Password Store)を使う場合
mkstore -wrl /path/to/wallet -createCredential orcl myuser "pass@word"
sqlplus /@orcl   # ← パスワード不要

# JDBC 接続文字列でのパスワード特殊文字の扱い(Java)
# URL パラメータとして渡す場合は URL エンコードが必要
# password=pass%40word → pass@word に相当
パスワードリセットとユーザー存在確認
-- ユーザーが存在するか確認する(存在しない場合も ORA-01017 になる)
SELECT username, account_status, password_versions, created
FROM DBA_USERS
WHERE username = 'APP_USER';
-- 0行: ユーザーが存在しない

-- パスワードをリセットする(DBA権限が必要)
ALTER USER app_user IDENTIFIED BY "NewSecurePass123#";

-- パスワードの大文字小文字を含めてテストする
-- DBMS_UTILITY.GET_HASH_VALUE でパスワードをテストする方法はない
-- → SQL*Plus または接続ツールで直接試す

-- ログイン失敗の履歴を確認する(Unified Auditing が有効な環境)
SELECT
    event_timestamp,
    db_username,
    return_code,   -- 1017: ORA-01017 ログイン失敗
    authentication_type,
    userhost
FROM UNIFIED_AUDIT_TRAIL
WHERE db_username = 'APP_USER'
  AND return_code = 1017
ORDER BY event_timestamp DESC
FETCH FIRST 20 ROWS ONLY;

まとめ

  • 最多原因: パスワードの大文字小文字ミス:Oracle 11g 以降はパスワードが大文字小文字を区別する。10g から 11g へのアップグレード後に多発する
  • DBA_USERS で確認:ユーザーの存在・ACCOUNT_STATUS(OPEN/LOCKED/EXPIRED)・PASSWORD_VERSIONS(10G/11G/12C)を確認する
  • CDB/PDB 環境:CDB 共通ユーザーは C## プレフィックスが必要。PDB ローカルユーザーはサービス名に PDB 名を指定して接続する
  • 特殊文字のパスワード:@ / # などを含む場合は二重引用符で囲む。Oracle ウォレット(External Password Store)で安全に管理するとよい
  • Unified Auditing:return_code=1017 でログイン失敗の記録を確認できる。繰り返し発生する場合はアプリの設定ファイルを確認する

アカウントがロックされた場合(ORA-28000)の解除方法は Oracle ORA-28000 完全ガイドを参照してください。権限不足のエラー(ORA-01031)については Oracle ORA-01031 完全ガイドも参照してください。