最後に、問題の解決策を見つけました。皆様へのポイントは以下の通りです。
1) 有効期限の猶予期間は有効期限を超えていますか?
回答: はい、それ以上です。
2) ユーザーが猶予期間中の場合、ユーザーはクエリ「ALTER USER XYZ IDENTIFIED BY SOMEPWD」を使用して自分のパスワードを変更できます。または、DBA に連絡する必要があります。
回答: 最初にデータベースに接続する必要があるため、このクエリを実行できるユーザーはいません。期限切れのパスワードでは接続できません。
3) C# クライアントでオラクルの警告 ORA-28002 (ユーザーが猶予期間中の場合) を処理するにはどうすればよいですか。c# クライアントに送信されます。それでも例外として処理されますか (try-catch)。
回答: ORA-28002 エラーは、C# クライアントで OracleClientInfoMessage として処理できます。これがサンプルコードです。
try
{
OracleConnection conn = new OracleConnection("User ID=" + uid + ";Password=" + pwd + ";SERVER=" + server);
conn.InfoMessage += new OracleInfoMessageEventHandler(GetOracleWarningInfoMessage);
conn.Open();
return ConnectionStatus.OK;
}
catch (System.Data.OracleClient.OracleException ex)
{
Logger.Error(ex);
switch (ex.Code)
{
case 1005: //null password given
errmsg = "Invalid password";
return ConnectionStatus.InvalidUserPwd;
case 1017: //invalid username/password
errmsg = "Invalid username/password";
return ConnectionStatus.InvalidUserPwd;
case 1040: //invalid character in password
errmsg = "Invalid password";
return ConnectionStatus.InvalidUserPwd;
case 28000://account locked
errmsg = "Account locked. Contact DBA or wait for PASSWORD_LOCK_TIME";
return ConnectionStatus.Locked;
case 28001://password expired
errmsg = "Password expired. Contact DBA";
return ConnectionStatus.Expired;
default:
errmsg = ex.Message;
return ConnectionStatus.Failed;
}
}
4) パスワードの有効期限が切れている場合、パスワードを変更できるのは DBA だけですか。
回答: ユーザーは自分でパスワードを変更できます。SQLPlus または ODP.net ドライバーを使用している場合は、プロンプトが表示されます。ただし、OracleClient (Microsoft) ドライバーを使用している場合は、OpenWithNewPassword 機能 (接続を確立する前にパスワードを変更できる) がないため、これを行うことはできません。おそらく、Mircosoft と Oracle の間で非協力的な動きがあったためです。OpenWithNewPassword のサポートは、ドライバー ODP (OracleDataProvider) およびネイティブ OCL でのみ使用できます。詳細については、MSDNまたはOracleのリンクを参照してください。
5) 有効期限が猶予期間を超えた場合にも、アカウントはロックされますか。
回答: いいえ、ロックではなく期限切れになります。