wählen Sie nicht aus dba_tab_cols aus Stored Procedure (PL / SQL)
-
03-07-2019 - |
Frage
Ich versuche, aus der dba_tab_cols innerhalb einer gespeicherten Prozedur Ansicht auszuwählen. Es funktioniert nicht, und ich weiß nicht, warum.
Wenn ich die folgende SQL als eine Abfrage ausführen:
SELECT t.data_type FROM dba_tab_cols t
WHERE
t.table_name = 'ACCOUNTTYPE' AND
t.column_name = 'ACCESSEDBY';
es funktioniert gut. Allerdings, wenn ich es in eine gespeicherte Prozedur kopieren etwa so:
SELECT t.data_type INTO dataType FROM dba_tab_cols t
WHERE
t.table_name = 'ACCOUNTTYPE' AND
t.column_name = 'ACCESSEDBY';
Ich erhalte die Fehlermeldung „PL / SQL: ORA-00942: Tabelle oder Sicht nicht existiert“ und das Editor-Highlights dba_tab_cols während zu kompilieren versuchen. Der gleiche db Benutzer wird in beiden Fällen verwendet wird.
Datentyp deklariert als: datatype varchar2 (128);
PL / SQL (Oracle 9)
Jeder weiß um das Problem?
Lösung
Es ist sehr wahrscheinlich ein priviledges Problem. Ist die Erlaubnis dba_tab_columns
über eine Rolle für den Zugriff auf oder ist es ein direkter wählen Zuschuss für Ihre Benutzer? Priviledges über Rollen gewährt ist in sprocs nicht zur Verfügung.
Ein kurzer Blick auf Google schlägt vor, mit all_tab_cols
statt und sehen, ob die Tabelle, die die erforderlichen Informationen, die Sie benötigen.
Andere Tipps
Um zu Eoin Antwort hinzufügen:
Für die meisten Menschen, es kommt als ein Überraschung, dass der Benutzer nicht auswählen kann die Tabelle aus einer Prozedur, wenn er hat nicht die Auswahl erteilt direkt rechts (im Gegensatz zu durch die Rolle)
Wenn Tabellen Benutzer versuchen, dies zu kompilieren Verfahren, erhält er eine ORA-00942 obwohl diese Tabelle existiert sicherlich und er wurde das Recht eingeräumt, zu wählen dieser Tisch. Das Problem ist, dass Verfahren Rollen nicht respektieren; nur direkt gewährten Rechte respektiert werden. Also, das bedeutet, dass der Tabelleneigentümer muss regrant das Recht zu wählen:
Ich habe kein Orakel installiert, aber vielleicht datatype ist ein reserviertes Wort. Ich würde versuchen, etwas anderes.