我需要对表 table_A 进行跟踪,想知道有谁,在什么时间对该表做什么操作。请问该触发器如何写?create or replace tirgger tri_table_A 
before delete or insert table_a
begin  ????????????????  如何写?谢谢啊。
包括 当前 删除、插入 的SQL语句,客户端IP地址, 登陆oracle用户名,程序名,日期。
end;谢谢啊。

解决方案 »

  1.   

    oracle本身就有这个表,具体的表不记得了,自己查一下
      

  2.   

    客户端IP地址, 登陆oracle用户名,程序名,日期
    可以从v$session ,v$session_connect_info视图中查寻
    当前 删除、插入 的SQL语句恐怕有点难,v$sqltext,v$sql_workarea中的sql都是没有变量值的
    把关键的数据列的修改前后的数据连同主键存到审核的表里是比较可行的
      

  3.   

    mu_gua(木瓜) ,你说的那些表我都知道。
    问题时  当前 删除、插入 的SQL语句  我不能确定,比较郁闷。哈哈
    你能帮忙想出来?
      

  4.   

    以前有篇文章讲过:
    怎样用trigger + logminner, 把执行删除表或记录的 sql语句和计算机名,IP地址 找出来...翻不到啦~ 帖子太多
      

  5.   

    在用sql做是比较难的
    在用应用程序做就容易多了,变量邦定不是问题,能取到删除、插入 的SQL语句得精确值
      

  6.   

    可以在v$sql上作触发器,他的address可以和v$session的sql_address连接
    先判断instr(sql_text,'your_table_name')
    这就判断使操作你的表了
    然后if instr(lower(sql_text),'insert')>0插入
    等等。不过truncate不知道能不能记下来……
      

  7.   

    木瓜,你的办法不可行。因为不确定是哪个应用程序,可能很多,并且不是我们开发的。
    AFIC(AFIC) ,你的这个办法好像可以,我现在想看看有没有更直接的办法。
      

  8.   

    AFIC(AFIC) 触发器是不能建立在视图上的吧!
      

  9.   

    create log_table(
    SID NUMBER(16),   
    SERIAL NUMBER(16),   
    MACHINE VARCHAR2(64) ,
    OSUSER VARCHAR2(30),   
    USERNAME VARCHAR2(30),
    PROGRAM VARCHAR2(48),
    LOGINTIME DATE
    SQL_TEXT VARCHAR2(200)
    );
    在trigger里写:
    declare
    LPRG VARCHAR2(48);
    LUSERNAME varchar2(30);
    LOSUSER   varchar2(30);
    LMACHINE  varchar2(64);
    LSID pls_integer;
    LSERIAL pls_integer;
    LSQLTEXT varchar2(200);
    begindbms_application_info.set_client_info(sys_context('userenv', 'ip_address'));select a.sid,a.serial#,a.machine,a.osuser,a.program,a.username, b.sql_text
    into LSID,LSERIAL,LMACHINE,LOSUSER,LPRG,LUSERNAME,LSQLTEXT from v$session a,v$sql b
    where sid=(select sid from v$mystat where rownum<2) and a.sql_hash_value=b.hash_value;insert into log_table(sid,serial,machine,osuser,username,program,logintime,sql_text)
    values (LSID,LSERIAL,LMACHINE,LOSUSER,LUSERNAME,LPRG,sysdate,LSQLTEXT);
    end;在log_table里查相关信息,ip地址在v$session里的client_info里查