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

Execute Immediate mislykkes selv med CREATE-tabellbevilling

Du har kun create view givet direkte til din bruger. De andre systemprivilegier, du kan se, kommer fra en rolle, og roller er deaktiveret i lagrede procedurer for definererens rettigheder . Se i user_role_privs for at se, mens roller du har fået tildelt, og du kan se hvilke privilegier hver rolle giver dig i role_sys_privs (med rollenavnet som bevillingsmodtager). Der kan også være flere lag af roller.

Du ville se den samme fejl, hvis du set role none før du forsøger at oprette en tabel statisk. Demo med minimal opsætning:

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;

Så som den bruger:

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

Og med versionen af ​​din lagrede procedure:

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

For at kunne oprette tabellen dynamisk fra en lagret procedure, skal din DBA give create table direkte til din bruger:

grant create table to myuser;

Prøv derefter proceduren igen:

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

Bemærk, at user_sys_privs viser nu at create table er blevet bevilget direkte, hvilket det ikke gjorde før, eller i spørgsmålet.

Det er dog meget usandsynligt, at du nogensinde virkelig ønsker at skabe objekter dynamisk, da skemaet skal være veldefineret og stabilt - ændringer af denne type bør kontrolleres og være en del af en frigivelsesproces. Men som øvelse har du brug for det direkte tilskud.



  1. Konvertering af streng med forkortet tidszone til tidsstempel

  2. Mysql:Gem matrix af data i en enkelt kolonne

  3. Fatal fejl:Ufanget fejl:Kald til udefineret funktion sql_regcase

  4. MYSQL Venstre forbinder A.table og b.table, mens du beholder et.table-id