2010-12-09 5 views
13

Ich schreibe eine gespeicherte Prozedur, um Daten aus der Tabelle eines Benutzers in ein anderes Schema zu kopieren. Im Grunde ist es eine Reihe von INSERT .. SELECT-Anweisungen wie folgt aus:Zugriff auf die Tabelle eines anderen Benutzers in einer gespeicherten Oracle-Prozedur

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

Dies funktioniert gut, wenn sie von sqlplus (oder TOAD für mich ;-)) Verlegerung damit ich weiß, dass ich über ausreichende Berechtigungen haben, aber wenn dies ist ein Teil der gespeicherten Prozedur wie folgt aus:

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; 

ich einen Oracle-Fehler:

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

wie Sie sehen können, habe ich bereits eingefügt ein AUTHID, aber ohne Erfolg.

Was kann ich noch tun? Ich bin hier ziemlich am Ende meiner Ideen.

Antwort

26

Der Besitzer einer Prozedur muss die Berechtigung zum direkten Zugriff auf die zugrunde liegenden Objekte erhalten, not through a role. Um die gleichen Zugriffsrechte wie Ihre Verfahren haben, verwenden Sie die folgenden Befehle:

SET ROLE NONE; 

Um eine andere Tabelle aus einer Prozedur zuzugreifen, müssen Sie direkt SELECT gewährt werden, nicht durch eine Rolle:

GRANT SELECT ON TURAT03.GESCHAEFTE TO <your_user>; 

This article by Tom Kyte enthält zusätzliche Informationen.

+0

Dank Vincent, schnelle Antwort! Ich war in der Lage, die Auswahl direkt meinem Benutzer zu gewähren, und es funktioniert jetzt. – Thorsten

+0

Das ist sehr seltsames Verhalten, hat jemand einen Hinweis, warum das so ist. – Reimius

+1

@reimius: Wir können das "Warum" nur erraten, da die Dokumentation in der Regel keinen Grund für eine bestimmte Implementierung enthält. Möglicherweise hat Oracle entschieden, keine Abhängigkeitsbeziehung zwischen Prozeduren und Rollen aufrechtzuerhalten, da dies zu einer massiven Dekompilierung führen könnte, die sich auf viele Schemas auswirkt, wenn eine Rolle geändert wird. –

Verwandte Themen