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.