如何关闭Oracle密码到期?

Jos*_*off 167 security oracle

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

如何永久关闭此用户(以及所有其他用户)的密码过期时间?

我使用的是Oracle 11g,默认密码过期.

Ped*_*iço 298

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

select profile from DBA_USERS where username = '<username>';
Run Code Online (Sandbox Code Playgroud)

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

alter profile <profile_name> limit password_life_time UNLIMITED;
Run Code Online (Sandbox Code Playgroud)

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

select resource_name,limit from dba_profiles where profile='<profile_name>';
Run Code Online (Sandbox Code Playgroud)

  • `从dba_users中选择用户名,expiry_date,account_status;`以查看account_status.对于那些即将到期的帐户,您可能需要最后一次重置密码. (13认同)
  • 改变用户aaa帐户解锁; (5认同)
  • 这改变了配置文件.但是,我的用户密码设置为过期,因为默认配置文件在创建时具有相同的密码.如何更改这些用户帐户以使密码不会过期? (4认同)
  • 为了完整起见,如果您需要将用户更改为另一个配置文件:“ALTER USER Bob PROFILE MyNonExpiringProfile;”。 (2认同)

Shi*_*mon 86

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

ALTER PROFILE "DEFAULT" LIMIT PASSWORD_VERIFY_FUNCTION NULL;
Run Code Online (Sandbox Code Playgroud)

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

alter user user_name identified by new_password account unlock;
Run Code Online (Sandbox Code Playgroud)


Kie*_*rdy 35

正如其他答案所述,更改用户的个人资料(例如"DEFAULT"个人资料)将导致密码一旦设置,将永不过期.

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

具有锁定帐户的过期密码解决方案(在回答评论中提供)是使用一个版本的ALTER USER命令:

ALTER USER xyz_user ACCOUNT UNLOCK;
Run Code Online (Sandbox Code Playgroud)

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

ALTER USER xyz_user IDENTIFIED BY new_password;
Run Code Online (Sandbox Code Playgroud)

下面是一个小的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';
Run Code Online (Sandbox Code Playgroud)

  • 谢谢您的帮助。很难找到相关的答案。所有其他答案仅指 PASSWORD_LIFE_TIME。 (2认同)

akf*_*akf 16

我认为默认情况下密码过期行为永不过期.但是,您可以为开发用户集设置配置文件并设置PASSWORD_LIFE_TIME.有关详细信息,请参阅orafaq.您可以在此处查看一个人的观点和用法的示例.

  • 我认为在一个新的11g安装(而不是升级)中推荐的改进安全性,密码将默认在30天后过期. (7认同)
  • 在 11g 上是 180 天:http://docs.oracle.com/cd/E38689_01/pt853pbr0/eng/pt/tadm/task_WorkingWithOracle11gSecurityFeatures-3e78fd.html (2认同)