我申请这个blog是为了督促自己,把自己平时的一些想法和思考结果保留下来。 本博客所有内容均为原创,如有转载请注明作者和出处

有趣的触发器事件

上一篇 / 下一篇  2008-04-10 23:59:52 / 个人分类:ORACLE

在查询触发器的视图时碰到了一个有趣的问题。

 

 

通过一个SQL检查DBA_TRIGGERS中存在哪个触发事件:

SQL> SELECT DISTINCT TRIGGERING_EVENT FROM DBA_TRIGGERS;

TRIGGERING_EVENTITPUB个人空间"Yg6fwo@&o:u
------------------------------
0T!@+~&Mu0UPDATE OR DELETE
%eY2m~}/}l.[0DROPITPUB个人空间P'NR iT/X#~%H
ALTER OR RENAME
3M Tf iM3d0INSERT OR UPDATE OR DELETEITPUB个人空间"IL#@jrC-Z7U
INSERT OR UPDATEITPUB个人空间*Z$?;}/{v(Y'b-C
DELETE
r1sD]`)_4{$^0UPDATE
YM.o:sf0TRUNCATEITPUB个人空间;WUxvi.{F_+[ a
CREATEITPUB个人空间:ANf!Dj|8v y
ALTERITPUB个人空间3J8Sg!M ~o;}[.],P
CREATE OR ALTER
X;Hu{'H _0INSERT
(Whb2khc0STARTUP
D@ Fc5C.|%d-p$v0DROP OR TRUNCATEITPUB个人空间NJk KXB2V@
SHUTDOWN

已选择15行。

下面检查数据库中触发事件为SHUTDOWN的触发器有哪些:

SQL> SELECT OWNER, TRIGGER_NAME
TM5^:d2LNI3M0  2  FROM DBA_TRIGGERS
jN3FM K9`-`n0  3  WHERE TRIGGERING_EVENT = 'SHUTDOWN';

未选定行

居然没有找到,可是刚才的查询明明看到有触发事件为SHUTDOWN的触发器。基本上只有两种可能,一个是在我发出第二个查询之前,有人删除了这种类型的触发器,不过由于这个数据库是我本机的数据库,因此不存在这个问题。那么只剩下一种可能,就是查询结果后面还跟了看不到的字符。

首先验证这种触发事件的触发器仍然存在:

SQL> SELECT OWNER, TRIGGER_NAME
'`An~0E6D W0  2  FROM DBA_TRIGGERS
_ |%DB P:|9X&`1o0  3  WHERE TRIGGERING_EVENT LIKE 'SHUT%';

OWNER                          TRIGGER_NAMEITPUB个人空间ZY&U6zxqS
------------------------------ ----------------------------
-w,r,M@1{^$Z*w+V!L9e0SYS                            AURORA$SERVER$SHUTDOWNITPUB个人空间(oo,\2Y8\9zJ
SYS                            OLAPISHUTDOWNTRIGGER

触发器果然存在,莫非所有的触发事件后面都添加了不可见字符:

SQL> SELECT DISTINCT TRIGGERING_EVENT || '.'
o tfKM'QB0  2  FROM DBA_TRIGGERS;

TRIGGERING_EVENT||'.'
dN z$f;ve(|2hY0------------------------------------------------------
Z:YZ \nx)B EX u0TRUNCATE .
,S^K T g)\0INSERT OR UPDATE.
jx2H x3|X7AkQ0DELETE.
9J/IM#Ht&~R"l0zo4x.|0CREATE .ITPUB个人空间/`r9S#jP g(z7c*`2d
INSERT OR UPDATE OR DELETE.
ey*H)u7Iq,e0SHUTDOWN .
xrMQLc2W*p,}Y6j0UPDATE.ITPUB个人空间TTm9A:GlImW@
ALTER .
.C-u7{ iO d9t-Kt0UPDATE OR DELETE.ITPUB个人空间[.r-s0Af!Z-e
DROP OR TRUNCATE .
1{.r*~.L5N;FK$m0t0STARTUP .ITPUB个人空间A(c p._tVj;B
DROP .ITPUB个人空间6` X vG2S$hG[
ALTER OR RENAME .
)^*_W1m;|"}J!E0INSERT.ITPUB个人空间;IW:Dr'{nt]O
CREATE OR ALTER .

已选择15行。

奇怪的现象出现了,并不是每种触发事件后面都跟随了空格,所有DML以及DML组合事件都不带末尾的空格,而其他类型都是带空格的,这又是什么原因呢。

SQL> SELECT TEXT FROM DBA_VIEWS
`9ZL}2ELwm4YF0  2  WHERE VIEW_NAME = 'DBA_TRIGGERS';

TEXTITPUB个人空间#['P;q.gCzwE
-------------------------------------------------------------------------------ITPUB个人空间9X(p"Z9h T!Bd
select trigusr.name, trigobj.name,ITPUB个人空间]d Nkb H d
decode(t.type#, 0, 'BEFORE STATEMENT',ITPUB个人空间A!_&UvMu A$t
                1, 'BEFORE EACH ROW',ITPUB个人空间Q"?!din2UyU
                2, 'AFTER STATEMENT',
u@p t%^;k%\0                3, 'AFTER EACH ROW',ITPUB个人空间'F p"Xp:Nr W7~6Lx0s9K#r
                4, 'INSTEAD OF',ITPUB个人空间 V~t(W$J@\T%vu8N1l;X9}
                   'UNDEFINED'),ITPUB个人空间'NbGSA1u*pr
decode(t.insert$*100 + t.update$*10 + t.delete$,
)z}2rR&d0
                 100, 'INSERT',
-wHUp7e4u7BvzR0                 010, 'UPDATE',
y!B4e9r)o F;s&w/q t]0                 001, 'DELETE',
]L/~'x;v f0                 110, 'INSERT OR UPDATE',
L9y$g3cT^|p$_*o'v0                 101, 'INSERT OR DELETE',ITPUB个人空间3Jm3wFRF
                 011, 'UPDATE OR DELETE',ITPUB个人空间t!Ln%nQo
                 111, 'INSERT OR UPDATE OR DELETE'
