Accesso alla tabella di un altro utente all'interno di una procedura di stored Oracle
-
10-10-2019 - |
Domanda
Sto scrivendo una stored procedure per copiare i dati dalla tabella di un utente ad un altro schema. In sostanza, si tratta di una serie di INSERT .. istruzioni SELECT come questa:
INSERT INTO GESCHAEFTE
SELECT *
FROM TURAT03.GESCHAEFTE
WHERE kong_nr = 1234;
Questo funziona bene quando redigere da sqlplus (o rospo per me ;-)) quindi so che ho privilegi sufficienti, ma quando questo è parte della stored procedure in questo modo:
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;
ottengo un errore Oracle:
[Error] ORA-00942 (11: 22): PL/SQL: ORA-00942: table or view does not exist
Come potete vedere, ho già inserito un AUTHID
, ma senza alcun risultato.
Che altro posso fare? Sono più o meno alla fine delle mie idee qui.
Soluzione
Il proprietario di una procedura deve essere concesso il privilegio di accedere agli oggetti sottostanti direttamente, non attraverso un ruolo . Per avere lo stesso livello di accesso, come le procedure di, utilizzare i seguenti comandi:
SET ROLE NONE;
Per accedere a un altro tavolo da una procedura, è necessario essere concesso di selezionare direttamente, non attraverso un ruolo:
GRANT SELECT ON TURAT03.GESCHAEFTE TO <your_user>;
Questo articolo di Tom Kyte contiene informazioni aggiuntive.