Như các câu trả lời khác nêu rõ, việc thay đổi hồ sơ người dùng (ví dụ: hồ sơ 'DEFAULT') sẽ dẫn đến mật khẩu, một khi được đặt, sẽ không bao giờ hết hạn.
Tuy nhiên, như một người bình luận chỉ ra, mật khẩu được đặt dưới các giá trị cũ của hồ sơ có thể đã hết hạn và (nếu sau thời gian ân hạn được chỉ định của hồ sơ), tài khoản sẽ bị khóa.
Giải pháp cho mật khẩu đã hết hạn với các tài khoản bị khóa (như được cung cấp trong một bình luận trả lời) là sử dụng một phiên bản của lệnh ALTER USER:
ALTER USER xyz_user ACCOUNT UNLOCK;
Tuy nhiên, lệnh mở khóa chỉ hoạt động đối với các tài khoản mà tài khoản thực sự bị khóa, nhưng không áp dụng cho các tài khoản đang trong thời gian gia hạn, tức là khi mật khẩu hết hạn nhưng tài khoản chưa bị khóa. Đối với các tài khoản này, mật khẩu phải được đặt lại bằng một phiên bản khác của lệnh ALTER USER:
ALTER USER xyz_user IDENTIFIED BY new_password;
Dưới đây là một tập lệnh SQL * Plus nhỏ mà người dùng đặc quyền (ví dụ: người dùng 'SYS') có thể sử dụng để đặt lại mật khẩu của người dùng về giá trị băm hiện tại được lưu trữ trong cơ sở dữ liệu.
EDIT: Các phiên bản cũ hơn của Oracle lưu trữ mật khẩu hoặc mật khẩu băm trong cột pword, các phiên bản mới hơn của Oracle lưu trữ mật khẩu băm trong cột tùng4. Tập lệnh bên dưới đã thay đổi để thu thập các cột pword và phụ tùng4, nhưng để sử dụng cột phụ tùng 4 để thiết lập lại tài khoản của người dùng; sửa đổi khi cần thiết
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';