2011-07-18 23 views
1

我有一個C#客戶端,並且正在使用Oracle 10g數據庫。使用C#客戶端處理Oracle密碼過期和寬限期

我的查詢是:

  1. 是到期寬限期之上exiry日期?
  2. 當用戶處於寬限期時,用戶可以使用查詢ALTER USER XYZ IDENTIFIED BY SOMEPWD來更改他/她的密碼,或者他仍然需要聯繫DBA。
  3. 如何在c#客戶端中處理oracle警告ORA-28002(當用戶處於寬限期時)。它是否會傳遞給C#客戶端。它仍會作爲異常處理(try-catch)。
  4. 密碼已過期時,是否只有DBA可以更改密碼。
  5. 當到期日期已超出寬限期時,帳戶是否也被鎖定。

請注意我不是sys dba,所以我無法訪問dba_users或dba_profiles。

在此先感謝。

回答

3

最後我找到了解決我的問題。以下是每個人信息的要點:

1)期滿寬限期是否超過期限?

答:是的,它超過了以上。

2)當用戶處於寬限期時,用戶可以使用查詢「ALTER USER XYZ IDENTIFIED BY SOMEPWD」更改他/她的密碼,或者他仍然需要聯繫DBA。

答:沒有用戶不能運行此查詢,因爲它首先需要連接到數據庫。使用過期的密碼不能連接。

3)如何在c#客戶端中處理oracle警告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和甲骨文之間不合作。 OpenWithNewPassword支持僅在Driver ODP(OracleDataProvider)和本機OCL中可用。詳情請參閱鏈接:MSDNOracle

5)當到期日已超出寬限期時,帳戶也會被鎖定。

回答:不,它過期未鎖定。

1

是的寬限期高於過期日期,如果我沒有錯,這是怎麼回事,你有30天的期限和5的寬限。現在發佈30天期限用戶已過期,現在您進入寬限期,這是從30天限制之後的第一次登錄開始顯着。現在在這5天內,您可以選擇更改密碼。

Oracle隱式允許用戶更改自己的密碼,因此您可以在寬限期內更改它,否則您將需要具有更改其他用戶密碼權限的其他用戶。

如果您甚至超過寬限期,則帳戶將被鎖定,並且將在密碼更改時解鎖。

+0

thx,關於第3點的任何想法。我在c#客戶端中獲取錯誤或警告,我們如何處理它。 – Pradeep

+0

它引發了一個'InfoMessage'事件,用於警告您將需要檢查* ODP.NET和Microsoft提供程序中的OracleConnection類在Oracle發送警告或信息消息時引發InfoMessage事件。* .. [Read On]( http://msdn.microsoft.com/en-us/library/ms971518.aspx) – V4Vendetta

0

關於第3點:我們的經驗是ODP.Net不會在ORA-28002發生時拋出異常並觸發OracleInfoMessageEventHandler。谷歌搜索只顯示這是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; 

用戶成功登錄後,我們檢查這個函數來查看它們是否接近到期,如果是提示他們更改密碼。