Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Jalankan Segera gagal bahkan dengan hibah tabel CREATE

Anda hanya memiliki create view diberikan langsung kepada pengguna Anda. Hak istimewa sistem lain yang dapat Anda lihat berasal dari peran, dan peran dinonaktifkan di prosedur tersimpan hak-definer . Lihat di user_role_privs untuk melihat peran yang telah diberikan kepada Anda, dan Anda dapat melihat hak istimewa yang diberikan setiap peran kepada Anda di role_sys_privs (dengan nama peran sebagai penerima hibah). Mungkin ada beberapa lapisan peran juga.

Anda akan melihat kesalahan yang sama jika Anda melakukan set role none sebelum mencoba membuat tabel secara statis. Demo dengan pengaturan minimal:

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;

Kemudian sebagai pengguna itu:

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

Dan dengan versi prosedur tersimpan Anda:

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

Untuk dapat membuat tabel secara dinamis dari prosedur tersimpan, DBA Anda perlu memberikan create table langsung ke pengguna Anda:

grant create table to myuser;

Kemudian coba lagi prosedurnya:

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

Perhatikan bahwa user_sys_privs sekarang menunjukkan bahwa create table telah diberikan secara langsung, yang sebelumnya tidak, atau dalam pertanyaan.

Namun, sangat tidak mungkin Anda benar-benar ingin membuat objek secara dinamis, karena skema harus didefinisikan dengan baik dan stabil - perubahan jenis ini harus dikontrol dan menjadi bagian dari proses rilis. Tetapi sebagai latihan, Anda memerlukan hibah langsung.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Ganti bagian bidang dengan nilai dari kueri

  2. Prosedur tersimpan Oracle dengan parameter untuk klausa IN

  3. Mengekstrak baris dari DB termasuk baris dependen

  4. Tampilan logis dari model data di R12.2

  5. Kesalahan dalam menjalankan pemanggilan ODCIEXTTABLEOPEN