如何删除非当前用户下的JOB
Oracle沒有對JOB設(shè)置相應(yīng)的權(quán)限,任何用戶都可以使用DBMS_JOB包建立自己的JOB。也正是因為沒有權(quán)限的限制,所以使用DBMS_JOB包無法刪除其他用戶下的JOB。
因此一直認為Oracle無法刪除其他用戶下的JOB,最多只能在刪除用戶的時候級聯(lián)刪除。看了論壇中jametong的回復(fù),感覺Oracle中真的很少有什么東西不能做,而主要是你是否知道或能否想到的。受jametong的啟發(fā),又總結(jié)出一種刪除其他用戶下JOB的方法。
下面總結(jié)了這兩種方法,一個是通過Undocument的包DBMS_IJOB,這種情況下需要DBMS_IJOB的執(zhí)行權(quán)限。另一種方法需要CREATE ANY PROCEDURE和EXECUTE ANY PROCEDURE的權(quán)限。
?
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: 作業(yè)編號84在作業(yè)隊列中不是一個作業(yè)
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。但是可以通過其他兩種方法來實現(xiàn)。
方法一:通過DBMS_IJOB包。
SQL> create user a identified by a;
用戶已創(chuàng)建
SQL> grant create session to a;
授權(quán)成功。
SQL> grant execute on dbms_ijob to a;
授權(quán)成功。
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: 作業(yè)編號84在作業(yè)隊列中不是一個作業(yè)
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;
未選定行
方法二:通過建立其他用戶下的存儲過程來執(zhí)行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;
授權(quán)成功。
SQL> grant create any procedure, execute any procedure to b;
授權(quán)成功。
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? /
過程已創(chuàng)建。
注意,如果需要以CREATE OR REPLACE方式創(chuàng)建存儲過程,還需要ALTER ANY PROCEDURE權(quán)限。
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;
未選定行
第二種方法還支持刪除其他用戶下數(shù)據(jù)庫鏈的功能。
SQL> create database link yangtk.yangtingkun;
數(shù)據(jù)庫鏈接已創(chuàng)建。
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: 未找到數(shù)據(jù)庫鏈接
SQL> drop database link yangtk.yangtk.yangtingkun;
drop database link yangtk.yangtk.yangtingkun
?????????????????? *
ERROR 位于第 1 行:
ORA-02024: 未找到數(shù)據(jù)庫鏈接
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,這個權(quán)限很大,應(yīng)當(dāng)慎重授權(quán)。而第二種方法需要的CREATE ANY PROCEDURE和EXECUTE ANY PROCEDURE更要小心,不應(yīng)該授權(quán)給除DBA以外的其他用戶。
?
總結(jié)
以上是生活随笔為你收集整理的如何删除非当前用户下的JOB的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 索引unusable|disable|e
- 下一篇: 去IOE:去掉“IE”就Ok?