zoukankan      html  css  js  c++  java
  • Oracle触发器实现监控某表的CRUD操作

    前提:请用sys用户dba权限登录

    1.创建一个表来存储操作日志

    create table trig_sql(
             LT DATE not null primary key,
             SID NUMBER,
           SERIAL#       NUMBER,
             USERNAME       VARCHAR2(30),
             OSUSER    VARCHAR2(64),
             MACHINE       VARCHAR2(32),
             TERMINAL       VARCHAR2(16),
             PROGRAM       VARCHAR2(64),
             SQLTEXT       VARCHAR2(2000),
             STATUS    VARCHAR2(30),
             CLIENT_IP       VARCHAR2(60),
    );

    2.创建索引(可能已经自动创建,如果已经创建则忽略此步骤)

    create index  idx_time on trig_sql (LT);

    3.创建触发器

    IN_FIRST_PAGE_OTHER:我们要监控的表

    create or replace trigger pri_test
      after insert or update or delete on IN_FIRST_PAGE_OTHER for each row
    DECLARE
       PRAGMA AUTONOMOUS_TRANSACTION;
    BEGIN
      IF inserting THEN
        INSERT INTO trig_sql
            select sysdate,s.SID, s.SERIAL#, s.USERNAME, s.OSUSER,
                   s.MACHINE, s.TERMINAL, s.PROGRAM, q.sql_text line,
                   'INSERT',
                  sys_context('userenv','ip_address')
              from v$sql q, v$session s
             where s.audsid=(select userenv('SESSIONID') from dual)
               and s.prev_sql_addr=q.address
               AND s.PREV_HASH_VALUE = q.hash_value;
        COMMIT;
      ELSIF deleting  then
          INSERT INTO trig_sql
               select sysdate,s.SID, s.SERIAL#, s.USERNAME, s.OSUSER,
                           s.MACHINE, s.TERMINAL, s.PROGRAM, q.sql_text line,
                           'DELETE',
                           sys_context('userenv','ip_address')
                 from v$sql q, v$session s
                where s.audsid=(select userenv('SESSIONID') from dual)
                 and s.prev_sql_addr=q.address
                 AND s.PREV_HASH_VALUE = q.hash_value;
        COMMIT;
      ELSIF updating then
        INSERT INTO trig_sql
             select sysdate,s.SID, s.SERIAL#, s.USERNAME, s.OSUSER,
                         s.MACHINE, s.TERMINAL, s.PROGRAM, q.sql_text line,
                         'UPDATE',
                         sys_context('userenv','ip_address')
               from v$sql q, v$session s
              where s.audsid=(select userenv('SESSIONID') from dual)
               and s.prev_sql_addr=q.address
               AND s.PREV_HASH_VALUE = q.hash_value;
        COMMIT;
       END IF;
    END;

    4.查询监控记录

    对要监控的表进行操作后,可以查到日志信息

    select t.lt 操作时间,
           t.sid 会话唯一标识,
           t.serial# 唯一序列号,
           t.username 数据库用户, 
           t.osuser 客户端操作系统用户名,
           t.machine 客户端全名,
           t.terminal 客户端名,
           t.program 客户端应用程序,
           t.sqltext SQL文本,
           t.status 增删改,
           t.client_ip IP地址 from trig_sql t   where 
           to_char(t.lt, 'yyyy-mm-dd hh24:mi:ss')     
    BETWEEN   to_char(TO_DATE('2018-06-01 16:42:10','yyyy-mm-dd hh24:mi:ss'),'yyyy-mm-dd hh24:mi:ss') 
    AND to_char(TO_DATE('2018-06-01 16:42:11','yyyy-mm-dd hh24:mi:ss'),'yyyy-mm-dd hh24:mi:ss') 
  • 相关阅读:
    SpringMVC-注解式控制器详解-SpringMVC强大的数据绑定(1)
    SpringMVC-注解式控制器详解-SpringMVC强大的数据绑定
    关于BI商业智能的“8大问”|一文读懂大数据BI
    关于BI商业智能的“8大问”|一文读懂大数据BI
    符号表
    高性能MYSQL读书笔记1
    perl 打包成PAR包 类似JAR包
    perl 包函数变动 需要重新打包
    第一章 数据引用与匿名存储
    换部门与看录像——北漂18年(90)
  • 原文地址:https://www.cnblogs.com/lm970585581/p/9138050.html
Copyright © 2011-2022 走看看