Имате само create view
предоставени директно на вашия потребител. Другите системни привилегии, които можете да видите, идват от роля, а ролите са деактивирани в съхранените процедури на definer's-rights
. Погледнете в user_role_privs
за да видите кога ролите са ви предоставени и можете да видите какви привилегии ви дава всяка роля в role_sys_privs
(с името на ролята като получател). Може да има и няколко нива на роли.
Ще видите същата грешка, ако сте set role none
преди да се опитате да създадете таблица статично. Демо с минимална настройка:
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;
След това като този потребител:
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
И с вашата версия на съхранена процедура:
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
За да можете да създадете таблицата динамично от съхранена процедура, вашият DBA ще трябва да разреши create table
директно на вашия потребител:
grant create table to myuser;
След това опитайте процедурата отново:
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
Забележете, че user_sys_privs
сега показва, че create table
е предоставено директно, което не е било преди, или във въпроса.
Въпреки това е много малко вероятно някога наистина да искате да създавате обекти динамично, тъй като схемата трябва да бъде добре дефинирана и стабилна - промените от този тип трябва да се контролират и да бъдат част от процес на освобождаване. Но като упражнение се нуждаете от директното предоставяне.