sql >> Database >  >> RDS >> Oracle

Execute Immediate mislukt zelfs met CREATE table grant

Je hebt alleen create view rechtstreeks toegekend aan uw gebruiker. De andere systeemprivileges die u kunt zien, zijn afkomstig van een rol, en rollen zijn uitgeschakeld in de opgeslagen procedures voor de rechten van de definitie . Kijk in user_role_privs om te zien while-rollen die je hebt gekregen, en je kunt zien welke privileges elke rol je geeft in role_sys_privs (met de rolnaam als de gerechtigde). Er kunnen ook meerdere lagen van rollen zijn.

U zou dezelfde fout zien als u set role none . deed voordat u probeert een tabel statisch te maken. Demo met minimale setup:

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;

Dan als die gebruiker:

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

En met uw opgeslagen procedureversie:

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

Om de tabel dynamisch te kunnen maken vanuit een opgeslagen procedure, moet uw DBA create table verlenen rechtstreeks naar uw gebruiker:

grant create table to myuser;

Probeer vervolgens de procedure opnieuw:

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

Merk op dat user_sys_privs laat nu zien dat create table rechtstreeks is toegekend, wat voorheen niet het geval was, of in de vraag.

Het is echter zeer onwaarschijnlijk dat u objecten dynamisch wilt maken, aangezien het schema goed gedefinieerd en stabiel moet zijn - wijzigingen van dit type moeten worden gecontroleerd en deel uitmaken van een releaseproces. Maar als oefening heb je de directe subsidie ​​nodig.



  1. voeg geselecteerde gegevens in als externe sleutel en SQLSTATE [23000]:schending van integriteitsbeperking:1048

  2. 2 voorbeelddatabases voor SQLite

  3. Laravel voert andere uitvoer uit dan MySQL-query

  4. Verwijzend naar sessievariabelen (\set var='value') uit PL/PGSQL