ORA-00904 - Problema con Function

Yo tengo una Function de la siguiente manera en el Usuario System de Oracle...
CREATE OR REPLACE FUNCTION digest (
p_username IN VARCHAR2,
p_password IN VARCHAR2 )
RETURN VARCHAR2
IS
BEGIN
RETURN LTRIM (TO_CHAR (DBMS_UTILITY.get_hash_value ( UPPER (p_username)
|| '/'
|| UPPER (p_password),
80000000,
POWER (2, 30)
),
RPAD ('X', 29, 'X') || 'X'
)
);
END digest;
/
y esta se ejecuta muy bien de la siguiente manera
Select digest('BRAULIO','CLAVE') From dual
Mi problema radica que deseo llamar esta misma función desde otro usuario de Oracle... Pero me devuelve el mensaje ORA-00904
y solo cuando le agrego el propietario de la siguiente manera
Select system.digest('BRAULIO','CLAVE') From dual
Me resuelve...
Ya le agregue y proporcione los permisos al usuario y no consigo hacer que se resuelva el problema...

2 Respuestas

Respuesta
1
Tal y como indicas, el problema no es de la función, sino de la concesión de sinomimos.
Para empezar, un comentario : NUNCA crees ni utilices para propósitos de la aplicación a los usuarios SYS ni SYSTEM (su cometido es interno para Oracle), mejor que te crees un usuario donde guardes todos estos objetos y dejes tranquilo a los usuarios internos de Oracle.
Independientemente de esto, la solución está muy clara, tal y como indicas ...
Les has dado permisos al usuario que te da el error, y lo solventa usando el nombre del propietario delante y va bien ...
Lo que te falta es crear el sinomino de esta función :
CREATE PUBLIC SYNONYM digest TO PUBLIC;
-- De esta forma todos lo verían pero sólo lo podrían ejecutar aquellos que tuviesen privilegios de EXECUTE.
Si no quieres que ni siquiera lo vean los otros usuarios de tu instancia de BB. DD. Entonces haz :
CREATE SYNONYM digest TO ;
En ambos casos hazlo desde el usuario propietario de la función (estando conectado a él).
Ya me contarás ... Un Saludo desde España
Ramón
NOTA : Ah! Y espero que los propietarios que la van a utilizar tengan privilegios sobre el 'PACKAGE' DBMS_UTILITY, que en principio tendría que ser así.
Efectivamente al crear la función con el usuario propietario, al ejecutar me arroja error sobre DBMS_UTILITY.get_hash_value que es lo que debo hacer para otorgar los privilegios al usuario... gracias..
Pues exactamente lo mismo que hiciste con tu función.
Pero en este caso es propiedad de 'SYS' el Package 'DBMS_UTILITY'.
Piensa también que es una conjunto de funciones que puede que no te interese dar privilegio a todos los usuarios ... (Pero, bueno, eso lo dejo a tu criterio).
Acciones :
GRANT EXECUTE DBMS_UTILITY TO ;
Aunque creo que los sinonimos ya estarán creados por si acaso ...
CREATE PUBLIC SYNONYM DBMS_UTILITY TO FOR SYS.DBMS_UTILITY;
O lo mismo sin el 'public' para el usuario propietario (exclusivamente) :
Create synonym
.DBMS_UTILITY FOR SYS.DBMS_UTILITY;
Ya me contarás ...
Excelente... asigne los permisos correspondientes al Usuario y tal como dice tu recomendación solo a este usuario y también removí la función del usuario System y lo volví a crear y compilar en el usuario propietario de este objeto.
Muchas gracias de verdad por la ayuda y la lección de buena practica.
Un Abrazo
Carlos
Respuesta
1
Ante todo decirte que no es buena idea crear cualquier objeto de usuario en el esquema SYSTEM por múltiples razones, por ejemplo, las posibles migraciones de la BBDD puede que no te funcionen al encontrarse un objeto que no se espera dentro de ese usuario.
En cuanto al problema, ¿has creado el sinónimo publico para que puedas llamar a la función si prefijar el propietario del objeto?
CREATE PUBLIC SYNONYM DIGEST FOR SYSTEM.DIGEST;
Con esto la BBDD ya sabe que cuando pones DIGEST te refieres a SYSTEM. DIGEST.
Pruébalo, si no es esto no dudes en hacérmelo saber y probamos con otra solución.
Excelente.. por fin pude ponerle fin a este asunto... con respecto a no crear los objetos en System, aunque es una base de datos de prueba como podría hacer para crearlo en el Usuario correspondiente... ya que antes lo había hecho y me resolvía error en DBMS_UTILITY.get_hash_value... gracias nuevamente si tuvieras un correo donde pudiera contactarte seria genial el mio es [email protected]

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas