-1
是否有任何方法可以從Oracle觸發器中獲取將要執行的SQL語句,例如,在更新觸發器表之前我得到了一個Oracle觸發器更新一組x = y獲取將由Oracle觸發器執行的SQL語句
是否有任何方法可以從Oracle觸發器中獲取將要執行的SQL語句,例如,在更新觸發器表之前我得到了一個Oracle觸發器更新一組x = y獲取將由Oracle觸發器執行的SQL語句
是的,不要使用觸發器。
相反,在該表上創建一個將覆蓋任何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;
我真的不這麼認爲。我想你可能會有更多的運氣開始一個新的問題與你的問題是什麼,也許有一個不同的解決方案。 –
我需要將所有事務的日誌稍後發送到遠程服務器 – masker
這是否有用? http://stackoverflow.com/questions/12805181/oracle-trigger-log –