sql >> Databasteknik >  >> RDS >> Oracle

Execute Immediate misslyckas även med CREATE-tabellbeviljande

Du har bara create view beviljas direkt till din användare. De andra systembehörigheterna du kan se kommer från en roll, och roller är inaktiverade i definierarens rättigheter lagrade procedurer . Titta i user_role_privs för att se medan roller du har beviljats, och du kan se vilka privilegier varje roll ger dig i role_sys_privs (med rollnamnet som bidragstagare). Det kan också finnas flera lager av roller.

Du skulle se samma fel om du set role none innan du försöker skapa en tabell statiskt. Demo med minimal installation:

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;

Sedan som den användaren:

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

Och med din lagrade procedurversion:

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

För att kunna skapa tabellen dynamiskt från en lagrad procedur måste din DBA ge create table direkt till din användare:

grant create table to myuser;

Försök sedan 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

Lägg märke till att user_sys_privs visar nu att create table har beviljats ​​direkt, vilket det inte gjorde tidigare, eller i frågan.

Det är dock mycket osannolikt att du någonsin verkligen skulle vilja skapa objekt dynamiskt, eftersom schemat bör vara väldefinierat och stabilt - förändringar av denna typ bör kontrolleras och vara en del av en releaseprocess. Men som övning behöver du det direkta bidraget.



  1. MYSQL skiljer mellan två kolumner även när den växlas

  2. Vad händer om MySQL-databasen inte stängdes?

  3. Applikationsanvändare kontra Row Level Security

  4. få tre poster i fallande ordning för varje kategori med hjälp av kodantändare