Impossibile selezionare da dba_tab_cols dalla procedura memorizzata (PL / SQL)
-
03-07-2019 - |
Domanda
Sto provando a SELEZIONARE dalla vista dba_tab_cols da una procedura memorizzata. Non funziona e non so perché.
Se eseguo il seguente SQL come query:
SELECT t.data_type FROM dba_tab_cols t
WHERE
t.table_name = 'ACCOUNTTYPE' AND
t.column_name = 'ACCESSEDBY';
funziona benissimo. Tuttavia, se lo copio in una stored procedure in questo modo:
SELECT t.data_type INTO dataType FROM dba_tab_cols t
WHERE
t.table_name = 'ACCOUNTTYPE' AND
t.column_name = 'ACCESSEDBY';
Ricevo il messaggio di errore " PL / SQL: ORA-00942: la tabella o la vista non esiste " e l'editor evidenzia dba_tab_cols mentre tenta di compilare. Lo stesso utente db viene utilizzato in entrambi i casi.
dataType è dichiarato come: dataType varchar2 (128);
PL / SQL (Oracle 9)
Qualcuno conosce il problema?
Soluzione
Molto probabilmente è un problema di privilegi. L'autorizzazione ad accedere a dba_tab_columns
tramite un ruolo o è una concessione a selezione diretta per il tuo utente? I privilegi concessi tramite ruoli non sono disponibili in SPROCS.
Una rapida occhiata a google suggerisce di usare all_tab_cols
e vedere se quella tabella ha le informazioni richieste di cui hai bisogno.
Altri suggerimenti
Per aggiungere alla risposta di Eoin:
Per la maggior parte delle persone, si presenta come a sorpresa che l'utente non possa selezionare la tabella dall'interno di una procedura se non gli è stato concesso il selezionare direttamente (al contrario di attraverso il ruolo)
Se l'utente della tabella tenta di compilare questo procedura, ottiene un ORA-00942 sebbene questa tabella certamente esista e gli è stato concesso il diritto di selezionare questo tavolo. Il problema è che le procedure non rispettano i ruoli; solo i diritti concessi direttamente sono rispettati. Quindi, ciò significa che il proprietario della tabella deve pentire il diritto di selezionare:
Non ho installato Oracle, ma forse dataType è una parola riservata. Proverei qualcos'altro.