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.