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') 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM