有趣的触发器事件
上一篇 / 下一篇 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'NRiT/X#~%H
ALTER OR RENAME
3M T f
iM3d0INSERT OR UPDATE OR DELETEITPUB个人空间"IL#@jrC-Z7U
INSERT OR UPDATEITPUB个人空间*Z$?;}/{v(Y'b-C
DELETE
r1sD]`)_4{$^0UPDATE
YM.o:sf0TRUNCATEITPUB个人空间;WUxv i.{F_+[a
CREATEITPUB个人空间:ANf!D j|8v y
ALTERITPUB个人空间3J8Sg!M
~o;}[.],P
CREATE OR ALTER
X;Hu{'H _0INSERT
(Whb2khc0STARTUP
D@Fc5C.|%d-p$v0DROP OR TRUNCATEITPUB个人空间NJkKXB2V@
SHUTDOWN
已选择15行。
下面检查数据库中触发事件为SHUTDOWN的触发器有哪些:
SQL> SELECT OWNER, TRIGGER_NAME
TM5^:d2LNI3M0 2 FROM DBA_TRIGGERS
jN3FMK9`-`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个人空间Z Y&U6zxqS
------------------------------ ----------------------------
-w,r,M@1{^$Z*w+V!L9e0SYS AURORA$SERVER$SHUTDOWNITPUB个人空间(oo,\2Y8\9z J
SYS OLAPISHUTDOWNTRIGGER
触发器果然存在,莫非所有的触发事件后面都添加了不可见字符:
SQL> SELECT DISTINCT TRIGGERING_EVENT || '.'
o
tfKM'QB0 2 FROM DBA_TRIGGERS;
TRIGGERING_EVENT||'.'
dN
z$f;ve(|2hY0------------------------------------------------------
Z:YZ\nx)BEXu0TRUNCATE .
,S^KT
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{
iOd9t-Kt0UPDATE OR DELETE.ITPUB个人空间[.r-s0Af!Z-e
DROP OR TRUNCATE .
1{.r*~.L5N;FK$m0t0STARTUP .ITPUB个人空间A(cp._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.gCzw E
-------------------------------------------------------------------------------ITPUB个人空间9X(p"Z9h
T!Bd
select trigusr.name, trigobj.name,ITPUB个人空间]d
Nkb Hd
decode(t.type#, 0, 'BEFORE STATEMENT',ITPUB个人空间A!_&UvMu
A$t
1, 'BEFORE EACH ROW',ITPUB个人空间Q"?!din2UyU
2, 'AFTER STATEMENT',
u@pt%^;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/qt]0 001, 'DELETE',
]L/~'x;vf0 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#A sH0 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个人空间n J|*Hq&O^QT c
t.definition,ITPUB个人空间%b
?HVE!^\#G9D
decode(bitand(t.property, 2), 2, 'CALL',
'Tz-h3^
aX [$R-Xm0 'PL/SQL '),