Да, это поддерживается со времени Oracle 9i, когда была введена функция, которая проверяет новый пароль на сложность и, в случае необходимости, на отличие от старого пароля.Так как Oracle хранит только хэши, а не пароли, он не может сравнивать старые и новые пароли, если пользователь не предоставит их во время изменения.
Таким образом, требуются все пользователи с PROFILE
, для которого установлен PASSWORD_VERIFY_FUNCTION
.чтобы иметь старый пароль, даже если эта функция не проверяет пароли:
CREATE OR REPLACE FUNCTION always_true (
username VARCHAR2,
password VARCHAR2,
old_password VARCHAR2) RETURN boolean IS
BEGIN
RETURN TRUE;
END always_true;
/
CREATE PROFILE always_true
LIMIT PASSWORD_VERIFY_FUNCTION always_true;
CREATE USER user_a IDENTIFIED BY secret123 PROFILE always_true;
GRANT CREATE SESSION to user_a;
Теперь user_a
должен указать старый пароль:
ALTER USER user_a IDENTIFIED BY secret123;
ORA-28221: REPLACE not specified
ALTER USER user_a IDENTIFIED BY secret456 REPLACE secret123;
User altered.
Пользователь спрофиль без PASSWORD_VERIFY_FUNCTION
или для этого параметра, установленного на NULL
, необязательно указывать старый пароль:
CREATE PROFILE without_function
LIMIT PASSWORD_VERIFY_FUNCTION NULL;
CREATE USER user_b IDENTIFIED BY secret123 PROFILE without_function;
GRANT CREATE SESSION to user_b;
Теперь user_b
может изменить свой пароль, не имея старого пароля:
ALTER USER user_b IDENTIFIED BY secret789;
User altered.
Второй вариант - иметь привилегию ALTER USER
, но это только для администраторов, поскольку они могут изменять все пароли всех учетных записей.