Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Execute Immediate schlägt selbst mit CREATE-Tabellenzuteilung fehl

Sie haben nur create view direkt Ihrem Benutzer gewährt. Die anderen Systemprivilegien, die Sie sehen können, stammen von einer Rolle, und Rollen sind in gespeicherten Prozeduren für Definiererrechte deaktiviert . Schauen Sie in user_role_privs nach um zu sehen, welche Rollen Ihnen gewährt wurden, und Sie können sehen, welche Privilegien Ihnen jede Rolle in role_sys_privs gibt (mit dem Rollennamen als Grantee). Es könnte auch mehrere Ebenen von Rollen geben.

Sie würden denselben Fehler sehen, wenn Sie set role none hätten bevor Sie versuchen, eine Tabelle statisch zu erstellen. Demo mit minimalem Setup:

create role myrole;
grant create session, create table, create procedure to myrole;
create user myuser identified by mypasswd;
grant myrole to myuser;
grant create view, unlimited tablespace to myuser;

Dann als dieser Benutzer:

SQL> connect myuser/mypasswd
Connected.
SQL> select * from user_sys_privs;

USERNAME                       PRIVILEGE                                ADM
------------------------------ ---------------------------------------- ---
MYUSER                         UNLIMITED TABLESPACE                     NO
MYUSER                         CREATE VIEW                              NO

2 rows selected.

SQL> select * from session_privs;

PRIVILEGE
----------------------------------------
CREATE SESSION
UNLIMITED TABLESPACE
CREATE TABLE
CREATE VIEW
CREATE PROCEDURE

5 rows selected.

SQL> Create table Dummy99_99 (Dummy_Field number);

Table created.

SQL> drop table Dummy99_99 purge;

Table dropped.

SQL> set role none;

Role set.

SQL> Create table Dummy99_99 (Dummy_Field number);
Create table Dummy99_99 (Dummy_Field number)
*
ERROR at line 1:
ORA-01031: insufficient privileges

Und mit Ihrer Stored-Procedure-Version:

SQL> connect myuser/mypasswd
Connected.
SQL> create or replace procedure sp_dummy
  2  as
  3  begin
  4    execute immediate 'Create table Dummy99_99 (Dummy_Field number)';
  5  end sp_dummy;
  6  /

Procedure created.

SQL> exec sp_dummy;
BEGIN sp_dummy; END;

*
ERROR at line 1:
ORA-01031: insufficient privileges
ORA-06512: at "MYUSER.SP_DUMMY", line 4
ORA-06512: at line 1

Um die Tabelle dynamisch aus einer gespeicherten Prozedur erstellen zu können, muss Ihr DBA create table erteilen direkt zu Ihrem Benutzer:

grant create table to myuser;

Dann versuchen Sie es erneut:

SQL> connect myuser/mypasswd
Connected.
SQL> select * from user_sys_privs;

USERNAME                       PRIVILEGE                                ADM
------------------------------ ---------------------------------------- ---
MYUSER                         UNLIMITED TABLESPACE                     NO
MYUSER                         CREATE TABLE                             NO
MYUSER                         CREATE VIEW                              NO

SQL> exec sp_dummy;

PL/SQL procedure successfully completed.

SQL> desc Dummy99_99
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 DUMMY_FIELD                                        NUMBER

Beachten Sie, dass user_sys_privs zeigt nun, dass create table direkt gewährt wurde, was vorher nicht der Fall war, oder in der Frage.

Es ist jedoch sehr unwahrscheinlich, dass Sie jemals wirklich Objekte dynamisch erstellen möchten, da das Schema gut definiert und stabil sein sollte – Änderungen dieser Art sollten kontrolliert und Teil eines Freigabeprozesses sein. Aber als Übung brauchen Sie den direkten Zuschuss.