Ich verwende Oracle 11.2.0.1.0 und versuche, das dbms_sql-Paket zum Laufen zu bringen. Aber ich bekomme immer wieder die ORA-29471 Fehler, wie unten dargestellt:Wie löst man ORA-29471 auf dbms_sql.open_cursor?
DECLARE
c INTEGER;
BEGIN
c := dbms_sql.open_cursor();
END;
ORA-29471: DBMS_SQL access denied
ORA-06512: at "SYS.DBMS_SQL", line 1017
ORA-06512: at line 4
Das Orakel docs folgendes sagen dazu:
Checks vorgenommen werden, wenn die Bindung und Ausführung. Optional können die Prüfungen für jeden einzelnen DBMS_SQL-Unterprogrammaufruf durchgeführt werden. Die Überprüfung lautet:
Der current_user ist das gleiche beim Aufrufen des Unterprogramms, als es beim Aufrufen des neuesten Pars war. Die aktivierten Rollen beim Aufrufen des Unterprogramms müssen eine Obermenge der aktivierten Rollen beim Aufrufen der neuesten Syntaxanalyse sein. In Übereinstimmung mit der Verwendung von Definer 's Rechte Unterprogrammen, Rollen nicht gelten. Wenn eine der beiden Prüfungen fehlschlägt, wird der ORA-29470-Fehler ausgegeben.
Soweit ich sagen kann, gelten beide Bedingungen nicht für meinen Code, da der Code Schemas nicht kreuzt.
Die Oracle support (erfordert Anmeldung) Website schlägt vor, dass ich explizit den Parameter security_level in dbms_sql.open_cursor hinzufügen. Das Hinzufügen eines der Werte (0/1/2) löst das Problem nicht.
Die verwirrende Sache für mich ist, dass ich den Fehler an der dbms_sql.open_cursor
erhalte, wo die Sicherheitsstufe zuerst definiert wird.
Die Support-Website schlägt auch eine Abhilfe, die Einstellung bedeutet:
alter system set "_dbms_sql_security_level" = 384 scope=spfile;
Ich habe das noch nicht ausprobiert. Ich ziehe es vor, es als letzten Ausweg zu betrachten, da es eine Sicherheitsschicht deaktiviert und es sich um eine nicht unterstützte Oracle-Funktion handelt. Kaum ideale Umstände für den Produktionseinsatz. Es löst das Problem auch nicht wirklich, sondern versteckt es.
Wie kann ich diesen Fehler beheben?
Verdammt. Ich wollte genau dasselbe sagen, aber du hast mich dafür geschlagen. +1 –
Ich hatte gerade den Fehler auf die gleiche Weise wie Sie reproduziert und war dabei, die SQL * Plus-Ausgabe in meine Antwort einzufügen, als ich Ihre Antwort sah. Wenn ich so verärgert wäre, hätte ich Ihren Posten nicht aufgewertet. :) –
Sie haben Recht. Durch das Einrichten einer neuen Sitzung wurde das Problem behoben. Ich kann nicht glauben, dass ich mehr als eine Stunde damit verbracht habe, das herauszufinden. Vielen Dank! –