El mensaje del ORA-28000 es muy descriptivo y básicamente nos cuenta todo lo que necesitamos saber: que la cuenta del usuario al que estamos intentando acceder está bloqueada.
Es muy probable que esto se deba a nuestra política de cambio de contraseñas, por defecto Oracle proporciona 180 días al valor PASSWORD_LIFE_TIME. Lo que quiere decir que cada 6 meses tendremos que cambiar la contraseña o, de lo contrario, bloqueará la cuenta y recibiremos el ORA-28000. Esto lo expliqué más a fondo en el artículo sobre el ORA-28002. En cualquier caso, vamos a volver a repasar nuestras opciones:
Desbloquear el usuario
Con el siguiente comando puedes desbloquear la cuenta de usuario:
alter user <NOMBRE_USUARIO> account unlock;
Desbloquear usuario y actualizar su contraseña
Como decía, es muy posible que tengas que cambiar también la contraseña del usuario ya que ésta ha expirado por la política definida en el perfil. Puedes hacerlo de la siguiente forma:
alter user <NOMBRE_USUARIO> identified by <CONTRASEÑA> account unlock;
En este comando puedes volver a introducir la contraseña que ya tiene el usuario, de ésta forma resetearás la política sin cambiar realmente la contraseña.
Resetear la contraseña sin conocerla
Puede que te encuentres en la peliaguda situación de que no conozcas la contraseña. Si este es tu caso, aquí te voy a enseñar un truco con el que podrás resetear la contraseña (introduciendo la misma que ya tenía el usuario), aún sin tu conocerla. Esto será posible gracias al siguiente comando:
select dbms_metadata.get_ddl('USER','<NOMBRE_USUARIO>') from dual;
Este comando nos generará la DDL de creación del usuario en cuestión, donde podremos ver su contraseña encriptada. En pantalla veremos algo parecido a ésto:
"CREATE USER "NINJA" IDENTIFIED BY VALUES 'S:06747BB70F9B43D3ABD7192EF52ED702A80B350815840BAB04D9BF06EB97;T:EE01B6DB70F53BF5772D85D1AD6D65A8C524CF62560C71C4877F59958F5587FF86CF32530A7A1E0CD8526948CBFDB2A0228C1CDFF1F70A22701C6B50ED515E3B32D247A6FBVAC68ED1272DDABF734159;42371C1D20D0B50B'
DEFAULT TABLESPACE "NINJA_DATOS"
TEMPORARY TABLESPACE "TEMP""
La contraseña encriptada está entrecomillada después del parámetro BY VALUES. Con este dato podemos montar la siguiente sentencia:
alter user NINJA identified by 'S:06747BB70F9B43D3ABD7192EF52ED702A80B350815840BAB04D9BF06EB97;T:EE01B6DB70F53BF5772D85D1AD6D65A8C524CF62560C71C4877F59958F5587FF86CF32530A7A1E0CD8526948CBFDB2A0228C1CDFF1F70A22701C6B50ED515E3B32D247A6FBVAC68ED1272DDABF734159;42371C1D20D0B50B' account unlock;
Y de esta forma reseteamos la contraseña. El usuario ya podrá entrar de forma habitual.
¿Cómo evitar que las contraseñas caduquen?
Lo primero que tenemos que saber es que la caducidad de las contraseñas no se define a nivel de usuario sino de perfil. Para ello tendremos que ver cuál es el perfil que nos interesa cambiar (normalmente será el DEFAULT) y una vez que lo sepamos lanzar la siguiente sentencia:
alter profile <NOMBRE_PERFIL> limit password_life_time UNLIMITED;