Oracle
 sql >> база данни >  >> RDS >> Oracle

Незабавното изпълнение е неуспешно дори с разрешение за таблица CREATE

Имате само 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 е предоставено директно, което не е било преди, или във въпроса.

Въпреки това е много малко вероятно някога наистина да искате да създавате обекти динамично, тъй като схемата трябва да бъде добре дефинирана и стабилна - промените от този тип трябва да се контролират и да бъдат част от процес на освобождаване. Но като упражнение се нуждаете от директното предоставяне.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да изпълним процедура с процедурата DBMS_SCHEDULER.CREATE_JOB

  2. Преодоляване на ограничението за групови вмъквания през връзка към база данни

  3. oracle как да транспонира колони в редове без UNION

  4. Oracle SQL упълномощаване на привилегии върху множество атрибути и таблици с едно изявление

  5. Мога ли да деактивирам тригер вътре в тригер в oracle?