¿Alguien puede explicar el comportamiento diferente de la misma función bajo el usuario diferente en Oracle?
Pregunta
Tengo un paquete llamado A y A tiene función Dosomething ();
El usuario X es el propietario de A. User Y tiene un sinónimo de testsyn que apunta a Xa;
Iniciado sesión como x y la función ejecutada dosomething () devuelve verdadero pero cuando se registra como usuario y y ejecutó la función como testSyn.Dosomething (), devuelve falso para el mismo valor.
¿Alguien podría explicar por qué sucede esto?
Solución
Eche un vistazo a la definición del procedimiento. Si es algo como PROCEDURE a AUTHID CURRENT_USER
Luego se ejecutará con el permisos de usuario actuales y resolución de nombres. Si el procedimiento utiliza vistas que tienen en cuenta los privilegios de los usuarios (como user_objects
), eso podría explicar el resultado diferente.
Respuesta de comentarios: estás haciendo la distinción incorrecta. Imagine que escribe un procedimiento que devuelva el object_name
de la primera fila de user_objects
. Ese procedimiento es propiedad de schema_owner
y schema_invoker
tiene permiso para ejecutarlo. Si el procedimiento se define sin AUTHID CURRENT_USER
, devolverá un nombre de objeto para un objeto en el schema_owner
esquema. El mismo procedimiento con AUTHID CURRENT_USER
devolverá un nombre de objeto del schema_invoker
esquema en su lugar. Esto no tiene nada que ver con los privilegios de ejecución.
No sé si esta es la fuente de su problema, pero es un buen candidato y es fácil de verificar (solo mire la definición del procedimiento que se encuentra en la especificación del paquete).
Otros consejos
Puede ejecutar esa función, pero es posible que no tenga derechos de acceso a todos los objetos de las referencias de la función. Para empezar, intentaría averiguar a qué objetos de DB accede a su función e intentaré acceder a aquellos desde una herramienta como SQLPLUS para verificar