2

私は ac# クライアントを持っており、Oracle 10g データベースを使用しています。

私のクエリは次のとおりです。

  1. 有効期限の猶予期間は有効期限を超えていますか?
  2. ユーザーが猶予期間中の場合、ユーザーはクエリを使用して自分のパスワードを変更できますが、ALTER USER XYZ IDENTIFIED BY SOMEPWDDBA に連絡する必要があります。
  3. C# クライアントで oracle 警告 ORA-28002 (ユーザーが猶予期間中の場合) を処理するにはどうすればよいですか。c# クライアントに送信されます。それでも例外として処理されますか (try-catch)。
  4. パスワードの有効期限が切れている場合、パスワードを変更できるのは DBA のみです。
  5. 有効期限が猶予期間を超えた場合にも、アカウントはロックされますか。

私は sys dba ではないので、dba_users または dba_profiles にアクセスできないことに注意してください。

前もって感謝します。

4

3 に答える 3

4

最後に、問題の解決策を見つけました。皆様へのポイントは以下の通りです。

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) 有効期限が猶予期間を超えた場合にも、アカウントはロックされますか。

回答: いいえ、ロックではなく期限切れになります。

于 2011-07-26T04:23:20.253 に答える
1

はい、猶予期間は有効期限を超えています。私が間違っていなければ、これがどのように起こるか、30 日間の有効期限と 5 の猶予期間があります。猶予期間は、30 日の制限後に行われた最初のログインから重要です。この 5 日間で、パスワードを変更するオプションがあります。

Oracle は、ユーザーが自分のパスワードを変更することを暗黙的に許可しているため、猶予期間内に変更することができます。それ以外の場合は、別のユーザーのパスワードを変更する権限を持つ別のユーザーが必要になります。

猶予期間を過ぎた場合、アカウントはロックされ、パスワードの変更でロックが解除されます。

于 2011-07-18T10:31:15.840 に答える
0

ポイント 3 について: ORA-28002 が発生した場合、ODP.Net は例外をスローせず、OracleInfoMessageEventHandler をトリガーしません。Google 検索では、これが ODP のバグであることのみが示されていますが、修正されていることへの言及はありません。

これが私たちの回避策です... 特定のユーザーのパスワードの有効期限を判断するために DBA_USERS を参照するストアド ファンクションを作成しました。この関数は、作成者 (この DBA ビューを表示する特権を持つ) の承認コンテキストで実行するために作成されます。

create or replace function GetExpDate(vUser in varchar2) return DATE
AUTHID DEFINER
as
expDate date;
begin
   select nvl(expiry_date, sysdate+100) 
   into expDate 
   from dba_users
   where username = vUser;

   return expDate;

exception
when others then
   return sysdate+100;
end; 

ユーザーが正常にログインした後、この機能をチェックして有効期限が近づいているかどうかを確認し、有効期限が近づいている場合はパスワードを変更するように求めます。

于 2015-09-11T15:26:49.370 に答える