Oracle
 sql >> Database >  >> RDS >> Oracle

L'esecuzione immediata non riesce anche con la concessione della tabella CREATE

Hai solo create view concesso direttamente al tuo utente. Gli altri privilegi di sistema che puoi vedere provengono da un ruolo e i ruoli sono disabilitati nelle procedure memorizzate dei diritti di definizione . Cerca in user_role_privs per vedere mentre i ruoli ti sono stati concessi e puoi vedere quali privilegi ti dà ciascun ruolo in role_sys_privs (con il nome del ruolo come beneficiario). Potrebbero esserci anche diversi livelli di ruoli.

Vedresti lo stesso errore se avessi set role none prima di provare a creare una tabella in modo statico. Demo con configurazione minima:

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;

Quindi come quell'utente:

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

E con la versione della tua procedura memorizzata:

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

Per poter creare la tabella dinamicamente da una stored procedure, il tuo DBA dovrà concedere create table direttamente al tuo utente:

grant create table to myuser;

Quindi riprovare la procedura:

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

Nota che user_sys_privs ora mostra che create table è stato concesso direttamente, cosa che prima non aveva, né nella domanda.

Tuttavia, è molto improbabile che tu voglia davvero creare oggetti dinamicamente, poiché lo schema dovrebbe essere ben definito e stabile:le modifiche di questo tipo dovrebbero essere controllate e far parte di un processo di rilascio. Ma come esercizio, hai bisogno della sovvenzione diretta.