如何删除非当前用户下的JOB
Oracle沒有對JOB設置相應的權限,任何用戶都可以使用DBMS_JOB包建立自己的JOB。也正是因為沒有權限的限制,所以使用DBMS_JOB包無法刪除其他用戶下的JOB。
因此一直認為Oracle無法刪除其他用戶下的JOB,最多只能在刪除用戶的時候級聯刪除。看了論壇中jametong的回復,感覺Oracle中真的很少有什么東西不能做,而主要是你是否知道或能否想到的。受jametong的啟發,又總結出一種刪除其他用戶下JOB的方法。
下面總結了這兩種方法,一個是通過Undocument的包DBMS_IJOB,這種情況下需要DBMS_IJOB的執行權限。另一種方法需要CREATE ANY PROCEDURE和EXECUTE ANY PROCEDURE的權限。
?
SQL> conn yangtk/yangtk@test4
已連接。
SQL> select job, priv_user, what from user_jobs;
未選定行
SQL> declare
? 2? v_job number;
? 3? begin
? 4? dbms_job.submit(v_job, 'null;', sysdate, 'sysdate + 1');
? 5? commit;
? 6? end;
? 7? /
PL/SQL 過程已成功完成。
SQL> select job, priv_user, what from user_jobs;
?????? JOB PRIV_USER????????????????????? WHAT
---------- ------------------------------ ---------------------
??????? 84 YANGTK???????????????????????? null;
SQL> conn /@test4 as sysdba
已連接。
SQL> select job, priv_user, what from dba_jobs;
?????? JOB PRIV_USER????????????????????? WHAT
---------- ------------------------------ ----------------------
??????? 84 YANGTK???????????????????????? null;
SQL> exec dbms_job.remove(84);
BEGIN dbms_job.remove(84); END;
*
ERROR 位于第 1 行:
ORA-23421: 作業編號84在作業隊列中不是一個作業
ORA-06512: 在"SYS.DBMS_SYS_ERROR", line 86
ORA-06512: 在"SYS.DBMS_IJOB", line 529
ORA-06512: 在"SYS.DBMS_JOB", line 171
ORA-06512: 在line 1
即使是SYS用戶也無法通過DBMS_JOB包刪除其他用戶下的JOB。但是可以通過其他兩種方法來實現。
方法一:通過DBMS_IJOB包。
SQL> create user a identified by a;
用戶已創建
SQL> grant create session to a;
授權成功。
SQL> grant execute on dbms_ijob to a;
授權成功。
SQL> conn a/a@test4
已連接。
SQL> select job, priv_user, what from all_jobs;
未選定行
SQL> exec dbms_job.remove(84);
BEGIN dbms_job.remove(84); END;
*
ERROR 位于第 1 行:
ORA-23421: 作業編號84在作業隊列中不是一個作業
ORA-06512: 在"SYS.DBMS_SYS_ERROR", line 86
ORA-06512: 在"SYS.DBMS_IJOB", line 529
ORA-06512: 在"SYS.DBMS_JOB", line 171
ORA-06512: 在line 1
SQL> exec sys.dbms_ijob.remove(84);
PL/SQL 過程已成功完成。
SQL> commit;
提交完成。
SQL> conn yangtk/yangtk@test4
已連接。
SQL> select job, priv_user, what from user_jobs;
未選定行
方法二:通過建立其他用戶下的存儲過程來執行dbms_job包。
SQL> show user
USER 為"YANGTK"
SQL> declare
? 2? v_job number;
? 3? begin
? 4? dbms_job.submit(v_job, 'null;', sysdate, 'sysdate + 1');
? 5? commit;
? 6? end;
? 7? /
PL/SQL 過程已成功完成。
SQL> select job, priv_user, what from user_jobs;
?????? JOB PRIV_USER????????????????????? WHAT
---------- ------------------------------ --------------------
??????? 85 YANGTK???????????????????????? null;
SQL> conn /@test4 as sysdba
已連接。
SQL> grant create session to b identified by b;
授權成功。
SQL> grant create any procedure, execute any procedure to b;
授權成功。
SQL> conn b/b@test4
已連接。
SQL> create procedure yangtk.p_execute(p_str in varchar2) as
? 2? begin
? 3? execute immediate p_str;
? 4? end;
? 5? /
過程已創建。
注意,如果需要以CREATE OR REPLACE方式創建存儲過程,還需要ALTER ANY PROCEDURE權限。
SQL> begin
? 2? yangtk.p_execute('begin dbms_job.remove(85); commit; end;');
? 3? end;
? 4? /
PL/SQL 過程已成功完成。
SQL> conn yangtk/yangtk@test4
已連接。
SQL> select job, priv_user, what from user_jobs;
未選定行
第二種方法還支持刪除其他用戶下數據庫鏈的功能。
SQL> create database link yangtk.yangtingkun;
數據庫鏈接已創建。
SQL> conn /@test4 as sysdba
已連接。
SQL> col db_link format a40
SQL> select owner, db_link from dba_db_links where owner = 'YANGTK';
OWNER????????????????????????? DB_LINK
------------------------------ ---------------------------
YANGTK???????????????????????? YANGTK.YANGTINGKUN
SQL> drop database link yangtk.yangtingkun;
drop database link yangtk.yangtingkun
?????????????????? *
ERROR 位于第 1 行:
ORA-02024: 未找到數據庫鏈接
SQL> drop database link yangtk.yangtk.yangtingkun;
drop database link yangtk.yangtk.yangtingkun
?????????????????? *
ERROR 位于第 1 行:
ORA-02024: 未找到數據庫鏈接
SQL> conn b/b@test4
已連接。
SQL> exec yangtk.p_execute('drop database link yangtk.yangtingkun')
PL/SQL 過程已成功完成。
SQL> conn yangtk/yangtk@test4
已連接。
SQL> select * from user_db_links;
未選定行
需要注意的是,DBMS_IJOB包允許建立、刪除、修改任意用戶的JOB,這個權限很大,應當慎重授權。而第二種方法需要的CREATE ANY PROCEDURE和EXECUTE ANY PROCEDURE更要小心,不應該授權給除DBA以外的其他用戶。
?
總結
以上是生活随笔為你收集整理的如何删除非当前用户下的JOB的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 索引unusable|disable|e
- 下一篇: windows的定时任务设置