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

Thực thi DDL động trong thủ tục PL / SQL thông qua quyền vai trò xác định

Bạn chỉ có thể đặt một vai trò trong một thủ tục / chức năng được lưu trữ PL / SQL nếu nó có Quyền của Người tham gia (AUTHID CURRENT_USER ) (xem tài liệu) . Điều đó có nghĩa là bạn không thể sử dụng ops_user để gọi thủ tục admin_user và sau đó truy cập các vai trò của admin_user. Nếu các DBA của bạn khăng khăng muốn sử dụng một vai trò để điều khiển CREATE TABLE đặc ân, đây là cách tiếp cận mà tôi đã thấy trước đây:

create or replace package admin_user.role_test authid current_user is
    procedure test_permissions;
end role_test;
/
create or replace package body admin_user.role_test is
    procedure test_permissions is
        v_query_string VARCHAR2(400 CHAR) := 'begin 
dbms_output.put_line(''after'');
for r in (select role from session_roles) loop 
    dbms_output.put_line(r.role); 
end loop;
end;';
    begin
        dbms_output.put_line('before');
        for r in (select role from session_roles) loop
            dbms_output.put_line(r.role);
        end loop;
        DBMS_SESSION.SET_ROLE('CREATE_TABLE_ROLE IDENTIFIED BY "SECRET_PASSWORD"');
        execute immediate v_query_string;
        DBMS_SESSION.SET_ROLE('ALL EXCEPT CREATE_TABLE_ROLE'); -- restore defaults
    end;
end role_test;
/
grant execute on admin_user.role_test to ops_user;

Điều này sẽ tạm thời cấp vai trò cho ops_user chỉ để thực thi mã của bạn. Theo mặc định, ops_user sẽ không thể xem nguồn nội dung gói admin_user. Bạn có thể bọc phần thân gói để bảo vệ mật khẩu hơn nữa. Nhưng bảo mật bằng mật khẩu sang một bên, mối quan tâm lớn nhất của tôi với cách tiếp cận này là Oracle không cung cấp một cách hay để vô hiệu hóa một vai trò duy nhất, vì vậy nếu ops_user có các vai trò được bảo vệ bằng mật khẩu khác, mã này có thể tăng ORA-01979 khi nó cố gắng khôi phục họ.

Vì vậy, có một câu trả lời, nhưng tôi vẫn khuyên bạn nên làm theo những gì những người nhận xét khác đã đề xuất và cấp TẠO BẢNG cho người dùng quản trị của bạn.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Nhận số lượng / tổng số ở mỗi cấp của truy vấn phân cấp bằng CONNECT BY

  2. Có cách nào để truy cập các thủ tục plsql riêng tư cho mục đích thử nghiệm không?

  3. Windows không thể tìm thấy 'http:/. 127.0.0.1:%HTTPPORT%/apex/f?p=4950'. Đảm bảo rằng bạn đã nhập đúng tên, sau đó thử lại

  4. GROUP BY / nhầm lẫn hàm tổng hợp trong SQL

  5. 12c Kế hoạch Thích ứng