Oracle

動態權限

  • July 16, 2014

我有一個應用程序可以在一個使用者的架構中創建表,而另一個使用者需要能夠使用動態創建的表。

例子:

  • 應用程序創建 User1.RandomTable
  • User2 需要在創建表後在 User1.RandomTable 上選擇、更新、刪除、插入

我正在嘗試這個:https ://stackoverflow.com/questions/9262539/how-do-i-create-a-oracle-trigger-that-grants-permissions

但是 DBMS_JOB.submit 有問題

錯誤(7,5):PLS-00201:必須聲明標識符“DBMS_JOB”

我以 User1 身份執行此連接並收到上述錯誤。我以 SYS 身份執行它並創建了過程和触發器,但是當我在 User1 的架構中創建表時,它沒有工作。User1.RandomTable 創建後不存在任何授權。

CREATE OR REPLACE TRIGGER GRANT_MYROLE_TRIG 
AFTER CREATE ON USER1.SCHEMA
DECLARE
 l_jobno PLS_INTEGER;
BEGIN
 if ora_sysevent = 'CREATE' and ora_dict_obj_type = 'TABLE' then
   DBMS_JOB.submit( l_jobno,
                  'BEGIN GRANT_MYROLE_PROC( ''' || ora_dict_obj_name || ''' ); END;',
                  sysdate + interval '10' second );
 end if;
END;

CREATE OR REPLACE PROCEDURE GRANT_MYROLE_PROC ( p_table_name IN VARCHAR2 ) 
AS 
BEGIN
 EXECUTE IMMEDIATE 'grant select, insert, update, delete on ' || p_table_name || ' to MY_USER_ROLE';
END;

您收到的錯誤表明 User1 使用者無權訪問該dbms_job包。你需要一個 DBA 來

GRANT EXECUTE ON dbms_job
  TO user1;

如果您創建的觸發器和過程由擁有表的使用者以外的使用者擁有,則需要在GRANT過程中的語句中包含模式名稱。

EXECUTE IMMEDIATE 
 'grant select, insert, update, delete on user1.' || p_table_name || 
 '   to MY_USER_ROLE';

此外,您需要確保將job_queue_processes初始化參數設置為大於 0 的值,以確保作業實際執行。

引用自:https://dba.stackexchange.com/questions/71611