Oracle
動態權限
我有一個應用程序可以在一個使用者的架構中創建表,而另一個使用者需要能夠使用動態創建的表。
例子:
- 應用程序創建 User1.RandomTable
- User2 需要在創建表後在 User1.RandomTable 上選擇、更新、刪除、插入
但是 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 的值,以確保作業實際執行。