sql >> Base de Datos >  >> RDS >> Oracle

La ejecución inmediata falla incluso con la concesión de tabla CREATE

Solo tienes create view otorgado directamente a su usuario. Los otros privilegios del sistema que puede ver provienen de un rol, y los roles están deshabilitados en los procedimientos almacenados de derechos del definidor . Busque en user_role_privs para ver los roles que se le han otorgado, y puede ver qué privilegios le otorga cada rol en role_sys_privs (con el nombre del rol como beneficiario). También podría haber varias capas de roles.

Vería el mismo error si hiciera set role none antes de intentar crear una tabla de forma estática. Demostración con configuración mínima:

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;

Entonces como ese usuario:

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

Y con su versión de procedimiento almacenado:

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

Para poder crear la tabla dinámicamente a partir de un procedimiento almacenado, su DBA deberá conceder create table directamente a su usuario:

grant create table to myuser;

Luego intente el procedimiento nuevamente:

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

Observe que user_sys_privs ahora muestra que create table se ha concedido directamente, lo que no ocurría antes, o en la pregunta.

Sin embargo, es muy poco probable que realmente desee crear objetos dinámicamente, ya que el esquema debe estar bien definido y ser estable:los cambios de este tipo deben controlarse y ser parte de un proceso de lanzamiento. Pero como ejercicio, necesitas la subvención directa.