Execute Immediate scheitert selbst mit CREATE table gewähren
Ich habe ein problem wo ich bin erstellen einer Tabelle mithilfe der execute immediate-Befehl in der stored procedure. Jedoch bekomme ich die Fehlermeldung "Unzureichende Berechtigungen". Ich überprüfte die anderen threads und sorgte dafür, dass der Benutzer "TABELLE ERSTELLEN" Privileg erteilt. Allerdings habe ich noch sehen, wie sich die gleichen Fehler.
SQL> select * from USER_SYS_PRIVS;
USERNAME PRIVILEGE ADM
------------------------------ ---------------------------------------- ---
MYUSER CREATE VIEW NO
MYUSER UNLIMITED TABLESPACE NO
SQL> select * from session_privs;
PRIVILEGE
----------------------------------------
CREATE SESSION
UNLIMITED TABLESPACE
CREATE TABLE
CREATE CLUSTER
CREATE VIEW
CREATE SEQUENCE
CREATE PROCEDURE
CREATE TRIGGER
CREATE TYPE
CREATE OPERATOR
CREATE INDEXTYPE
11 rows selected.
Die Dummy-Prozedur, die ich erstellt ist :
create or replace procedure sp_dummy
as
begin
execute immediate 'Create table Dummy99_99 (Dummy_Field number)';
end sp_dummy;
/
Detaillierte Fehler :
ERROR at line 1:
ORA-01031: insufficient privileges
ORA-06512: at "MYUSER.SP_DUMMY", line 4
ORA-06512: at line 1
Gibt es etwas, was ich falsch mache ?
Beachten Sie, dass eine PL/SQL-Prozedur, verwenden Sie die definer ' s rights standardmäßig, d.h. es läuft mit den rechten des Benutzers, der kompiliert das Verfahren und nicht mit den rechten des Benutzers läuft/startet das Verfahren. Dies kann oder möglicherweise nicht relevant in Ihrem Fall.
Dieser Fehler ist nicht relevant für die "CREATE TABLE" Privileg wie CREATE TABLE Priv wird nur ausgeführt, auf Laufzeit. Dies ist im Zusammenhang mit der CREATE PROCEDURE-Berechtigung. Versuchen Sie GEWÄHREN ERSTELLEN PROCEDUTE ZU MYUSER; und erneut testen. Lassen Sie mich wissen, ob das hilft
der Fehler kommt von der Ausführung der Prozedur, nicht seine Schöpfung - obwohl das nicht eindeutig in der Frage. Der Fehler-stack mit PL/SQL Fehler aus dem code-block. Wenn die
yupps verpasst, dass trace :P. In diesem Fall sollte es gut laufen wie CREATE TABLE Priv vorhanden ist. Dies kann nur geschehen, wenn Sie versuchen, zu erstellen, die Tabelle in einem anderen schema. In diesem Fall ERSTELLEN Sie eine BELIEBIGE TABELLE priv muss, das zu tun.
aber es wird nicht versucht, erstellen Sie die Tabelle in einem anderen schema; es ist, weil die Berechtigungen erteilt, die über eine Rolle.
Dieser Fehler ist nicht relevant für die "CREATE TABLE" Privileg wie CREATE TABLE Priv wird nur ausgeführt, auf Laufzeit. Dies ist im Zusammenhang mit der CREATE PROCEDURE-Berechtigung. Versuchen Sie GEWÄHREN ERSTELLEN PROCEDUTE ZU MYUSER; und erneut testen. Lassen Sie mich wissen, ob das hilft
der Fehler kommt von der Ausführung der Prozedur, nicht seine Schöpfung - obwohl das nicht eindeutig in der Frage. Der Fehler-stack mit PL/SQL Fehler aus dem code-block. Wenn die
create procedure
priv fehlte (und es ist nicht, können Sie es in session_privs
) Sie würden nur das ORA-01031 aus der create procedure
ohne das ORA-06512 Spuren.yupps verpasst, dass trace :P. In diesem Fall sollte es gut laufen wie CREATE TABLE Priv vorhanden ist. Dies kann nur geschehen, wenn Sie versuchen, zu erstellen, die Tabelle in einem anderen schema. In diesem Fall ERSTELLEN Sie eine BELIEBIGE TABELLE priv muss, das zu tun.
aber es wird nicht versucht, erstellen Sie die Tabelle in einem anderen schema; es ist, weil die Berechtigungen erteilt, die über eine Rolle.
InformationsquelleAutor Sameervb | 2015-11-18
Du musst angemeldet sein, um einen Kommentar abzugeben.
Müssen Sie nur
create view
gewährt, die direkt auf Ihren Benutzer. Die anderen system-Privilegien, die Sie sehen können, kommen aus einer Rolle und Rollen werden deaktiviert definer-Rechte gespeicherter Prozeduren. Schauen Sie inuser_role_privs
zu sehen, während die Rollen, die Sie haben gewährt wurde, und Sie können sehen, welche Berechtigungen für jede Rolle gibt Sie inrole_sys_privs
(mit den Namen der Rolle ein, als der Empfänger). Es kann mehrere Schichten von Rollen zu.Würden Sie sehen, die gleichen Fehler, wenn Sie getan haben
set role none
bevor Sie versuchen, erstellen Sie eine Tabelle statisch. Demo mit minimalen set-up:Dann als dieser Benutzer an:
Und mit der gespeicherten Prozedur version:
Werden in der Lage, um die Tabelle zu erstellen, die dynamisch aus einer gespeicherten Prozedur mit dem DBA benötigen, zu gewähren
create table
direkt auf Ihre Benutzer:Dann versuchen Sie den Vorgang erneut:
Beachten Sie, dass
user_sys_privs
zeigt nun, dasscreate table
wurde direkt erteilt, die es vorher nicht, oder in Frage stellen.Allerdings ist es sehr unwahrscheinlich, dass Sie jemals wirklich wollen, um Objekte zu erstellen, die dynamisch, wie das schema sollte klar definiert und stabil - änderungen dieser Art sollten kontrolliert werden und Teil eines release-Prozesses. Aber als übung, müssen Sie die direkte Finanzhilfe.
InformationsquelleAutor Alex Poole
Wenn Sie verbunden sind, als
myuser
Benutzer sind, sollten Sie in der Lage sein, um die Prozedur zu erstellen, und führen Sie es um die Tabelle zu erstellen.Die einzigen Privilegien, die erforderlich sind, um die Tätigkeit sind:
Und führen Sie dann die Prozedur nach Anschluss an den Nutzer:
InformationsquelleAutor Lalit Kumar B
Bei der Verwendung von execute immediate, Verfahren muss explizit sagen, oracle, dass es ausgeführt werden muss mit den Privilegien eines bestimmten Benutzers.
AUTHID CURRENT_USER, verwenden Sie die Berechtigungen des Benutzers ausgeführt, das Verfahren.
AUTHID DEFINER, verwenden Sie die Berechtigungen des Besitzers der Prozedur.
Dies ist mit AUTHID option beim erstellen einer Prozedur.
Stand ich vor einem ähnlichen Problem und habe das Verständnis von:
Execute Immediate innerhalb einer gespeicherten Prozedur hält eine Unzureichende Privilegien Fehler
InformationsquelleAutor Vaibhav
Die notwendigen Konzessionen sind wie folgt:
GRANT CREATE TABLE "USER";
GRANT EXECUTE ANY PROCEDURE "USER" ;
InformationsquelleAutor Phillip Moura