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


    监控表的使用有那么几种方式
    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

    作者:Daaprk
    可以转载,但必须以超链接形式标明文章原始出处和作者信息.
  • 相关阅读:
    使用事务和SqlBulkCopy导入大批量数据
    Windows Server中禁止Administrator用户登录远程桌面
    SQL和C#的常用时间日期处理
    转:SQL Server数据库查询速度慢的原因
    火把节之夜,想发飙
    判断一个字符串是否为空
    .net中的using批注
    [转帖]删除鼠标右键的“用阿里旺旺打开此文件”的命令
    近凌晨12点却毫无睡意
    SQL SERVER取得汉字的拼音缩写
  • 原文地址:https://www.cnblogs.com/dap570/p/1783311.html
Copyright © 2020-2023  润新知