, 'ERROR'),ITPUB个人空间6? b*gg)D8}R*]5y?0M
tabusr.name,ITPUB个人空间#sA z;A~8a:DW"E
decode(bitand(t.property, 1), 1, 'VIEW',
bR7].R'J#AsH0                              0, 'TABLE',ITPUB个人空间H'w:Q;}Hjx-mJF
                                 'UNDEFINED'),
F0|Az'm@I0tabobj.name, NULL,ITPUB个人空间6b-B0I0iu*~m2K
'REFERENCING NEW AS '||t.refnewname||' OLD AS '||t.refoldname,
!J8L({h:M9mS0t.whenclause,decode(t.enabled, 0, 'DISABLED', 1, 'ENABLED', 'ERROR'),ITPUB个人空间nJ|*Hq&O^QT c
t.definition,ITPUB个人空间%b ?HVE!^\#G9D
decode(bitand(t.property, 2), 2, 'CALL',
'Tz-h3^ aX[$R-Xm0                                 'PL/SQL     '),
b-v"BTU0t.action#
%]_2@d*iX0from sys.obj$ trigobj, sys.obj$ tabobj, sys.trigger$ t,ITPUB个人空间W$Z4EQd"~0G3bqe
     sys.user$ tabusr, sys.user$ trigusr
-o kXr&RX4~7o|(}0where (trigobj.obj#   = t.obj# andITPUB个人空间 i ]3ioXs8x
       tabobj.obj#    = t.baseobject andITPUB个人空间V:iV.[h A)g
       tabobj.owner#  = tabusr.user# andITPUB个人空间n x,i)la.^7RQ*O
       trigobj.owner# = trigusr.user# and
:k3e4X`X_%^d0n0       bitand(t.property, 63)     < 8 )ITPUB个人空间 L4X#M/Q/E H p+hl
union allITPUB个人空间Q/P*X~W0KHfA-l
select trigusr.name, trigobj.name,ITPUB个人空间'}'Dcke,z d B
decode(t.type#, 0, 'BEFORE EVENT',
A;r$n!~&l4u0                2, 'AFTER EVENT',ITPUB个人空间N }3x^a
                   'UNDEFINED'),ITPUB个人空间fE4V2Ua
decode(bitand(t.sys_evts, 1), 1, 'STARTUP ') ||
2P1Q;K[q6e O:e+Nf0decode(bitand(t.sys_evts, 2), 2,
D|k;FM;c y*vM0       decode(sign(bitand(t.sys_evts, 1)), 1, 'OR SHUTDOWN ',
P QWiB/a,o0                                               'SHUTDOWN ')) ||
-_)P$q-xJF%Y0decode(bitand(t.sys_evts, 4), 4,ITPUB个人空间gd_5JP&g
       decode(sign(bitand(t.sys_evts, 3)), 1, 'OR ERROR ',
/pV*W#[6O!immbR0                                              'ERROR ')) ||
;nh2K:^@l@gX0decode(bitand(t.sys_evts, 8), 8,ITPUB个人空间U'G(I,b-X9N1y
       decode(sign(bitand(t.sys_evts, 7)), 1, 'OR LOGON ',
"m/u5Ux?H0                                              'LOGON ')) ||ITPUB个人空间/S|J$K,j*v
decode(bitand(t.sys_evts, 16), 16,ITPUB个人空间b7`NE3A~:e0L"m(m
       decode(sign(bitand(t.sys_evts, 15)), 1, 'OR LOGOFF ',
'f s ?y#sg0                                               'LOGOFF ')) ||
vQ0epuSy0decode(bitand(t.sys_evts, 262176), 32,ITPUB个人空间2l8F kLs gs
       decode(sign(bitand(t.sys_evts, 31)), 1, 'OR CREATE ',ITPUB个人空间x YU k2s)q,FL#}
                                               'CREATE ')) ||
^hLh%Gt0N0decode(bitand(t.sys_evts, 262208), 64,
1wy qDYOv^!f0       decode(sign(bitand(t.sys_evts, 63)), 1, 'OR ALTER ',ITPUB个人空间;LDG E;} P S%k K5|%y
                                               'ALTER ')) ||
&?*W5d+hn{.@)uD0decode(bitand(t.sys_evts, 262272), 128,
#e"]*p'X `0       decode(sign(bitand(t.sys_evts, 127)), 1, 'OR DROP ',
.t8Z O_ L1z7LN w|2J2X0                                                'DROP ')) ||ITPUB个人空间$d%pq D'Td Z$`
decode (bitand(t.sys_evts, 262400), 256,
0Q ^.z,mp0c-Pm2W ^0        decode(sign(bitand(t.sys_evts, 255)), 1, 'OR ANALYZE ',ITPUB个人空间rm]'R)XlNlD5U,p
                                                 'ANALYZE ')) ||ITPUB个人空间~7MzA[-}8i5Z0b(k
decode (bitand(t.sys_evts, 262656), 512,ITPUB个人空间RZ@&E,B`;W
        decode(sign(bitand(t.sys_evts, 511)), 1, 'OR COMMENT ',ITPUB个人空间+Q9l6q;|.Y:\/D
                                                 'COMMENT ')) ||ITPUB个人空间v9]cu0Ro&w3^+_
decode (bitand(t.sys_evts, 263168), 1024,ITPUB个人空间5P9H9dn:b/ARu R,[
        decode(sign(bitand(t.sys_evts, 1023)), 1, 'OR GRANT ',ITPUB个人空间hJ'Km |
                                                  'GRANT ')) ||
rkA ?${0decode (bitand(t.sys_evts, 264192), 2048,ITPUB个人空间 MsIv:wy"N
        decode(sign(bitand(t.sys_evts, 2047)), 1, 'OR REVOKE ',
L5UPA*I{ml0                                                  'REVOKE ')) ||ITPUB个人空间JJ9i~a0{
decode (bitand(t.sys_evts, 266240), 4096,
d/Y0X0R;h%f8?pa,W0        decode(sign(bitand(t.sys_evts, 4095)), 1, 'OR TRUNCATE ',
l G0An%s0                                                  'TRUNCATE ')) ||
(H^}${~*vL!X$o0decode (bitand(t.sys_evts, 270336), 8192,
#mi3p-MB8nT0        decode(sign(bitand(t.sys_evts, 8191)), 1, 'OR RENAME ',ITPUB个人空间K"I/C?)klP!m"E4y$|
                                                  'RENAME ')) ||ITPUB个人空间{2`UIT
decode (bitand(t.sys_evts, 278528), 16384,ITPUB个人空间7{5C&a!oit.N#k3V9v(E
        decode(sign(bitand(t.sys_evts, 16383)), 1, 'OR ASSOCIATE STATISTICS ',ITPUB个人空间AcguE S4M%~
                                                   'ASSOCIATE STATISTICS ')) ||
#h*Rv;Q NJ0decode (bitand(t.sys_evts, 294912), 32768,ITPUB个人空间0|i&u.NaH2[+gL
        decode(sign(bitand(t.sys_evts, 32767)), 1, 'OR AUDIT ',ITPUB个人空间L0UyF:BSV9a
                                                   'AUDIT ')) ||ITPUB个人空间an H5BjOq
decode (bitand(t.sys_evts, 327680), 65536,ITPUB个人空间v a4_ Y"Y/Dq
        decode(sign(bitand(t.sys_evts, 65535)), 1,ITPUB个人空间@Oq F4`-dHW3d!x
               'OR DISASSOCIATE STATISTICS ', 'DISASSOCIATE STATISTICS ')) ||
W8K4?5G$B0decode (bitand(t.sys_evts, 393216), 131072,ITPUB个人空间3Ju S%_y;N@:]
        decode(sign(bitand(t.sys_evts, 131071)), 1, 'OR NOAUDIT ',
l t*qB5t1g)Jt0                                                    'NOAUDIT ')) ||
Go/T | BJ0decode (bitand(t.sys_evts, 262144), 262144,ITPUB个人空间)Z,D6wB}/u&].L;M8b;C
        decode(sign(bitand(t.sys_evts, 31)), 1, 'OR DDL ',
R,z"GfM;F;FV$m0                                                   'DDL ')) ||ITPUB个人空间?;H"\HJL
decode (bitand(t.sys_evts, 8388608), 8388608,ITPUB个人空间 f| Qmh/`v-T
        decode(sign(bitand(t.sys_evts, 8388607)), 1, 'OR SUSPEND ',
] C8Vn*E{9I*p(yw MV0                                                     'SUSPEND ')),ITPUB个人空间f6s C6QXe\U+|#T
'SYS',ITPUB个人空间 k#] gv$rpT1Y9b'h
'DATABASE        ',
A4p&QP$L+] a]!i0NULL,
,Ko"f/`s0NULL,ITPUB个人空间#vPJ!RB8z5?W#xP
'REFERENCING NEW AS '||t.refnewname||' OLD AS '||t.refoldname
'[U4Dy8`G QG:Z `0  || decode(bitand(t.property,32),32,' PARENT AS ' || t.refprtname,NULL),ITPUB个人空间B%O.t4`P_
t.whenclause,decode(t.enabled, 0, 'DISABLED', 1, 'ENABLED', 'ERROR'),ITPUB个人空间[#H x d~3] ~:d
t.definition,ITPUB个人空间6}7?*K^r6B3H,ru)M
decode(bitand(t.property, 2), 2, 'CALL',ITPUB个人空间u2DzA;b6]
                                 'PL/SQL     '),
