oracle怎么捕获表上的DML语句(不包括select)语句)

时间:2021-09-02 14:56:41

可以采用dml触发器,如

  CREATE OR REPLACE TRIGGER tr_capt_sql

  BEFORE DELETE OR INSERT OR UPDATE

  ON manager.test

  DECLARE

  sql_text ora_name_list_t;

  state_sql capt$sql.sql_text%TYPE;

  BEGIN

  FOR i IN 1..ora_sql_txt(sql_text) LOOP

  state_sql := state_sql || sql_text(i);

  END LOOP;

  INSERT INTO capt$sql(login_user,capt_time,ip_address,audsid,owner,table_name,sql_text)

  VALUES(ora_login_user,sysdate,sys_context('USERENV','IP_ADDRESS'),

  userenv('SESSIONID'),'MANAGER','TEST',state_sql);

  EXCEPTION

  WHEN OTHERS THEN

  sp_write_log('Capture DML Exception:'||SQLERRM);

  END tr_capt_sql;

  在创建以上触发器时要注意几点

  1、必须创建一个capt$sql的表,用来记录ddl的记录

2、sp_write_log原本是一个写日志的过程,可以置换为自己的需要,如null跳过。