こんにちは、shimashima(しましま)です。
先日、Oracle19cでORA-28040のエラーが発生したので、その対処法を共有させてもらいます。
ORA-28040
一致する認証プロトコルがありません
No matching authentication protocol
このエラーは、僕の場合はOracle11gの環境をOracle19cに移行(バージョンアップ)させていたんですが、その際に11gや12cのOracleClientの環境から19cにアクセスした際に発生しました。
19cのサーバーで構築して、そこでsqlplusで接続して操作している分には問題なかったのです。
構築が終わったと思って、今まで11gや12cに接続していたクライアントから、19cの新環境にアクセスした際にエラーが発生したのです。
と、ネットワークやファイヤーウォールの問題なのかと見ていましたが、全然違いました。
下位のクライアントのバージョンから接続しようとしていたのが原因でした。
対処方法は、簡単です。
Oracle19cが入っているサーバーの「sqlnet.ora」ファイルを修正するだけです。
「sqlnet.ora」ファイルは、%ORACLE_HOME%¥NETWORK¥ADMINにあります。
sqlnet.oraファイルに以下の記述を追記します。
sqlnet.ora
SQLNET.ALLOWED_LOGON_VERSION=11
ちなみに上記の例だと、「11」を指定していますが、接続するクライアントが8iであれば、「8」、10gであれば「10」とすれば良いでしょう。
10gと11gの両方のクライアントを使う場合には、低い方に合わせて「10」に設定すれば、良いと思います。
これで11gからのクライアントから接続できた!と思ったら、今度は次のエラーが発生しました。
ORA-01017
ユーザー名/パスワードが無効です;ログオンは拒否されました
Invalid username/password; logon denied.
と思って、何度もパスワードを打ち直しましたが、同じエラーが出て、ついにはパスワードを規定回数間違えて、ユーザーがロックされました。
アカウントのロックの解除は、以下のSQLを実行すれば、すぐに直るのですが。
アカウントロックの解除
alter user XXXX account unlock;
※XXXXのところは、ユーザー名に置き換えて下さい。
そんなわけで、なんだろうと調べていたら、SQLNET.ALLOWED_LOGON_VERSIONを変えた場合には、再度パスワードを変更する必要があったみたいです。
たしかに19cでユーザーを作った時には、11gの認証ルールを許可していないので、19cの認証ルールしかユーザーに適用されていなかったわけです。
そこで、SQLで以下を実行します。
パスワードの変更
ALTER USER PASSWORD IDENTIFIED BY XXXX;
※XXXXのところは、ユーザー名に置き換えて下さい。
※PASSWORDのところは、パスワードに置き換えて下さい。
そして、再度11gのクライアントから19cにアクセスすると、エラー無く、無事に接続できました!