PP,g7X1S3V0t.action#
R6eX ?j#m0from sys.obj$ trigobj, sys.trigger$ t, sys.user$ trigusrITPUB个人空间I2i:ryR$d'Ca7P
where (trigobj.obj#   = t.obj# andITPUB个人空间0gf@6WY)|6`KE0C
       trigobj.owner# = trigusr.user# and
8z)y%}~ O |&{U0       bitand(t.property, 63)    >= 8 and bitand(t.property, 63) < 16)ITPUB个人空间#?)R1X2{G,uI|
union all
q7oX:u9K9Vu-J0select trigusr.name, trigobj.name,ITPUB个人空间a6J*dR DfR0t;w
decode(t.type#, 0, 'BEFORE EVENT',
8F5Mk e5w0                2, 'AFTER EVENT',
cNWIc!QE0                   'UNDEFINED'),ITPUB个人空间*wAW+p5?&U
decode(bitand(t.sys_evts, 1), 1, 'STARTUP ') ||ITPUB个人空间 q$Cj2o!bN(w:P1T-jX
decode(bitand(t.sys_evts, 2), 2,
*fu IIC0       decode(sign(bitand(t.sys_evts, 1)), 1, 'OR SHUTDOWN ',
2s;K3[)Vy ZI:`;N@0                                               'SHUTDOWN ')) ||ITPUB个人空间/W-vu"D ^ P GH0xYD
decode(bitand(t.sys_evts, 4), 4,
Yh^kb F)E)bf0       decode(sign(bitand(t.sys_evts, 3)), 1, 'OR ERROR ',
+~0H*\9YPB9w0                                              'ERROR ')) ||
9j1e#Z3P+rQ0decode(bitand(t.sys_evts, 8), 8,ITPUB个人空间?&~L,`6i J#o` KD
       decode(sign(bitand(t.sys_evts, 7)), 1, 'OR LOGON ',
9S6bLl9g~0                                              'LOGON ')) ||
]qw }R-Q5U0decode(bitand(t.sys_evts, 16), 16,
-AU;{ M3z}:|0       decode(sign(bitand(t.sys_evts, 15)), 1, 'OR LOGOFF ',
,I;d9t;~s0                                               'LOGOFF ')) ||ITPUB个人空间8C H1CFF%B Wg
decode(bitand(t.sys_evts, 262176), 32,ITPUB个人空间:M&VRQ.PcY*[
       decode(sign(bitand(t.sys_evts, 31)), 1, 'OR CREATE ',
s e^Y"u+w(u{0                                               'CREATE ')) ||
@"}9nKGF,M&k0decode(bitand(t.sys_evts, 262208), 64,
og"w.Z)eb0       decode(sign(bitand(t.sys_evts, 63)), 1, 'OR ALTER ',
ir)r%{Y dH0                                               'ALTER ')) ||
`d+|-Vc3gp#X| J0decode(bitand(t.sys_evts, 262272), 128,ITPUB个人空间2]!_d:j V wn
       decode(sign(bitand(t.sys_evts, 127)), 1, 'OR DROP ',
C"i OD4Urc0                                                'DROP ')) ||
)W)ujN!pf[3e0decode (bitand(t.sys_evts, 262400), 256,ITPUB个人空间a8O{d5q(x
        decode(sign(bitand(t.sys_evts, 255)), 1, 'OR ANALYZE ',ITPUB个人空间r1r2?fXJ v"U0v
                                                 'ANALYZE ')) ||
O y$Po ` kJ0decode (bitand(t.sys_evts, 262656), 512,ITPUB个人空间:y#e6g!DZa$R W
        decode(sign(bitand(t.sys_evts, 511)), 1, 'OR COMMENT ',
{%ru[T+kg0                                                 'COMMENT ')) ||ITPUB个人空间'k/u)y$}YjN
decode (bitand(t.sys_evts, 263168), 1024,
dM|kI~Ux ~0        decode(sign(bitand(t.sys_evts, 1023)), 1, 'OR GRANT ',
jm4nIY!K:WO$mR0                                                  'GRANT ')) ||ITPUB个人空间V+r'Zy_7u7U
decode (bitand(t.sys_evts, 264192), 2048,
^9m @ X"T7W0        decode(sign(bitand(t.sys_evts, 2047)), 1, 'OR REVOKE ',
hf5@2kM}O0                                                  'REVOKE ')) ||
1Gl(dYA&B YZ"q:J0decode (bitand(t.sys_evts, 266240), 4096,
[ e]&\Z0        decode(sign(bitand(t.sys_evts, 4095)), 1, 'OR TRUNCATE ',
r M&t#_)s|0                                                  'TRUNCATE ')) ||ITPUB个人空间6G/TG}.G2f;p7KJ
decode (bitand(t.sys_evts, 270336), 8192,ITPUB个人空间u y:~K5{7T
        decode(sign(bitand(t.sys_evts, 8191)), 1, 'OR RENAME ',ITPUB个人空间tz#I(CM!l
                                                  'RENAME ')) ||
n I)@nH,r)y0decode (bitand(t.sys_evts, 278528), 16384,
z:a&tTR^,R,G0        decode(sign(bitand(t.sys_evts, 16383)), 1, 'OR ASSOCIATE STATISTICS ',
'Y+yO&vZ/vZ0                                                   'ASSOCIATE STATISTICS ')) ||
1? cQKj:r{/p0decode (bitand(t.sys_evts, 294912), 32768,
9N#XY6q8S0        decode(sign(bitand(t.sys_evts, 32767)), 1, 'OR AUDIT ',ITPUB个人空间gK9^q(R@*]g@&?r.R
                                                   'AUDIT ')) ||
A.D:d:KX r)s[]:h5b0decode (bitand(t.sys_evts, 327680), 65536,
!J:r,k W xpl0        decode(sign(bitand(t.sys_evts, 65535)), 1,ITPUB个人空间~5v \)HC([ e+Z
               'OR DISASSOCIATE STATISTICS ', 'DISASSOCIATE STATISTICS ')) ||
.ah!N~A M8E)P:J I0decode (bitand(t.sys_evts, 393216), 131072,ITPUB个人空间c#HYdhV
        decode(sign(bitand(t.sys_evts, 131071)), 1, 'OR NOAUDIT ',
.j#e7n%cy ZR0                                                    'NOAUDIT ')) ||ITPUB个人空间{,rK8C/bd
decode (bitand(t.sys_evts, 262144), 262144,ITPUB个人空间5S8[;A|6eyi U/^F)l
        decode(sign(bitand(t.sys_evts, 31)), 1, 'OR DDL ',ITPUB个人空间N+j.o.D"[T6^G M)m5O
                                                   'DDL ')) ||
qr'b0h qv$e0decode (bitand(t.sys_evts, 8388608), 8388608,
+PJAO7g+Vs0        decode(sign(bitand(t.sys_evts, 8388607)), 1, 'OR SUSPEND ',
6QAF*\2O-])PR0                                                     'SUSPEND ')),
ITPUB个人空间x0`$[E,G*p&Oa)n
tabusr.name,
M6W*cKj FT*Y0'SCHEMA',ITPUB个人空间Z5{WXA8KK ]$Zp+`
NULL,ITPUB个人空间0vzn0B_.L'K N
NULL,
*M1R.D9~g0'REFERENCING NEW AS '||t.refnewname||' OLD AS '||t.refoldname,ITPUB个人空间;f?UN"Zft
t.whenclause,decode(t.enabled, 0, 'DISABLED', 1, 'ENABLED', 'ERROR'),ITPUB个人空间 z-]kq^"jSd
t.definition,ITPUB个人空间f0jvDf.K
decode(bitand(t.property, 2), 2, 'CALL',ITPUB个人空间W"sS(k s9L6_3{le6R7Q`
                                 'PL/SQL     '),ITPUB个人空间iZCR+K9}
