如何关闭 Oracle 密码过期?

我在用甲骨文进行开发。我经常用来重建数据库的引导程序帐户的密码已经过期。

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

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

581907 次浏览

我相信密码过期行为,默认情况下,是永远不会过期的。但是,您可以为开发人员用户集设置一个概要文件,并设置 PASSWORD_LIFE_TIME。有关详细信息,请参阅 奥拉法克。您可以查看 给你,以获得一个人的视角和用法的示例。

要更改 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>';

对于 发展,如果没有设置其他配置文件,可以禁用密码策略(即在缺省配置文件中禁用密码过期) :

ALTER PROFILE "DEFAULT" LIMIT PASSWORD_VERIFY_FUNCTION NULL;

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

alter user user_name identified by new_password account unlock;

正如其他回答所述,适当地更改用户的配置文件(例如‘ DEFAULT’配置文件)将导致密码,一旦设置,将永远不会过期。

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

对于锁定帐户的过期密码(如回答注释中提供的) ,解决方案是使用 ALTER USER 命令的一个版本:

ALTER USER xyz_user ACCOUNT 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';

我将建议关闭密码过期不是一个好主意,因为它可能导致对数据的机密性、完整性和可用性的威胁。

如果你想的话。

如果您有正确的访问权限,请使用 SQL

SELECT 用户名,account _ status FROM dba _ users;

这应该会给你这样的结果。

   USERNAME                       ACCOUNT_STATUS
------------------------------ -----------------


SYSTEM                         OPEN
SYS                            OPEN
SDMADM                         OPEN
MARKETPLACE                    OPEN
SCHEMAOWNER                    OPEN
ANONYMOUS                      OPEN
SCHEMAOWNER2                   OPEN
SDMADM2                        OPEN
SCHEMAOWNER1                   OPEN
SDMADM1                        OPEN
HR                             EXPIRED(GRACE)


USERNAME                       ACCOUNT_STATUS
------------------------------ -----------------


APEX_PUBLIC_USER               LOCKED
APEX_040000                    LOCKED
FLOWS_FILES                    LOCKED
XS$NULL                        EXPIRED & LOCKED
OUTLN                          EXPIRED & LOCKED
XDB                            EXPIRED & LOCKED
CTXSYS                         EXPIRED & LOCKED
MDSYS                          EXPIRED & LOCKED

现在你可以用佩德罗 · 卡里科回答 https://stackoverflow.com/a/6777079/2432468

对于那些使用 Oracle 12.1.0进行开发的用户: < br > 我发现上面的方法对 db 用户“ system”没有影响,因为 account _ status 将保留在过期的宽限期内。< br > < br > 最简单的解决方案是使用 SQL Developer: < br > 在 SQL Developer 中,我必须进入: View/DBA/Security,然后是 Users/System,然后是右边的: Actions/Expire,然后是: Actions/Edit,我可以取消勾选过期选项。< br > < br > 这清除了 account _ status,它再次显示 OPEN,SQL Developer 不再显示 ORA-28002消息。