Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Thực thi ngay không thành công ngay cả khi cấp bảng CREATE

Bạn chỉ có create view được cấp trực tiếp cho người dùng của bạn. Các đặc quyền hệ thống khác mà bạn có thể thấy đến từ một vai trò và vai trò bị vô hiệu hóa trong các thủ tục được lưu trữ quyền của người xác định . Tìm trong user_role_privs để xem trong khi các vai trò bạn đã được cấp và bạn có thể xem mỗi vai trò mang lại cho bạn những đặc quyền nào trong role_sys_privs (với vai trò là người được cấp). Cũng có thể có nhiều lớp vai trò.

Bạn sẽ gặp lỗi tương tự nếu bạn set role none trước khi cố gắng tạo một bảng tĩnh. Demo với thiết lập tối thiểu:

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;

Sau đó với tư cách là người dùng:

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

Và với phiên bản thủ tục được lưu trữ của bạn:

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

Để có thể tạo bảng động từ một thủ tục được lưu trữ, DBA của bạn sẽ cần cấp create table trực tiếp cho người dùng của bạn:

grant create table to myuser;

Sau đó thử lại quy trình:

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

Lưu ý rằng user_sys_privs bây giờ cho thấy rằng create table đã được cấp trực tiếp, điều mà nó chưa từng có trước đây hoặc trong câu hỏi.

Tuy nhiên, rất ít khả năng bạn thực sự muốn tạo các đối tượng động, vì lược đồ phải được xác định rõ ràng và ổn định - các thay đổi kiểu này nên được kiểm soát và là một phần của quá trình phát hành. Nhưng như một bài tập, bạn cần được tài trợ trực tiếp.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tại sao OCI8 / Oracle oci_bind_array_by_name của PHP không hoạt động với tôi?

  2. Erlang và mức tiêu thụ bộ nhớ Heap của nó

  3. Chuyển đổi tham gia Oracle thành tham gia Ansi

  4. 2 chức năng để có được năm từ một ngày trong Oracle

  5. Có phải nhà cung cấp OraOLEDB trong .NET không đáng tin cậy trên các trường CLOB?