收到Your password will be expired with in 7 days消息后,我将default配置文件中的密码过期天数更改为UNLIMITED,但部分用户的帐户状态仍为EXPIRE(GRACE)。 有没有办法在不重置密码的情况下将Oracle用户帐户状态从EXPIRE(GRACE)更改为OPEN?
--Purpose: Change a user from EXPIRED to OPEN by setting a user's password to the same value.
--This PL/SQL block requires elevated privileges and should be run as SYS.
--This task is difficult because we need to temporarily change profiles to avoid
-- errors like "ORA-28007: the password cannot be reused".
--
--How to use: Run as SYS in SQL*Plus and enter the username when prompted.
-- If using another IDE, manually replace the variable two lines below.
declare
v_username varchar2(128) := trim(upper('&USERNAME'));
--Do not change anything below this line.
v_profile varchar2(128);
v_old_password_reuse_time varchar2(128);
v_uses_default_for_time varchar2(3);
v_old_password_reuse_max varchar2(128);
v_uses_default_for_max varchar2(3);
v_alter_user_sql varchar2(4000);
begin
--Get user's profile information.
--(This is tricky because there could be an indirection to the DEFAULT profile.
select
profile,
case when user_password_reuse_time = 'DEFAULT' then default_password_reuse_time else user_password_reuse_time end password_reuse_time,
case when user_password_reuse_time = 'DEFAULT' then 'Yes' else 'No' end uses_default_for_time,
case when user_password_reuse_max = 'DEFAULT' then default_password_reuse_max else user_password_reuse_max end password_reuse_max,
case when user_password_reuse_max = 'DEFAULT' then 'Yes' else 'No' end uses_default_for_max
into v_profile, v_old_password_reuse_time, v_uses_default_for_time, v_old_password_reuse_max, v_uses_default_for_max
from
(
--User's profile information.
select
dba_profiles.profile,
max(case when resource_name = 'PASSWORD_REUSE_TIME' then limit else null end) user_password_reuse_time,
max(case when resource_name = 'PASSWORD_REUSE_MAX' then limit else null end) user_password_reuse_max
from dba_profiles
join dba_users
on dba_profiles.profile = dba_users.profile
where username = v_username
group by dba_profiles.profile
) users_profile
cross join
(
--Default profile information.
select
max(case when resource_name = 'PASSWORD_REUSE_TIME' then limit else null end) default_password_reuse_time,
max(case when resource_name = 'PASSWORD_REUSE_MAX' then limit else null end) default_password_reuse_max
from dba_profiles
where profile = 'DEFAULT'
) default_profile;
--Get user's password information.
select
'alter user '||name||' identified by values '''||
spare4 || case when password is not null then ';' else null end || password ||
''''
into v_alter_user_sql
from sys.user$
where name = v_username;
--Change profile limits, if necessary.
if v_old_password_reuse_time <> 'UNLIMITED' then
execute immediate 'alter profile '||v_profile||' limit password_reuse_time unlimited';
end if;
if v_old_password_reuse_max <> 'UNLIMITED' then
execute immediate 'alter profile '||v_profile||' limit password_reuse_max unlimited';
end if;
--Change the user's password.
execute immediate v_alter_user_sql;
--Change the profile limits back, if necessary.
if v_old_password_reuse_time <> 'UNLIMITED' then
if v_uses_default_for_time = 'Yes' then
execute immediate 'alter profile '||v_profile||' limit password_reuse_time default';
else
execute immediate 'alter profile '||v_profile||' limit password_reuse_time '||v_old_password_reuse_time;
end if;
end if;
if v_old_password_reuse_max <> 'UNLIMITED' then
if v_uses_default_for_max = 'Yes' then
execute immediate 'alter profile '||v_profile||' limit password_reuse_max default';
else
execute immediate 'alter profile '||v_profile||' limit password_reuse_max '||v_old_password_reuse_max;
end if;
end if;
end;
/
select
'alter user ' || su.name || ' identified by values'
|| ' ''' || spare4 || ';' || su.password || ''';'
from sys.user$ su
join dba_users du on ACCOUNT_STATUS like 'EXPIRED%' and su.name = du.username;
SQL> select username, account_status from dba_users where username='BOB';
USERNAME ACCOUNT_STATUS
------------------------------ --------------------------------
BOB EXPIRED
步骤-2使用下面的查询获取用户密码。
SQL>SELECT 'ALTER USER '|| name ||' IDENTIFIED BY VALUES '''|| spare4 ||';'|| password ||''';' FROM sys.user$ WHERE name='BOB';
ALTER USER BOB IDENTIFIED BY VALUES 'S:9BDD17811E21EFEDFB1403AAB1DD86AB481E;T:602E36430C0D8DF7E1E453;2F9933095143F432';
步骤-3在查询后运行
SQL> ALTER USER BOB IDENTIFIED BY VALUES 'S:9BDD17811E21EFEDFB1403AAB1DD86AB481E;T:602E36430C0D8DF7E1E453;2F9933095143F432';
User altered.
步骤-4:检查用户帐户状态
SQL> select username, account_status from dba_users where username='BOB';
USERNAME ACCOUNT_STATUS
------------------------------ --------------------------------
BOB OPEN
7条答案
按热度按时间clj7thdc1#
不能,您不能在不重置密码的情况下 * 直接 * 将帐户状态从EXPIRE(GRACE)更改为OPEN。
文档中写道:
如果使用PASSWORD EXPIRE使数据库用户的口令过期,则用户(或DBA)必须更改口令,然后才能在口令过期后尝试登录数据库。
但是,您可以通过将用户的密码哈希重置为现有值来将状态"间接"更改为OPEN。不幸的是,将密码哈希设置为自身会带来以下问题,几乎所有其他解决方案都会忽略其中至少一个问题:
1.不同版本的Oracle使用不同类型的哈希。
1.用户的配置文件可能会阻止重复使用密码。
1.轮廓限制可以更改,但我们必须在最后更改回值。
1.概要文件的值并不是微不足道的,因为如果值是
DEFAULT
,它就是指向DEFAULT
概要文件值的指针,我们可能需要递归地检查概要文件。下面这个大得离谱的PL/SQL块应该可以处理所有这些情况。它应该使用相同的口令哈希将任何帐户重置为OPEN,而不管Oracle版本或概要文件设置如何。并且概要文件将更改回原始限制。
u5rb5r592#
根据jonearles的回答编译,http://kishantha.blogspot.com/2010/03/oracle-enterprise-manager-console.html和http://blog.flimatech.com/2011/07/17/changing-oracle-password-in-11g-using-alter-user-identified-by-values/(Oracle 11 g):
要在将来阻止这种情况发生,请执行以下操作。
要重置用户状态,请运行查询:
并执行结果集中的一些或全部。
carvr3hs3#
这将输出如下内容:
只需使用alter user的第一部分即可:
这将使帐户回到
OPEN
状态,而不更改密码(只要您从DBMS_METADATA.GET_DDL
的输出中正确地剪切和粘贴散列值),您甚至不需要知道密码是什么。vnjpjtjt4#
如果您知道该用户的密码,或者您想猜一猜,请执行以下操作:
如果这个命令成功连接,你会看到消息“connected”,否则你会看到一个错误消息。如果你成功登录,那意味着你知道密码。在这种情况下,只要做:
alter user NAME_OF_THE_USER identified by OLD_PASSWORD;
这会将密码重置为与之前相同的密码,并重置该用户的account_status。
jckbn6z75#
步骤-1需要使用以下查询查找用户详细信息
步骤-2使用下面的查询获取用户密码。
步骤-3在查询后运行
步骤-4:检查用户帐户状态
o4hqfura6#
第I部分(查找用户是否存在)
--可以使用系统类型帐户(例如SYS)进行检查
select username, account_status from dba_users where username='BOB';
select username, account_status from dba_users where username like 'BOB%';
select username, account_status from dba_users where like '%BOB%';
PART II更改帐户属性
SQL〉
ALTER user [username] account UNLOCK;
--解除锁定帐户SQL〉
Alter user [username] IDENTIFIED BY "password";
--将更改用户的密码edqdpe6u7#
SQL〉ALTER用户[用户名]帐户UNLOCK;--如果帐户已锁定,则将其解锁
SQL〉修改用户[用户名]标识为“密码”;--将更改用户的密码
这个对我有用。