删除非当前用户下的 JOB

上一篇 / 下一篇  2008-12-24 21:01:16 / 个人分类:Oracle

  • 文件版本: V1.0
  • 开发商: 本站原创
  • 文件来源: 本地
  • 界面语言: 简体中文
  • 授权方式: 免费
  • 运行平台: Win9X/Win2000/WinXP
51Testing软件测试网c6`:d'}fMc O

 使用 dbms_job.remove 移除 job 时碰到了 ORA-23421 错误:51Testing软件测试网&VQhQ;l&k!DJ
ORA-23421: job number string is not a job in the job queue
^ ~3}}Y'\Or0Cause: There is no job visible to the caller with the given job number.
)\esHN0X` a0Action: Choose the number of a job visible to the caller.51Testing软件测试网ah*f)K6cY
当时没想明白,明明该 job 存在为什么说不在 job queue 中。后经同事提醒才想起来不能使用 dbms_job 包对非当前用户下的 job 进行操作,即使是 sysdba 也不能。这和 oracle 对 job 的权限设置策略有关。
I"s P"k4_o(NxS0SQL> show user51Testing软件测试网/YB@4I'}M sl~'F
USER is "SKY"51Testing软件测试网VDO5N!csp1W
SQL> declare n number;
Ccs Ho#vHcn o02 begin51Testing软件测试网\'r }$uvqf;W_.M-`
3 dbms_job.submit(n,'null;',sysdate,'sysdate+1');51Testing软件测试网Q#UX.E _Du?#Fu#l.\
4 commit;
(i*?w2NP$Q3BwR05 end;51Testing软件测试网"O3aP&Vf(D
6 /

(r,JJ.Mnp/@th0

X"{xU4@%z.q0O#T#x0PL/SQL procedure successfully completed.

J8U S Ub jP"U0

@G,ws&Ee/XnI_+k\0SQL> select job,log_user,priv_user,schema_user,last_date,next_date,what51Testing软件测试网(AyOHk/YWh3pe
2 from user_jobs;
51Testing软件测试网k%y3]!abqE'`

51Testing软件测试网J v3J7B r&[x/Vv!y

JOB LOG_USER PRIV_USE SCHEMA_U LAST_DATE NEXT_DATE WHAT51Testing软件测试网8{2P+R'UR\N
--- -------- -------- -------- ------------------- ------------------- -----51Testing软件测试网(nxc$? A2J?x
23 SKY SKY SKY 2007-04-24 00:32:56 2007-04-25 00:32:56 null;

eC \D5a K8l|%A3I051Testing软件测试网pt TY!l

SQL> conn /as sysdba
7O&a`q.aDU0Connected.51Testing软件测试网`^t#ND_E
SQL> exec dbms_job.INTERVAL(23,'sysdate+2')51Testing软件测试网\1Fz-k;s `m
BEGIN dbms_job.INTERVAL(23,'sysdate+2'); END;
51Testing软件测试网$J#Xr S2A] qN

51Testing软件测试网e?c&p!il @"C

*
Nw}&Z9paW0ERROR at line 1:51Testing软件测试网M%?x LN"h9b
ORA-23421: job number 23 is not a job in the job queue
6|d8o'KJ7j0ORA-06512: at "SYS.DBMS_SYS_ERROR", line 86
T U7UQ8{eR8U0ORA-06512: at "SYS.DBMS_IJOB", line 52951Testing软件测试网S:`W,N8aDr:u
ORA-06512: at "SYS.DBMS_JOB", line 234
,Q.~jkn0ORA-06512: at line 1
51Testing软件测试网Zvk^5L+fm ^ V}

51Testing软件测试网:~7cFJ4PC u5ep2q_1k

51Testing软件测试网t W(L e M#o9UO^s
SQL> exec dbms_job.next_date(23,sysdate+1)
|?QNbLG"D6n Kz0BEGIN dbms_job.next_date(23,sysdate+1); END;

Sqr3C"Cz0

-r g&I;d/s,[tC0*
_UHdy#`~&k0ERROR at line 1:
&w cm5m C+LJGr Pj0ORA-23421: job number 23 is not a job in the job queue51Testing软件测试网CHK^!n?Az}
ORA-06512: at "SYS.DBMS_SYS_ERROR", line 86
fUcz YZ0ORA-06512: at "SYS.DBMS_IJOB", line 529
YH,?hiC?w6N0ORA-06512: at "SYS.DBMS_JOB", line 215
'B%JS#k%k)C.xU+h"d0ORA-06512: at line 1

,F0RK X*i051Testing软件测试网$ZF6y'a [FtBz

51Testing软件测试网(P"f&QoH1QY
SQL> exec dbms_job.remove(23)
9~0XV3H#_k0BEGIN dbms_job.remove(23); END;
51Testing软件测试网9brJK3[

51Testing软件测试网ZJ}kPcQ

*51Testing软件测试网 aH@h7aW
ERROR at line 1:51Testing软件测试网8H$ANtS U,b`6s
ORA-23421: job number 23 is not a job in the job queue51Testing软件测试网sFa&h1B8]K!z;l
ORA-06512: at "SYS.DBMS_SYS_ERROR", line 86
e^x"K)c*n0ORA-06512: at "SYS.DBMS_IJOB", line 52951Testing软件测试网r,G,u$z:x
ORA-06512: at "SYS.DBMS_JOB", line 215
/bcW Z g"HN$a@ l0@$D0ORA-06512: at line 1
51Testing软件测试网0f'fJduw,vnp0v

BI(m)G jBD7~h0注:dba_jobs 中的有三个(10g 中)表示用户的字段:51Testing软件测试网M(sgS6?"|zp
LOG_USER 提交任务的用户51Testing软件测试网n-AP(uV0A.X W
PRIV_USER 赋予任务权限的用户51Testing软件测试网-H[~#us ED
SCHEMA_USER 对任务作语法分析的用户模式51Testing软件测试网y8V$NT;_
其中 PRIV_USER 表示 job 的拥有者。
/F`$o6\u? k&W0Tom 有一个例子,演示了三个字段显示不同用户的情况(似乎很少碰到这种情况):
ops$tkyte@ORA9IR2> grant create session, create procedure to a;51Testing软件测试网1IBe;y x:L$PNm
Grant succeeded.
ops$tkyte@ORA9IR2> grant create session, create procedure to b;51Testing软件测试网s!O2@{0b*?&W
Grant succeeded.
ops$tkyte@ORA9IR2> grant create session to c;
~4RH%Fn5s]+G[0Grant succeeded.
ops$tkyte@ORA9IR2> @connect a/aops$tkyte@ORA9IR2> set termout offa@ORA9IR2> set termout ona@ORA9IR2> create procedure p51Testing软件测试网-@Kh0z*` aX0{*GQ
2 as
K _9i$Gg&e03 begin
{M2ua|04 null;51Testing软件测试网 R1_dXc ?#pEu2vp
5 end;51Testing软件测试网!Qb~Q)|?~
6 /51Testing软件测试网"sT(B5lJ I6U

1Q TZ.l\!Rys0Procedure created.
a@ORA9IR2> grant execute on p to b;
3jj;a]6J|051Testing软件测试网!uA jV/q k D*Y
Grant succeeded.
a@ORA9IR2>a@ORA9IR2> @connect b/ba@ORA9IR2> set termout offb@ORA9IR2> set termout onb@ORA9IR2> create or replace procedure p
-K5_+_F"p1[H$v%K02 as51Testing软件测试网+f3{Nq)L?Z
3 n number;
6pl4TE,g1j04 begin51Testing软件测试网Ki [6csZ
5 execute immediate '
6j7qg3I[Q;ah#|06 declare
EpH1R6?07 n number;51Testing软件测试网!LE+_K1P
8 begin
(Y(V$x{|2a09 execute immediate ''alter session set current_schema=a'';51Testing软件测试网%a8MkX&Gl nr q
10 dbms_job.submit(n,''p;'');51Testing软件测试网8uM8uE x
11 end;';
1k.Kyd?8n%ysw012 end;
Xx6__ Mh'_]~p"f013 /51Testing软件测试网kC OD4L4e&m+z5M$m

Ii7l#[n;Qy(M&?p-Ql0Procedure created.
b@ORA9IR2> grant execute on p to c;
Ucv[ @&n)n P2Kfj4LG0
Zfj-`l0Grant succeeded.
b@ORA9IR2>b@ORA9IR2> @connect c/cb@ORA9IR2> set termout offc@ORA9IR2> set termout onc@ORA9IR2> exec b.p
/po+^jI%d0
%L;e~ r:@4V!V0x4N0PL/SQL procedure successfully completed.
c@ORA9IR2> @connect b/bc@ORA9IR2> set termout offb@ORA9IR2> set termout onb@ORA9IR2> select log_user, priv_user, schema_user from user_jobs;
9gC_%B&k.bk0
!_?b3`Os9}0LOG_USER PRIV_USE SCHEMA_USE51Testing软件测试网8Os${(z&w
-------- -------- ----------51Testing软件测试网z;J5as5lE/Xa
C B A

$K6A2D(C'hj$?;Q0

3E1~`"n$En RT0接下来要引出正题,如何对非当前用户下的 job 操作?在网上搜索了一下,找到了 yangtingkun 的一篇总结 ,受益匪浅。

z_4cy5l4]051Testing软件测试网r8\E*M(l'\h)gn

#CR S3Vp`0可以分两种方法:
\BB z@ d'O01. 使用 Undocument 的包 DBMS_IJOB51Testing软件测试网1?uuNs1^
该包应该是 Oracle 内部操作使用的,在文档上并没有公开,不过的确挺好用,jametong 已经对其作了总结,大部分过程和 DBMS_JOB 差不多,有一个区别要注意的是:DBMS_IJOB.submit 的 job 参数是 in 的,而 DBMS_JOB 中是 out 的。这里我做一个简单的实验,移除刚才创建的 job:
0s X5N_X'x;B(y;U0SQL> show user
E9]j })r(}kwd7ck0USER is "SYS"
TU_(A6@.F"M W0SQL> select job,log_user,priv_user,schema_user,last_date,next_date,what51Testing软件测试网hq7IL_n
2 from dba_jobs51Testing软件测试网g$~h{Ph
3 where job=23;

m2[Q UD}'J0

e M4V8\,R&lx0JOB LOG_USER PRIV_USE SCHEMA_U LAST_DATE NEXT_DATE WHAT
3rghI4b F0--- -------- -------- -------- ------------------- ------------------- -----51Testing软件测试网 ~E Iwp1p[fZi
23 SKY SKY SKY 2007-04-24 00:32:56 2007-04-25 00:32:56 null;
51Testing软件测试网D H;o[SL

sL6^!E"[ A{O m/]G0SQL> exec dbms_ijob.remove(23)51Testing软件测试网u _ w&Ct*a3uY N{

2X[ Au4?0PL/SQL procedure successfully completed.

0E*y?!O{3o!j$[8W*H051Testing软件测试网\Y2^j#G cHX0i

SQL> select job,log_user,priv_user,schema_user,last_date,next_date,what
;v%P8LKSdFAC02 from dba_jobs
Y_-F`"c,ac&oT8Y03 where job=23;

:nd/Z [@1f@ P051Testing软件测试网 [6~ z(K9~{$M"K

no rows selected

6J/G4z-bT%Q.UQ051Testing软件测试网%h-Oh2[wDv

成功移除了。51Testing软件测试网(l f a3_OR

O.P'glK+k!AE;q~.]j6N2S02. 通过建立其他用户下的存储过程来执行 dbms_job 包51Testing软件测试网$n"v+c s l&@
这种方法应该是比较正统的方法,虽然复杂一些。以下例子,转载自 yangtingkun 的 blog
S4jY;_y S(X!HR,R0SQL> show user51Testing软件测试网6rz#d? ^ {
USER 为"YANGTK"
cu:["Z.R4g k0SQL> declare51Testing软件测试网/_$X]'c2^4zUs9c0C
2 v_job number;
N:Y'Z6I)X9E(c%v R03 begin51Testing软件测试网$o5@:N"M2F:V9M5x
4 dbms_job.submit(v_job, 'null;', sysdate, 'sysdate + 1');51Testing软件测试网[H!Rf$J:?&Cw
5 commit;
\n8M)Rz06 end;51Testing软件测试网8crA-w)S2l
7 /

a T:UX`&@ALg0

m |5B+Y/F5f0

x.]'bUK3`)w0PL/SQL 过程已成功完成。51Testing软件测试网/Z R.x2p"XV%V9V{

AS dW9B0SQL> select job, priv_user, what from user_jobs;

~%MHRaOw`"@I'M8m6r0

B7O w3[/KyRrC0JOB PRIV_USER WHAT
%C*GT$z1k0---------- ------------------------------ --------------------
I} \%d?3^085 YANGTK null;
51Testing软件测试网2pg(r\5N0DK^!Yd@

51Testing软件测试网!s,LQ4j9[Z:vP{

SQL> conn/@test4as sysdba
'|x+~}ix0已连接。51Testing软件测试网)jJ L;];[a n Kr
SQL> grant create session to b identified by b;

wXol:MT0

c]m(_+`1ofD:[nLC0授权成功。

%m"~1_*P2Q2gh@Q0

(Z`F%Mf-M0SQL> grant create any procedure, execute any procedure to b;

rj%Y\?bi5g0

#t-ZK6Ij,L#f g0授权成功。51Testing软件测试网!n[(U3} xH

51Testing软件测试网4z;~y(Tz,^

SQL> connb/b@test4
9YA#P&T#?Xb!h0已连接。
"r4d,L?.u0SQL> create procedure yangtk.p_execute(p_str in varchar2) as51Testing软件测试网A6a3R&]t8~2V
2 begin51Testing软件测试网 o w*Z g8B/xF
3 execute immediate p_str;
$n*C%q&n5X N z7vK7Z-z*Y04 end;
/q LH9TA%tO7l05 /
51Testing软件测试网#|2^m9y[&fto1m

6P-VN(d;N9z0过程已创建。

(R5[Cr D N051Testing软件测试网y)D`yr!j0w;F

注意,如果需要以CREATE OR REPLACE方式创建存储过程,还需要ALTER ANY PROCEDURE权限。

5un^R+B051Testing软件测试网9rDkp)L7]/AV*Z

SQL> begin51Testing软件测试网0l/t:k|Vk1s Ur
2 yangtk.p_execute('begin dbms_job.remove(85); commit; end;');51Testing软件测试网4FA4N;I3Opv3E
3 end;
[*sMB?EL`04 /

C9N8h4H1C#w-p0

g?3Y6zUI0PL/SQL 过程已成功完成。

M*_/_+q!_@ v051Testing软件测试网V0h7DV8y i`Z

SQL> connyangtk/yangtk@test4
r6`%Yw.{jH.[0已连接。
#^w+[.r'py0SQL> select job, priv_user, what from user_jobs;

4h6ng%C;]n051Testing软件测试网+j2S-K @1bj

未选定行51Testing软件测试网 _-nQ5uOi3c T

51Testing软件测试网*|;t B.sx

第二种方法还支持删除其他用户下数据库链的功能。51Testing软件测试网sf&`d9T6m!tv

51Testing软件测试网&gsY2X&N gh"Q6S:\#?.m X

SQL> create database link yangtk.yangtingkun;

J hTq\$WA"W0

G2Iob q0数据库链接已创建。51Testing软件测试网5U-~WlC*oFcO3L

hN-RC {P{0SQL> conn/@test4as sysdba
"G/a-o ?1L s4D0已连接。
F{h~Z-A{ ~h X0SQL> col db_link format a40
*j$@B%b*D}mh0SQL> select owner, db_link from dba_db_links where ōwner = 'YANGTK';

Yf1M0C]s*yJ#H051Testing软件测试网Xcro#mqQ7r

OWNER DB_LINK
|DcJZ%}6N0------------------------------ ---------------------------
R{v]zT^I.j~0YANGTK YANGTK.YANGTINGKUN
51Testing软件测试网Wk F!\g_-Ds$?

NK2p@ y _zfle0SQL> drop database link yangtk.yangtingkun;
n7Y+LQ(||.Z'c\!ep0drop database link yangtk.yangtingkun51Testing软件测试网QY'gi6`(r
*
suK*A mu#^'S0ERROR 位于第 1 行:
*@Y$SI1Ed4G0ORA-02024: 未找到数据库链接

:s-?Of;E$yM6VG0

)t\ JK$C8H0SQL> drop database link yangtk.yangtk.yangtingkun;
"W:c&P%o!P4^*H[0drop database link yangtk.yangtk.yangtingkun
,kZFFt4T0*
A&c0?$I$J8H,C0ERROR 位于第 1 行:51Testing软件测试网1~"Ji8u2Q+q4j
ORA-02024: 未找到数据库链接
51Testing软件测试网/C&d8BNvOQ

.U8NNh5|4om.V0SQL> connb/b@test451Testing软件测试网0\+{ tax n
已连接。51Testing软件测试网3Ws$u [~`MS
SQL> exec yangtk.p_execute('drop database link yangtk.yangtingkun')

0L9rj{P|:x x lesting软件测试网8A.@GZV(d9L

PL/SQL 过程已成功完成。51Testing软件测试网.XGnWy N

51Testing软件测试网 ^s%x0d:A#R5D S

SQL> connyangtk/yangtk@test4
f&l YDc6D?0已连接。51Testing软件测试网0g"Nn;t!r8E
SQL> select * from user_db_links;
u,M?&LRa+u.h b.R*y9_0未选定行
51Testing软件测试网]'nqow

51Testing软件测试网#[H5@,M'a;@!oG

参考:http://yangtingkun.itpub.net/post/468/24348http://blog.itpub.net/post/5042/24344http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:633537913184

'N(i;BKB'J3Nf0

M"G:~$prA0补充:
(vF'cF3h `b0我们知道 dbms_job 中的过程操作之后都要 commit 才能永久生效(我一直对这点感到很奇怪,为什么 Oracle 不在过程中直接加上 commit),这点也适用于 dbms_ijob 包:51Testing软件测试网+\U/qR)c:ulf
SQL> select job,log_user,priv_user,schema_user,last_date,next_date,what51Testing软件测试网'HG-ld8Q2v%F(a@
2 from dba_jobs;
51Testing软件测试网@M ?|1Dc _o)W

~'a(p,GmI4U0JOB LOG_USER PRIV_USE SCHEMA_U LAST_DATE NEXT_DATE WHAT51Testing软件测试网~JsjL#}0U
--- -------- -------- -------- ------------------- ------------------- -----51Testing软件测试网(s{Gf a)cN7Z)W
1 SYSMAN SYSMAN SYSMAN 2007-04-24 01:10:54 2007-04-24 01:11:54 EMD_M
&r8O/D&rp0AINTE51Testing软件测试网.s4O"Df$h~
NANCE
n4q!erMVA0.EXEC51Testing软件测试网?pUpE%r
UTE_E
U}G~O |8YQk0M_DBM
c4uBvjBq m0S_JOB51Testing软件测试网c6Fzp8O l3K
_PROC51Testing软件测试网4LC NF Z6y
S();
51Testing软件测试网6Y;r#kP c_/hr n

51Testing软件测试网'I5f%U"bAqW6rG g

23 SKY SKY SKY 2007-04-24 00:32:56 2007-04-25 00:32:56 null;

O` [:u$j0

WH`/r*yZK ?@~0SQL> exec dbms_ijob.next_date(23,sysdate+1)51Testing软件测试网NR~^f6}c/K

Tn2C$V Ez7S0PL/SQL procedure successfully completed.51Testing软件测试网4YD~{2@1y bZ7w rW

51Testing软件测试网9?4\0Up,D1K

SQL> select job,log_user,priv_user,schema_user,last_date,next_date,what
5@KCc;P02 from dba_jobs;

RObzX,XsPva051Testing软件测试网P/?P(I fG2_U

JOB LOG_USER PRIV_USE SCHEMA_U LAST_DATE NEXT_DATE WHAT51Testing软件测试网 @ V/zbG,vc
--- -------- -------- -------- ------------------- ------------------- -----
-^v mFl Zw01 SYSMAN SYSMAN SYSMAN 2007-04-24 01:20:35 2007-04-24 01:21:35 EMD_M51Testing软件测试网 aE!`5kkn3Wo
AINTE51Testing软件测试网[ P6l,|1} AU
NANCE51Testing软件测试网x WGP)f+v,F;@
.EXEC
2i!J8r"](`W8S E0UTE_E51Testing软件测试网([Mhrw$U%e I
M_DBM51Testing软件测试网M!yaHbN'iU
S_JOB51Testing软件测试网[L-K'kJ_;?B7\3KM
_PROC
ww-}&A"^+S7F0S();

B+RnCT2tWfd0

5mTzc@/S-s1V023 SKY SKY SKY 2007-04-24 00:32:56 2007-04-25 01:21:31 null;

z{:b*^_8Zg2P"` }051Testing软件测试网LXKz|H#Z

SQL> rollback;51Testing软件测试网.he!`-P0_A

@\/m1jqTKPy0Rollback complete.

#m;IG.[,}Z']051Testing软件测试网IJF uXA$q

SQL> select job,log_user,priv_user,schema_user,last_date,next_date,what
;r+Hn9]I-AcU02 from dba_jobs;

f9@^nz"aU5cK0

"cG"B:qJ,`$E0JOB LOG_USER PRIV_USE SCHEMA_U LAST_DATE NEXT_DATE WHAT
&dy+H b$a"}E)z[~%lv0--- -------- -------- -------- ------------------- ------------------- -----
q1l5M2_RJ%J01 SYSMAN SYSMAN SYSMAN 2007-04-24 01:21:40 2007-04-24 01:22:40 EMD_M
MHwH-fV$ihl0AINTE
^H vA9\H jms E.I0NANCE
X&]+\R/x&qX0k|(eM0.EXEC51Testing软件测试网;W TLO9j Ei
UTE_E
:UIGCN7k'W+q0M_DBM51Testing软件测试网)A`-jZ%e.kFB
S_JOB51Testing软件测试网 Q9_[ I#wZ,D
_PROC51Testing软件测试网hc%d*G!\,Zm
S();

k&V$I ~x9O+O2W051Testing软件测试网6pt~v:A8`;J:BON

23 SKY SKY SKY 2007-04-24 00:32:56 2007-04-25 00:32:56 null;51Testing软件测试网'j+K3x"P1L YpG2Pt

TAG: Oracle

 

评分:0

我来说两句

Open Toolbar