使用触发器来监控表的使用情况

   
     
监控表的使用有那么几种方式
1 . 审计,10g的颗粒度已经很细了,磁盘空间是个问题.
2 . 还有就是查看 FLASHBACK_TRANSACTION_QUERY,但是这个与undo_retention以及undo大小有关系,表大的话,查这个很费劲.
3 . 再来就是触发器,高并发的情况下要谨慎使用.

闲话不多说,做个用触发器监控数据表使用的例子.
先建立测试表.

create table TGLOG
(
USERCODE
VARCHAR2 ( 25 ) not null ,
TIME DATE
not null ,
TYPE
VARCHAR2 ( 25 ) not null ,
IP
VARCHAR2 ( 25 ) not null ,
RAMARK1
VARCHAR2 ( 25 ) not null ,
REMARK2
VARCHAR2 ( 225 )
);

create table TGTEST
(
USERCODE
VARCHAR2 ( 10 ) not null ,
LMAGENTID
VARCHAR2 ( 25 ) not null ,
REMARK
VARCHAR2 ( 225 ),
VALIDSTATUS
VARCHAR2 ( 1 ) not null ,
FLAG
VARCHAR2 ( 1 )
);

目标:对TGTEST的inser,
update , delete 都记录下相应信息
(操作类型,username,
timestamp ,ip,machine,module),并且只跟踪usercode = ' 0000000000 ' 的数据.

CREATE OR REPLACE TRIGGER tg_trace_tab_tgtest
AFTER
UPDATE or delete or insert ON TGTEST
REFERENCING NEW
AS New OLD AS Old
FOR EACH ROW
DECLARE
v_type
VARCHAR2 ( 500 );
old_value
int ;
new_value
int ;
BEGIN
v_type:
= '' ;

old_value:
= :old.usercode;
new_value:
= :new.usercode;

if (old_value = ' 0000000000 ' or new_value = ' 0000000000 ' ) then

IF inserting THEN
v_type:
= ' INSERT ' ;
ELSIF updating
THEN
v_type:
= ' UPDATE ' ;
ELSIF deleting
THEN
v_type:
= ' DELETE ' ;
END IF ;
INSERT INTO tglog
select username,sysdate,v_type,SYS_CONTEXT( ' USERENV ' , ' IP_ADDRESS ' ),machine,program
from v$session where AUDSID = USERENV( ' SESSIONID ' );
end if ;

END ;
/

OK,可以开始测试了.

INSERT INTO tgtest SELECT ' 0000000000 ' , ' 22 ' , ' 333 ' , ' 1 ' , ' 1 ' FROM dual ;
COMMIT ;
UPDATE tgtest SET flag = 0 WHERE usercode = ' 0000000000 ' ;
COMMIT ;
DELETE FROM tgtest WHERE usercode = ' 0000000000 ' ;
COMMIT ;

SELECT * FROM tglog ORDER BY TIME ASC ;

USERCODE TIME TYPE IP RAMARK1 REMARK2
-- -------- ------------------- ---------- ------------------------- ------------------------- --------------------
FUDB 2010 - 07 - 22 17 : 20 : 20 111 192.168 . 3.188 MSHOME\TPADGERRARD plsqldev.exe
FUDB
2010 - 07 - 22 17 : 38 : 34 INSERT 192.168 . 3.188 MSHOME\TPADGERRARD plsqldev.exe
FUDB
2010 - 07 - 22 17 : 38 : 59 INSERT 192.168 . 3.188 MSHOME\TPADGERRARD plsqldev.exe
FUDB
2010 - 07 - 22 17 : 39 : 34 INSERT 192.168 . 3.188 MSHOME\TPADGERRARD plsqldev.exe
FUDB
2010 - 07 - 22 17 : 41 : 03 UPDATE 192.168 . 3.188 MSHOME\TPADGERRARD plsqldev.exe
FUDB
2010 - 07 - 22 21 : 15 : 20 DELETE 192.168 . 3.188 MSHOME\TPADGERRARD plsqldev.exe
FUDB
2010 - 07 - 22 21 : 15 : 56 INSERT 192.168 . 3.188 MSHOME\TPADGERRARD plsqldev.exe
FUDB
2010 - 07 - 22 21 : 16 : 40 DELETE 192.168 . 3.188 MSHOME\TPADGERRARD plsqldev.exe
FUDB
2010 - 07 - 22 21 : 32 : 20 INSERT 192.168 . 3.49 WORKGROUP\MESORACLE sqlplus.exe

你可能感兴趣的:(触发器)