我有一个c#客户端,我正在使用oracle 10g数据库。
我的查询是:
ALTER USER XYZ IDENTIFIED BY SOMEPWD
更改其密码,或者仍需要联系DBA。 请注意我不是sys dba所以我无法访问dba_users或dba_profiles。
提前致谢。
答案 0 :(得分:4)
最后,我找到了解决问题的方法。以下是每个人信息的要点:
1)到期宽限期是否超过了有效期?
答案:是的,超过了它。
2)当用户处于宽限期时,用户可以使用查询“由SOMEPWD识别的ALTER USER XYZ”来更改他/她的密码,或者他仍然需要联系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和Oracle之间的非合作运动。 OpenWithNewPassword支持仅适用于Driver ODP(OracleDataProvider)和本机OCL。有关详细信息,请参阅链接:MSDN或Oracle。
5)当到期日超过宽限期时,账户也会被锁定。
答案:不会过期但未锁定。
答案 1 :(得分:1)
是的,宽限期高于失效日期,如果我没有弄错,这就是它发生的原因,你有30天的有效期和5的优惠。现在发布30天的期限,用户已过期,现在你进入宽限期,这是在30天限制后首次登录时的重要时间。现在,在这5天内,您可以选择更改密码。
Oracle隐式允许用户更改自己的密码,因此您可以在宽限期内更改密码,否则您将需要具有更改其他用户密码权限的其他用户。
如果您已超过宽限期,则帐户会被锁定,并且会在密码更改时解锁。
答案 2 :(得分:0)
关于第3点:根据我们的经验,当ORA-28002发生时,ODP.Net不会抛出异常,也不会触发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;
用户成功登录后,我们会检查此功能是否接近过期,如果是,则提示他们更改密码。