ORA-28002: the password will expire within XXX days
By: Date: 19.02.2013 Categories: !RUS,Errors,ORACLE Метки:
ENG: ORA-28002: the password will expire within XXX days

В Oracle 11g при попытке соединения с БД появляется сообщение об ошибке:

ORA-28002: the password will expire within XXX days

Вот цитата из документации:

ORA-28002: the password will expire within string days
Cause: The user's account is about to about to expire and the password needs to be changed
Action: change the password or contact the DBA

Причина:

В версии Oracle 11g изменился профиль для пользователей по умолчанию (DEFAULT). В основном изменились параметры имеющие отношения к паролю. В Oracle 10g все они были равны UNLIMITED, в Oracle 11g они получили конкретные значения. Именно по этому периодически возникает ORA-28002.
©Bobrovsky Dmitry
PASSWORD_LIFE_TIME = 180
В течении PASSWORD_LIFE_TIME дней (180) пользователь может использовать текущий пароль.

PASSWORD_GRACE_TIME = 7
Когда период PASSWORD_LIFE_TIME (180 дней) заканчивается, пользователю дается еще PASSWORD_GRACE_TIME (7 дней) в течении которых он должен изменить пароль. Потом учетная запись блокируется.
©Bobrovsky Dmitry
FAILED_LOGIN_ATTEMPTS = 10
Столько неудачных попыток дается пользователю соединиться с БД прежде чем заблокировать учетную запись. (Неудача обычно бывает из-за неправильного пароля = Нажат CapsLock или неправильная раскладка клавиатуры или (для 11g) неправильный регистр пароля).

PASSWORD_LOCK_TIME = 1
После FAILED_LOGIN_ATTEMPTS (10) неудачных попыток, учетная запись будет заблокирована на PASSWORD_LOCK_TIME дней (на 1 день).

Чтобы посмотреть параметры профиля, выполните запрос

SELECT resource_name, resource_type, LIMIT
FROM dba_profiles
WHERE profile = 'DEFAULT';

Подробнее об изменении профиля читать — 11G DEFAULT Profile Changes [ID 454635.1]

Решения:

— Можно подчиниться параметрам безопасности. Тогда каждый пользователь каждые 180 дней должен менять пароль.
Dmitry Bobrovsky
— Можно изменить параметры профиля DEFAULT или создать свой профиль с параметрами удобными для вас и назначить его пользователям.
Dmitry Bobrovsky
— Что бы полностью отключить проверку длительности использования пароля, нужно установить параметр PASSWORD_LIFE_TIME в UNLIMITED. И обязательно изменить пароль! (можно изменить фиктивно, т.е. оставить тот же, но процедуру изменения пароля нужно провести).

ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED;
ALTER USER XXX IDENTIFIED BY "xxx";

Чтобы изменить пароль сразу у множества пользователей можно использовать процедуру.

Значения параметр astatus возможно посмотреть так:

select * from sys.user_astatus_map;

STATUS#    STATUS
0    OPEN
1    EXPIRED
2    EXPIRED(GRACE)
4    LOCKED(TIMED)
8    LOCKED
5    EXPIRED & LOCKED(TIMED)
6    EXPIRED(GRACE) & LOCKED(TIMED)
9    EXPIRED & LOCKED
10    EXPIRED(GRACE) & LOCKED

connect / as sysdba

spool runme.sql

set serveroutput on size 200000

declare
    stmt varchar2(200);
    v_old_hash user$.password%type;
    v_new_hash user$.spare4%type;
    v_hash varchar2(200);
begin
   for user_rec in (select name, password, spare4 from user$ where type#=1 and astatus in(1,2)) loop
      v_old_hash := user_rec.password;
      v_new_hash := user_rec.spare4;
      if not ((v_old_hash is null) and (v_new_hash is null)) then
         if (v_new_hash is null) then
             if v_old_hash <> 'EXTERNAL' then
                 v_hash := ''''||v_old_hash||'''';
             else
             goto end_loop;
         end if;
      end if;
      if (v_old_hash is null) then
          v_hash := ''''||v_new_hash||'''';
      end if;
      if ((v_old_hash is not null) and (v_new_hash is not null)) then
          v_hash := ''''||v_old_hash||';'||v_new_hash||'''';
      end if;
          stmt := 'alter user '||user_rec.name||' identified by values'||v_hash;
      end if;
     dbms_output.put_line(stmt||';');
  <>
  null;
  end loop;
end;
/

spool off

Запись ORA-28002: the password will expire within XXX days впервые появилась Dmitry Bobrovsky Blog