3 Replies Latest reply on Nov 5, 2018 7:20 PM by Byron Fonseca

    Leer una tabla desde un stored procedure, cuyo owner tiene permisos hacia dicha tabla desde un rol

    3664508

      Hola estimados , estoy creando un stored procedure , el cual consulta una tabla que se encuentra dentro del rol que tengo asignado , cuando consulto dicha tabla fuera del stored procedure , la puedo ver , sin embargo si intento crear el stored procedure , me sale el mensaje "TABLA NO EXISTE".

      Por favor me pueden ayudar qué permisos faltan? porque no puedo ver mi tabla desde el procedure y sì desde fuera.

       

      Muchas gracias!!

        • 1. Re: Leer una tabla desde un stored procedure, cuyo owner tiene permisos hacia dicha tabla desde un rol
          L. Fernigrini

          Los permisos otorgados a través de un rol no son válidos dentro de unidades de PL/SQL almacenadas en la base datos (procedimientos, funciones, paquetes).

           

          Esto se debe a que estos programas son almacenados ya compilados en la base de datos, y es difícil mantener un control de los mismos. Por ejemplo, el permiso X es otorgado al rol A, el rol A es otorgado al rol B, el rol B es otorgado al rol C, el rol C es otorgado al rol D, el rol D es otorgado al usuario U1, el cual lo usa en el procedimiento PR1. Si el permiso X es revocado del rol A, Oracle debería recorrer todo ese árbol y encontrar todos los programas (procedimientos o funciones, ya sea individuales o dentro de paquetes) de todos los usuarios que tenían otorgados el rol A, el rol B, el rol C o el rol D y a la vez no tuvieran otorgados el permiso por otro "lado" (ya sea directamente o mediante el rol J o K) e invalidar dichos procedimientos o funciones.

           

          Por ello, para utilizar un permiso dentro de código almacenado (procedimientos y funciones) el mismo debe ser otorgado directamente al usuario.

           

          Otra alternativa es crear el procedimiento con AUTHID CURRENT_USER, con lo cual los permisos no se controlan en tiempo de compilación sino que se hace cada vez que se ejecuta el mismo. Esto es algo bastante mas costoso (si el usuario U1 ejecuta el procedimientos 1000 veces, Oracle va a validar las 1000 veces que tenga el permiso requerido, recorriendo todos los roles que tenga U1, en el ejemplo anterior U1->D->C->B->A)

           

          Mas detalles sobre AUTHID:

          https://orlandoolguin.wordpress.com/2010/05/13/authid-en-programas-almacenados/

          1 person found this helpful
          • 3. Re: Leer una tabla desde un stored procedure, cuyo owner tiene permisos hacia dicha tabla desde un rol
            Byron Fonseca

            En la documentación se puede leer que los roles se deshabilitan en procedimientos almacenados que fueron creados con privilegios de propietario (que es método por default) en contraposición de los que son creados con privilegios de ejecutor donde sí funcionan.:

             

            https://docs.oracle.com/cd/E11882_01/network.112/e36292/authorization.htm#DBSEG125

            Roles Used in Named Blocks with Definer's Rights

            All roles are disabled in any named PL/SQL block (stored procedure, function, or trigger) that executes with definer's rights. Roles are not used for privilege checking and you cannot set roles within a definer's rights procedure.

            Roles Used in Named Blocks with Invoker's Rights and Anonymous PL/SQL Blocks

            Named PL/SQL blocks that execute with invoker's rights and anonymous PL/SQL blocks are executed based on privileges granted through enabled roles. Current roles are used for privilege checking within an invoker's rights PL/SQL block. You can use dynamic SQL to set a role in the session.