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') 
  • 相关阅读:
    用Processing生成屏保(二)
    NTFS文件系统
    用processing生成屏保程序
    用processing画李萨如曲线
    processing模拟三角级数合成方波过程
    express 设置 cookie 以及 httpOnly
    vue 使用 axios 时 post 请求方法传参无法发送至后台
    微信小程序访问后台出现 对应的服务器证书无效。控制台输入 showRequestInfo() 可以获取更详细信息。
    微信长按识别二维码,在 vue 项目中的实现
    vue-cli 构建的 Vue 项目用 localhost 加 端口 能访问,但是切换到 ip 加 端口 就不能访问
  • 原文地址:https://www.cnblogs.com/lm970585581/p/9138050.html
Copyright © 2011-2022 走看看