前提:請用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')