如何关闭Oracle密码过期?


177

我正在使用Oracle进行开发。我一直用来重建数据库的引导程序帐户的密码已过期。

如何永久关闭此用户(和所有其他用户)的密码有效期?

我使用的是Oracle 11g,默认情况下密码已过期。


我认为您最好在serverfault.com上问这个问题。我不会强迫使用它,因为您确实说过您正在使用它进行开发,而且我认为这里的某人仍然有机会知道和/或这里的其他人可能会从此信息中受益。
比尔蜥蜴

我想我会做的。我正在讨论它更适合哪个站点,因为这是一个基本的数据库问题,而与DBA无关。
乔什·科德洛夫

不知道的欺骗政策什么是跨站点的问题,但这里的链接:serverfault.com/questions/37622/...
乔希Kodroff

Answers:


313

要更改Oracle中某个用户配置文件的密码到期策略,请首先检查该用户使用的配置文件:

select profile from DBA_USERS where username = '<username>';

然后,您可以使用以下方法将限制更改为永不过期:

alter profile <profile_name> limit password_life_time UNLIMITED;

如果您想事先检查限额,可以使用:

select resource_name,limit from dba_profiles where profile='<profile_name>';

5
这更改了配置文件。但是,我有一些用户的密码设置为过期,因为默认配置文件在创建时就是这样设置的。如何更改这些用户帐户,以使密码不会过期?
杰伊·埃默曼

14
select username,expiry_date,account_status from dba_users; 查看account_status。对于那些即将到期的帐户,您可能需要最后一次重置一次密码。
Wu Wu

6
更改用户aaa帐户解锁;
Kalpesh Soni

1
为了完整起见,如果您需要将用户更改为其他个人资料:ALTER USER Bob PROFILE MyNonExpiringProfile;

在查询“从DBA_USERS中选择用户名='<用户名>'的配置文件”的查询中未选择任何行;
gaurav

90

对于开发,如果未设置其他配置文件,则可以禁用密码策略(即,默认情况下禁用密码过期):

ALTER PROFILE "DEFAULT" LIMIT PASSWORD_VERIFY_FUNCTION NULL;

然后,重置密码并解锁用户帐户。它永远不会过期:

alter user user_name identified by new_password account unlock;

40

在其他答案的状态下,适当更改用户的配置文件(例如,“ DEFAULT”配置文件)将产生密码,密码一旦设置就永远不会过期。

但是,正如一位评论者所指出的那样,在配置文件的旧值下设置的密码可能已经过期,并且(如果在配置文件的指定宽限期之后)该帐户已被锁定。

具有锁定帐户的过期密码的解决方案(如答复注释中所述)是使用一种版本的ALTER USER命令:

ALTER USER xyz_user ACCOUNT UNLOCK;

但是,unlock命令仅适用于实际上已锁定帐户的帐户,不适用于处于宽限期的帐户,即密码已过期但尚未锁定的帐户。对于这些帐户,必须使用另一版本的ALTER USER命令重置密码:

ALTER USER xyz_user IDENTIFIED BY new_password;

下面是一些SQL * Plus脚本,特权用户(例如,用户'SYS')可以使用该脚本将用户密码重置为存储在数据库中的当前现有哈希值。

编辑:较旧的Oracle版本将密码或密码哈希存储在pword列中,较新的Oracle版本将密码哈希存储在spare4列中。下面的脚本已更改为收集pword和spare4列,但要使用spare4列来重置用户帐户;根据需要进行修改。

REM Tell SQL*Plus to show before and after versions of variable substitutions.
SET VERIFY ON
SHOW VERIFY

REM Tell SQL*Plus to use the ampersand '&' to indicate variables in substitution/expansion.
SET DEFINE '&'
SHOW DEFINE

REM Specify in a SQL*Plus variable the account to 'reset'.
REM Note that user names are case sensitive in recent versions of Oracle.
REM DEFINE USER_NAME = 'xyz_user'

REM Show the status of the account before reset.
SELECT
  ACCOUNT_STATUS,
  TO_CHAR(LOCK_DATE, 'YYYY-MM-DD HH24:MI:SS') AS LOCK_DATE,
  TO_CHAR(EXPIRY_DATE, 'YYYY-MM-DD HH24:MI:SS') AS EXPIRY_DATE
FROM
  DBA_USERS
WHERE
  USERNAME = '&USER_NAME';

REM Create SQL*Plus variable to hold the existing values of the password and spare4 columns.
DEFINE OLD_SPARE4 = ""
DEFINE OLD_PASSWORD = ""

REM Tell SQL*Plus where to store the values to be selected with SQL.
REM Note that the password hash value is stored in spare4 column in recent versions of Oracle,
REM   and in the password column in older versions of Oracle.
COLUMN SPARE4HASH NEW_VALUE OLD_SPARE4
COLUMN PWORDHASH NEW_VALUE OLD_PASSWORD

REM Select the old spare4 and password columns as delimited strings 
SELECT 
  '''' || SPARE4 || '''' AS SPARE4HASH,
  '''' || PASSWORD || '''' AS PWORDHASH
FROM 
  SYS.USER$ 
WHERE 
  NAME = '&USER_NAME';

REM Show the contents of the SQL*Plus variables
DEFINE OLD_SPARE4
DEFINE OLD_PASSWORD

REM Reset the password - Older versions of Oracle (e.g. Oracle 10g and older) 
REM ALTER USER &USER_NAME IDENTIFIED BY VALUES &OLD_PASSWORD;

REM Reset the password - Newer versions of Oracle (e.g. Oracle 11g and newer) 
ALTER USER &USER_NAME IDENTIFIED BY VALUES &OLD_SPARE4;

REM Show the status of the account after reset
SELECT
  ACCOUNT_STATUS,
  TO_CHAR(LOCK_DATE, 'YYYY-MM-DD HH24:MI:SS') AS LOCK_DATE,
  TO_CHAR(EXPIRY_DATE, 'YYYY-MM-DD HH24:MI:SS') AS EXPIRY_DATE
FROM
  DBA_USERS
WHERE
  USERNAME = '&USER_NAME';

2
谢谢您的帮助。很难找到相关答案。其他所有答案仅指PASSWORD_LIFE_TIME。
sabertiger 2014年

SYS.USER $ .PASSWORD列将仅包含密码的不区分大小写(大写?)版本的哈希。在Oracle 11中,除非您设置系统参数SEC_CASE_SENSITIVE_LOGON = FALSE,否则SYS.USER $ .SPARE4列中区分大小写的密码的散列会更长。
Morbo 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.