2017-07-31 68 views
2

我想在管理員用戶擁有的過程中執行一些動態DDL。我想用具有定義權限的技術操作用戶執行此過程(操作用戶不具有create table角色)。通過定義者角色權限在PL/SQL過程中執行動態DDL

問題是'創建表'權限授予管理員用戶通過使用角色,它不允許我執行DDL,因爲它似乎角色不計入命名的PL/SQL塊。

create or replace 
PROCEDURE test_permissions AUTHID DEFINER AS 
    v_query_string VARCHAR2(400 CHAR) := 'CREATE TABLE TEST(abcd VARCHAR2(200 CHAR))'; 
BEGIN 

    EXECUTE IMMEDIATE v_query_string; 

END; 

我試了一下:

  • 運行從上PROC設置驗證ID定義與AUTHID CURRENT_USER函數的程序(希望這個函數將級聯莫名其妙的定義者)
  • 把一個匿名塊內部執行DDL的函數(作爲角色似乎在匿名塊中計數)

如果我將AUTHID設置爲CURRENT_USER,則可以執行proc與管理員用戶正確配對。

有沒有什麼辦法可以解決這個問題而不直接授予管理員用戶的CREATE TABLE?

+0

難道你不能只是創建一個程序/功能,在管理員的模式中做到這一點,並授予您執行該程序/功能的用戶,你在腦海中。這樣你可以實現隔離+限制注入,如果你打算讓查詢處於打開狀態,只需使用立即執行即可。 – g00dy

+0

事實上,我打算這麼做,但管理員沒有直接資助來創建表格,只能通過角色。這似乎使得使用定義者權限執行該過程變得不可能,即使它是由管理員用戶自己執行的。 – JochenDB

+1

爲什麼你不想授予管理員用戶CREATE TABLE? – APC

回答

1

只能設置一個PL/SQL存儲過程/函數中的作用,如果它有調用者權限AUTHID CURRENT_USER(see doc)。這意味着您不能使用ops_user調用admin_user的過程,然後訪問admin_user的角色。如果你的數據庫管理員堅持使用角色來控制CREATE TABLE特權,這裏是我以前見過的方法:

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; 

這將暫時角色授予ops_user只是執行代碼。默認情況下,ops_user不應該能夠查看admin_user的包體源。你可能會包裝包體以進一步保護密碼。但是,除了密碼安全之外,我最關心的這種方法是,Oracle不提供禁用單個角色的好方法,所以如果ops_user具有其他密碼保護角色,則此代碼可能會在嘗試恢復時引發ORA-01979他們。

所以,有一個答案,但我仍然建議做其他評論者的建議,並授予管理員用戶CREATE TABLE。

+0

感謝您的選擇。正如你所建議的那樣,我將首先嚐試爲我的管理員用戶獲得一個直接的CREATE TABLE授予。 – JochenDB