2010-12-09 34 views
13

J'écris une procédure stockée pour copier des données de la table d'un utilisateur vers un autre schéma. Au fond, il est une série d'instructions SELECT .. INSERT telles que celle-ci:Accès à la table d'un autre utilisateur dans une procédure stockée Oracle

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

Cela fonctionne très bien quand issueing de sqlplus (ou TOAD pour moi ;-)) donc je sais que j'ai des privilèges suffisants, mais quand cela fait partie de la procédure stockée comme ceci:

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; 

Je reçois une erreur Oracle:

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

comme vous pouvez le voir, je l'ai déjà inséré un AUTHID, mais en vain.

Que puis-je faire d'autre? Je suis à peu près à la fin de mes idées ici.

Répondre

26

Le propriétaire d'une procédure doit avoir le privilège d'accéder directement aux objets sous-jacents, not through a role. Pour avoir le même niveau d'accès que vos procédures, utilisez les commandes suivantes:

SET ROLE NONE; 

Pour accéder à une autre table à partir d'une procédure, vous devez être accordée SELECT directement, et non par un rôle:

GRANT SELECT ON TURAT03.GESCHAEFTE TO <your_user>; 

This article by Tom Kyte contient des informations supplémentaires.

+0

Merci Vincent, réponse rapide! J'ai été en mesure d'accorder directement le select à mon utilisateur et cela fonctionne maintenant. – Thorsten

+0

C'est un comportement très étrange, quelqu'un at-il une référence quant à pourquoi c'est comme ça. – Reimius

+1

@reimius: Nous ne pouvons que deviner le "pourquoi" car la documentation ne mentionne généralement pas la raison d'une implémentation particulière. Peut-être qu'Oracle choisira de ne pas maintenir un lien de dépendance entre les procédures et les rôles, car cela pourrait entraîner une décompilation massive affectant de nombreux schémas lorsqu'un rôle est modifié. –