2017-07-31 63 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