Domanda

Ho creato un pacchetto che contiene una stored procedure che ho intenzione di richiamare da un'applicazione separata. La stored procedure restituirà un elenco ordinato di tutti i punti di vista e le tabelle nello schema. Per fare questo, esegue una semplice select sui sinonimi dba_tables e DBA_VIEWS, come illustrato di seguito:

CREATE OR REPLACE
PACKAGE BODY TITAN_ENTITY AS

  PROCEDURE GETSCHEMAOBJECTS (RESULTS IN OUT T_CURSOR)
  IS
    V_CURSOR T_CURSOR;
  BEGIN
    OPEN V_CURSOR FOR
       SELECT 'T' OBJECTTYPE, TABLE_NAME OBJECTNAME 
          FROM DBA_TABLES 
          WHERE OWNER = 'SONAR5'
       UNION ALL
       SELECT 'V' OBJECTTYPE, VIEW_NAME OBJECTNAME 
         FROM DBA_VIEWS 
         WHERE OWNER = 'SONAR5'
       ORDER BY OBJECTNAME;
    RESULTS := V_CURSOR;      

  END GETSCHEMAOBJECTS;

END TITAN_ENTITY;

Ho verificato che i sinonimi in questione esistono, e sono pubblici:

CREATE PUBLIC SYNONYM "DBA_TABLES" FOR "SYS"."DBA_TABLES"
CREATE PUBLIC SYNONYM "DBA_VIEWS" FOR "SYS"."DBA_VIEWS"

La mia comprensione è che, perché sono pubbliche, non ho bisogno di ulteriori autorizzazioni per arrivare a loro. Se questa comprensione non è corretta, vorrei che qualcuno mi disabuse del concetto e mi puntare a dati più precisi.

Ora qui è il mio problema: posso aprire un foglio di lavoro in Oracle SQL Developer e scegliere tra queste tabelle bene. Ottengo dati significativi più che bene (567 righe, come un dato di fatto). Ma quando provo ad eseguire la stored procedure, Oracle si lamenta con un errore di compilazione, come illustrato di seguito:

Error(9,8): PL/SQL: SQL Statement ignored
Error(10,16): PL/SQL: ORA-00942: table or view does not exist

Quando si fa doppio clic su questo secondo messaggio di errore, SQL Developer mi porta alla prima clausola FROM ( "FROM DBA_TABLES").

Quindi sono abbastanza perplesso. So SQL Server piuttosto bene, e io sono nuovo ad Oracle, quindi per favore abbiate pazienza con me. Se si potrebbe fornire qualche indizio, o indicarlo nel giusto senso, mi piacerebbe molto grato.

Grazie in anticipo!

È stato utile?

Soluzione

Usa ALL_TABLES e ALL_VIEWS invece di DBA_TABLES e DBA_VIEWS. ALL_ vista% dovrebbe essere accessibile a tutti gli utenti.

Altri suggerimenti

Se si seleziona da una tabella o una vista in un / SQL-PL procedure memorizzate o un / SQL-funzione PL memorizzato hai bisogno di una sovvenzione diretta. Una sovvenzione tramite un ruolo del database non è sufficiente.

Probabilmente bisogno di una sovvenzione diretta in vista dba_tables. sinonimi (pubblici) sono solo sinonimi (pubblici). È necessario direttamente concesso selezionare diritti.

Vedi qui: http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:48704116042682#48798240264807

Modifica Mi dispiace, ho sorvolato la parte in cui ti sembra di dire che è possibile selezionare da DBA_TABLES direttamente. Molto probabilmente il problema è che i privilegi sono concessi attraverso un ruolo come qualcun altro ha risposto. Ma è ancora la pena di spiegare che la comprensione dei sinonimi pubblico è incompleta, e che l'utilizzo di ALL_TABLES sarebbe meglio se si compie quello che ti serve.

L'essere PUBBLICO sinonimo significa soltanto che tutti gli utenti possono fare riferimento il sinonimo; non concede loro alcun accesso all'oggetto che il sinonimo fa riferimento a.

Cosa si dovrebbe fare per la maggior parte direttamente risolvere questo errore è concessione privilegio SELECT sul punto di vista SYS per l'utente (s) che verrà eseguito questa procedura. Tuttavia, penso che sia un pessima idea.

Come suggerito da Raimonds, considerare se è possibile ottenere quello che ti serve da USER_TABLES o ALL_TABLES invece. Che utente sta chiamando questa procedura, e che l'accesso non che l'utente deve tabelle di SONAR5?

In generale, se l'applicazione è interessato a un tavolo, probabilmente ha alcuni privilegi su di esso, nel qual caso si dovrebbe essere elencato nella ALL_TABLES.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top