2015-08-26 97 views
-1

是否有任何方法可以從Oracle觸發器中獲取將要執行的SQL語句,例如,在更新觸發器表之前我得到了一個Oracle觸發器更新一組x = y獲取將由Oracle觸發器執行的SQL語句

+0

我真的不這麼認爲。我想你可能會有更多的運氣開始一個新的問題與你的問題是什麼,也許有一個不同的解決方案。 –

+0

我需要將所有事務的日誌稍後發送到遠程服務器 – masker

+0

這是否有用? http://stackoverflow.com/questions/12805181/oracle-trigger-log –

回答

2

是的,不要使用觸發器。

相反,在該表上創建一個將覆蓋任何DML的細粒度審計(FGA)策略。

內FGA的策略處理程序,您可以訪問

SYS_CONTEXT('userenv','CURRENT_SQL') 

但是你必須使用類似FGA否則這將是null

下面是一個例子:

CREATE TABLE matt_a (a NUMBER); 

CREATE OR REPLACE PACKAGE matt_fga_handler IS 
    PROCEDURE handle_it (schema_name VARCHAR2, table_name VARCHAR2, policy_name VARCHAR2); 
END matt_fga_handler; 

CREATE OR REPLACE PACKAGE BODY matt_fga_handler IS 
    PROCEDURE handle_it (schema_name VARCHAR2, table_name VARCHAR2, policy_name VARCHAR2) IS 
    BEGIN 
    dbms_output.put_line('SQL was: ' || SYS_CONTEXT('userenv','CURRENT_SQL')); 
    END; 
END matt_fga_handler; 


--BEGIN 
-- DBMS_FGA.DROP_POLICY('APPS','MATT_A','MY_NEW_POLICY'); 
--END; 

BEGIN 
    DBMS_FGA.ADD_POLICY(
    object_schema => 'APPS', 
     object_name => 'MATT_A', 
     policy_name => 'MY_NEW_POLICY', 
     audit_condition => '1=1', 
     audit_column => 'A', 
     handler_schema => 'APPS', 
     handler_module => 'MATT_FGA_HANDLER.handle_it', 
     enable => true, 
     statement_types => 'INSERT, UPDATE, DELETE, SELECT' 
    ); 
END; 

-- Run this to test it (make sure SERVEROUT is ON to see the results!) 
insert into matt_a (a) SELECT rownum FROM DUAL CONNECT BY ROWNUM <= 15;