sql >> Databáze >  >> RDS >> Oracle

Okamžité provedení se nezdaří ani s přidělením tabulky CREATE

Máte pouze create view uděleno přímo vašemu uživateli. Ostatní systémová oprávnění, která můžete vidět, pocházejí z role a role jsou zakázány v uložených procedurách s právy definice . Podívejte se do user_role_privs abyste viděli, jaké role vám byly uděleny, a v role_sys_privs můžete vidět, jaká oprávnění vám jednotlivé role poskytují (s názvem role jako příjemce grantu). Může existovat několik vrstev rolí.

Stejná chyba by se zobrazila, pokud byste set role none než se pokusíte vytvořit tabulku staticky. Demo s minimálním nastavením:

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;

Potom jako tento uživatel:

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

A s vaší verzí uložené procedury:

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

Aby bylo možné vytvořit tabulku dynamicky z uložené procedury, váš správce dat bude muset udělit create table přímo vašemu uživateli:

grant create table to myuser;

Potom zkuste postup znovu:

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

Všimněte si, že user_sys_privs nyní ukazuje, že create table byla udělena přímo, což dříve neudělovala, ani v otázce.

Je však velmi nepravděpodobné, že byste někdy skutečně chtěli vytvářet objekty dynamicky, protože schéma by mělo být dobře definované a stabilní – změny tohoto typu by měly být kontrolovány a měly by být součástí procesu vydání. Ale jako cvičení potřebujete přímý grant.



  1. Pomozte mi s mým dotazem SQL (Potřebuji, aby vždy vrátil alespoň jeden řádek.)

  2. Ruby On Rails je pomalý...?

  3. Pokouším se nainstalovat innodb memcached plugin MySQL5.6.17 na ubuntu 14.04

  4. Existuje ekvivalent k PHP `date_default_timezone_set()`, který funguje v MySQL?