2

管理ユーザーが所有するプロシージャで動的DDLを実行します。私は、このプロシージャを定義者権限を持つ技術的な操作ユーザー(操作ユーザーにはcreate tableロールがない)で実行したいと考えています。定義済みのロール権限を使用してPL/SQLプロシージャで動的DDLを実行します。

問題は、ロールを使用してadminユーザーに「create table」権限が与えられていることです。このロールでは、名前付きpl/sqlブロックでカウントされないようにDDLを実行できません。

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にAUTHID CURRENT_USERとAUTHID DEFINERに設定関数からプロシージャを実行無名ブロックを置く
  • (機能を期待しては何とか定義をカスケード接続します)

私がAUTHIDをCURRENT_USERに設定した場合、私はprocを実行することができますadminユーザーと正しく編集してください。

管理者ユーザーにCREATE TABLEを直接許可しないでこれを回避する方法はありますか?

+0

管理者のスキーマ内でそれを行うプロシージャ/ファンクションを作成し、そのプロシージャ/ファンクションに対して、実行しているユーザーに実行を許可することはできません。こうすることで、クエリを開いたままにして、何かが渡されたときにすぐに実行できるようにする場合は、分離+制限注入を実現できます。 – g00dy

+0

これは実際に私がやろうとしていることですが、管理者はロールを介してのみテーブルを作成するための直接的な権限を持っていません。これは、たとえそれが管理ユーザ自身によって実行されたとしても、定義された権利を持つ手続きを実行することを不可能にするようである。 – JochenDB

+1

adminユーザーにCREATE TABLEを許可しないのはなぜですか? – APC

答えて

1

それは実行者権限AUTHID CURRENT_USER(see doc)を持っている場合にのみ、PL/SQLストアド・プロシージャ/ファンクション内で役割を設定することができます。つまり、ops_userを使用してadmin_userのプロシージャをコールし、admin_userのロールにアクセスすることはできません。あなたのDBAは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

関連する問題