2010-12-09 10 views
13

Estoy escribiendo un procedimiento almacenado para copiar datos de la tabla de un usuario a otro esquema. Básicamente, se trata de una serie de INSERT .. instrucciones SELECT como esto:Accediendo a la tabla de otro usuario dentro de un Procedimiento almacenado de Oracle

INSERT INTO GESCHAEFTE 
    SELECT * 
    FROM TURAT03.GESCHAEFTE 
    WHERE kong_nr = 1234; 

Esto funciona bien cuando issueing de sqlplus (o SAPO para mí ;-)), así que sé que tengo suficientes privilegios, pero cuando esto es parte del procedimiento almacenado de esta manera:

CREATE OR REPLACE FUNCTION COPY_KONG 
    (pKongNr IN NUMBER) 
    RETURN NUMBER 
    AUTHID CURRENT_USER 
IS 
BEGIN 
    INSERT INTO GESCHAEFTE 
     SELECT * 
     FROM TURAT03.GESCHAEFTE 
     WHERE kong_nr = pKongNr; 
END; 

consigo un error de Oracle:

[Error] ORA-00942 (11: 22): PL/SQL: ORA-00942: table or view does not exist 

como se puede ver, ya he insertado un AUTHID, pero fue en vano.

¿Qué más puedo hacer? Estoy casi al final de mis ideas aquí.

Respuesta

26

El propietario de un procedimiento debe tener privilegios para acceder directamente a los objetos subyacentes, not through a role. Para tener el mismo nivel de acceso como sus procedimientos, utilice los siguientes comandos:

SET ROLE NONE; 

para acceder a otra tabla a partir de un procedimiento, es necesario que se le conceda seleccionar directamente, no a través de un papel:

GRANT SELECT ON TURAT03.GESCHAEFTE TO <your_user>; 

This article by Tom Kyte contiene información adicional.

+0

Gracias Vincent, respuesta rápida! Pude otorgarle directamente la selección a mi usuario y funciona ahora. – Thorsten

+0

Este es un comportamiento muy extraño, ¿alguien tiene una referencia de por qué esto es así. – Reimius

+1

@reimius: Solo podemos adivinar el "por qué" ya que la documentación generalmente no menciona un motivo para una implementación en particular. Tal vez Oracle elija no mantener un vínculo de dependencia entre los procedimientos y los roles, ya que podría provocar una descompilación masiva que afecte a muchos esquemas cuando se modifique un rol. –

Cuestiones relacionadas