Oracle
 sql >> Base de données >  >> RDS >> Oracle

L'exécution immédiate échoue même avec l'octroi de la table CREATE

Vous n'avez qu'à create view accordée directement à votre utilisateur. Les autres privilèges système que vous pouvez voir proviennent d'un rôle, et les rôles sont désactivés dans les procédures stockées des droits du définisseur . Regardez dans user_role_privs pour voir quels rôles vous ont été accordés, et vous pouvez voir quels privilèges chaque rôle vous donne dans role_sys_privs (avec le nom du rôle en tant que bénéficiaire). Il pourrait également y avoir plusieurs couches de rôles.

Vous verriez la même erreur si vous faisiez set role none avant d'essayer de créer une table de manière statique. Démo avec configuration minimale :

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;

Puis en tant qu'utilisateur :

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

Et avec votre version de procédure stockée :

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

Pour pouvoir créer la table dynamiquement à partir d'une procédure stockée, votre DBA devra accorder create table directement à votre utilisateur :

grant create table to myuser;

Recommencez ensuite la procédure :

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

Notez que user_sys_privs montre maintenant que create table a été accordé directement, ce qui n'était pas le cas auparavant, ni dans la question.

Cependant, il est très peu probable que vous vouliez vraiment créer des objets dynamiquement, car le schéma doit être bien défini et stable - les modifications de ce type doivent être contrôlées et faire partie d'un processus de publication. Mais comme exercice, vous avez besoin de la subvention directe.