Cuando trabajamos remotamente contra una instancia que se encuentra en un host en algún sitio, Oracle de alguna manera debe validar el usuario DBA.
Podemos observar que la base no podria almacenar nunca la validación , ya que al momento de bajar una instancia , no podríamos levantarla más, por que no podríamos accesar a la base de ninguna manera. Es por ello que la validación se produce desde el exterior de la instancia y lo hace por medio de un archivo que es conocido como password file.
Es asi que el DBA o la aplicación que tuviere la facultad de poder levantar la instancia , debe ser validado por el archivo que se encuentra en el OS.
En el parametro remote_login_passwordfile nos especifica si un password file esta encargado o no de validar al usuario.
Cuando generamos el archivo, este sera almacenado por default en los siguientes paths según el tipo de OS tengamos :
En los tipos Unix:
$ORACLE_HOME/dbs/orapw$ORACLE_SID
En los ambientes Windows:
%ORACLE_HOME%\database\PWD%ORACLE_SID%.ora
Si pwfile esta en modo SHARED o EXCLUSIVE MODE también se almacena en el archivo de contraseñas.
Después de su creación, el estado es SHARED.
El estado puede ser cambiado mediante modificación del remote_login_passwordfile de la base de datos. Es decir, la base de datos sobrescribe el estado en el archivo de contraseña cuando se inicia.
Recordemos que el pwfile cuyo estado es SHARED solo puede contener SYS.
Como creamos un pwfile
El pwfile se crea con el comando orapwd y según el OS que usemos sera:
Oracle RDBMS 10gR2 para ambientes UNIX OS
orapwd file=orapwsid password=password entries=max_users force=y/n
Si el parametro FILE no esta seteado con el path , este sera creado en el directorio donde estemos parados.
Es importante trabajar ordenados y que el pwfile se encuentre el $ORACLE_HOME/dbs
Oracle RDBMS 10gR2 para ambientes Microsoft Windows
orapwd FILE=PWDsid.ora PASSWORD=password ENTRIES=max_users FORCE=y/n
Si el parametro FILE no esta seteado con el path , este sera creado en el directorio donde estemos parados.
La base busca en el registro para conocer el valor del ORA_SID_PWFILE.
Si el valor no fue declarados entonce el registro lee el valor de la variable ORA_PWFILE, los valores de usernames, passwords y privilegios.
Si no fue seteado , entoces usa los valores por defecto.
Es importante que sepan que en las versiones de windows 10.2 se crea en mayúscula, el ejemplo seria PW<SID>.ORA
O sea NOMBRE y EXTENSION con mayuscula.
La nomenclatura del comando es la siguiente:
orapwd FILE=PWDsid.ora PASSWORD=password ENTRIES=max_users FORCE=y/n
*Nota para usuarios windows:
Podes ver la extension del archivo con:
TOOLS –> FOLDER OPTIONS –> VIEW –> y destildas HIDE FILE EXTENTIONS
Con eso podrán ver que la extensión del archivo sea la correcta, por ahí encuenntrán que el init sea : initPRO.ora y elpwfile debería ser PWPRO.ORA.
El orden de lectura entonces para un OS windows es:
ORA_SID_PWFILE ORA_PWFILE ORACLE_BASE\ORACLE_HOME\DATABASE\PWDsid.ORA
Oracle RDBMS 11gR1 para ambos ambientes
orapwd FILE=filename [ENTRIES=numusers] [FORCE={Y|N}] [IGNORECASE={Y|N}] [NOSYSDBA={Y|N}]
pwfile Unix : orapwsid
pwfile Windows : PWDsid.ora
Como borrar un pwfile
Si no precisamos de una autenticacion remota, entonces no precisamos pwfile, por ello hay que setear el parametro remote_login_passwordfile en NONE.
Adición de usuarios al pwfile
Los usuarios se agregan al pwfile cuando se otorgan los privilegios SYSDBA o SYSOPER.
En el caso de crear usuarios o ya tenerlos implementados, cuando le otorgamos el perfil de DBA o cambiamos su pass por policys, debemos recrear el pwfile.
Hola Juan estaba leyendo el pos y me surgio la siguente duda… como se autentica un usuario si no se esta usando un archivo orapwd y la instancia esta baja ?? Saludos
LikeLike
Marcos ,
Posiblemente no me haya expresado bien en el articulo, gracias por preguntar.
Cuando estamos trabajando remotamente es que precisamos validarlos con el passwfile.
Pero en el caso que lo hayas perdido , sera necesario loguearte en el server con un usuario con privilegios.
Puede ser oracle, pero también puede ser tu usuario de OS, que este en algún grupo de administración oracle permitido.
Una vez alli solo precisas ejecutar la sentencia sqlplus USUARIO@INSTANCIA o si tenes usuario validado por OS , sqlplus / y levantar.
Espero te sea de utilidad, y también te invito a suscribirte al blog donde te llegaran los nuevos artículos que publico.
Saludos !
LikeLike
Muchisimas gracias Juan, ahora si me quedo claro. Muy interesante el blog, ya mismo me suscribo.
Saludos.
LikeLike
Buenas Noches.
Soy un estudiante de ciclo formativo de grado superior en desarrollo de aplicaciones informáticas.
Utilizando la herramienta de Oracle Oracle Forms developer, he desarrollado una base de datos que inicio desde Forms.
La cuestión es que cuando compilo, supuéstamente estoy logueado en la base de datos con el nombre de usuario y contraseña (de lo contrario, no me dejaría compilar ya que las tablas y vistas pertenecen a la base de datos).
La historia de todo esto es que tengo que “simular” una especie de login en el que cuando introduzca un usuario y un password automáticamente se me habiliten los controles.
Mis compañeros lo que están haciendo es que ponen un usuario que se inventan y un password y comprueban sin acceder a la base de datos. Yo, por el contrario, he conseguido comprobar si existe el usuario en la base de datos. Cuando he intentado validar la contraseña, me he dado cuenta que esta está en hexadecimal. Hay alguna forma de validar mi contraseña a través de PL/SQL?
Gracias y Un saludo!
P.D. Siento haber posteado en otra zona que no era la correcta.
LikeLike
Buen Dia,
A ver si entiendo bien.
Vos queres hacer que se activen los controles cuando el usuario valido el ingreso , comprobando la contraseña o a partir de que pudo accesar ?
Si es la segunda te recomiendo la funcion que te paso a continuacion , con ella el usuario que logueo hara una pequeña operacion y retornara OK.
Con ese parametro vos podes tomarlo para activar el control.
CREATE OR REPLACE FUNCTION check_num (p_input IN VARCHAR2)
RETURN VARCHAR
IS
v_number NUMBER;
BEGIN
BEGIN
v_number := TO_NUMBER(p_input);
EXCEPTION
WHEN VALUE_ERROR THEN
RETURN(‘No numeric value’);
END;
—
RETURN (‘OK’);
—
END;
/
Si es la primer manera , tener que trabajar con validacion por CAS , active directory, OID (en el caso de oracle por medio de la infraestructura).
Espero te se de utilidad.
Juan Andrés.
LikeLike