t.action#ITPUB个人空间 V^,a;Uwf
from sys.obj$ trigobj, sys.trigger$ t, sys.user$ tabusr, sys.user$ trigusrITPUB个人空间o%E$ry4m+q$o8L
where (trigobj.obj#   = t.obj# and
9vC4hYp0       trigobj.owner# = trigusr.user# and
+j2xVc:d.Z$h~9Y0       bitand(t.property, 63) >= 16 and bitand(t.property, 63) < 32 and
J+`)g9WQT!n9R b0       tabusr.user# = t.baseobject)
`j/lP-_ f'NOb7b0union all
1?3EPwna8\%B0select trigusr.name, trigobj.name,
u9p i,Z!i0decode(t.type#, 0, 'BEFORE STATEMENT',
og6u4K~"w;x0               1, 'BEFORE EACH ROW',ITPUB个人空间"z,c3fd C _7R%n
               2, 'AFTER STATEMENT',ITPUB个人空间A5x*S,f!S xAa
               3, 'AFTER EACH ROW',
g2M!eC*Bcavt0               4, 'INSTEAD OF',ITPUB个人空间:h0v;z#B7W o E6HI
               'UNDEFINED'),ITPUB个人空间-iX:} }$O
decode(t.insert$*100 + t.update$*10 + t.delete$,ITPUB个人空间JC}3s I)P
                 100, 'INSERT',
