日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

如何删除非当前用户下的JOB

發(fā)布時間:2024/8/26 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 如何删除非当前用户下的JOB 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。