G;W)E7J4Q1fd0                 010, 'UPDATE',
Ug ]drn0                 001, 'DELETE',
,~IvU@7^0                 110, 'INSERT OR UPDATE',
(g ~7fzse0                 101, 'INSERT OR DELETE',
9ao g#~gd(P(VT0                 011, 'UPDATE OR DELETE',
%A:q^^~3QF/L0                 111, 'INSERT OR UPDATE OR DELETE'
, 'ERROR'),ITPUB个人空间O F4|3T \l)B
tabusr.name,
pkSl5c:l9q9M+xu+h0decode(bitand(t.property, 1), 1, 'VIEW',ITPUB个人空间 E([_ f9@Z
                              0, 'TABLE',ITPUB个人空间V!g,q$^o e9H
                                 'UNDEFINED'),
)[NDL+EGJ']y k0i0tabobj.name, ntcol.name,ITPUB个人空间+x!E,qJG*s bM
'REFERENCING NEW AS '||t.refnewname||' OLD AS '||t.refoldname ||
wes!}&vr2Gr0  ' PARENT AS ' || t.refprtname,
|/U.|rt*N0t.whenclause,decode(t.enabled, 0, 'DISABLED', 1, 'ENABLED', 'ERROR'),ITPUB个人空间kqflp8K*l
t.definition,ITPUB个人空间N4E4S$pv0H+yt g;L
decode(bitand(t.property, 2), 2, 'CALL',
O.]0s9p"g;i A0                                 'PL/SQL     '),ITPUB个人空间2eq&bc^zl@
t.action#ITPUB个人空间2?b8O8iM
from sys.obj$ trigobj, sys.obj$ tabobj, sys.trigger$ t,ITPUB个人空间SkYvit4T2?#~W
     sys.user$ tabusr, sys.user$ trigusr, sys.viewtrcol$ ntcolITPUB个人空间{y/L ^up
where (trigobj.obj#   = t.obj# andITPUB个人空间'~:L|/B7F!V,Tr
       tabobj.obj#    = t.baseobject and
i2D]]~0       tabobj.owner#  = tabusr.user# andITPUB个人空间I E2H\ { fG e
       trigobj.owner# = trigusr.user# andITPUB个人空间\*IXkg8B
       t.nttrigcol    = ntcol.intcol# andITPUB个人空间f i)d,f!Zz k%}
       t.nttrigatt    = ntcol.attribute# and
4RiY1C lOV7l*g0       t.baseobject   = ntcol.obj# andITPUB个人空间z3F/?2K(f/sU
       bitand(t.property, 63)     >= 32)

其实只要看一下DBA_TRIGGERS视图的SQL就清楚了。

观察上面红色部分,由于触发器事件可以由多个事件组合,Oracle在存放的时候将不同事件转化为不同的数位存储,这样通过一个字段就可以表示多个事件的组合信息。而在视图显示的时候,通过DECODE判断数位,对于第一个事件显示事件名称和空格,以后出现的事件直接在后面追加OR和事件名称及空格。Oracle这里添加空格是为了方便处理多个事件组合的情况。

而对于DML的情况,由于一共可能产生的组合只有7种,Oracle将所有可能依次列出,因此就没有添加空格,代码参考上面蓝色部分。

看来不起眼的一个空格,Oracle在处理上也是经过思考的,不过个人认为,如果在红色代码的外面嵌套一层RTRIM,那么就真的完美了。

 


TAG:

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

Open Toolbar