现想对指定用户下的指定表都作一个操作记录,有一个logs表,
字段          类型
id          number
objid       varchar2(50)   --操作表的ID字段
objname     varchar2(20)   --操作表的名称
optione      varcahr2(20)   --操作类型(增删改)
createtime  date           --logs记录创建时间需求就是,创建一个触发器,当对用户下的指定表进行增删改时,就对logs表增加一条操作记录。网上搜了很久都没有找到所要的答案,不知如何能自动得知操作表的ID号及正在进行的是那种类型的操作。

解决方案 »

  1.   


    create or replace trigger tr 
    after update or delete or insert 
    on t
    for each row
    begin
    if inserting then
    insert into logs  values(:new.id,:new.objid,:new.objname,'insert',sysdate);
    elsif updating then
    insert into logs  values(:old.id,:old.objid,:old.objname,'update',sysdate);
    elsif deleting then
    insert into logs  values(:old.id,:old.objid,:old.objname,'delete',sysdate);
    end if;
    end;
      

  2.   


    谢谢你的读贴,不过你这个触发器,并不能执行呀!会报错的ORA-04098
      

  3.   

    报这个错,应该是你插入LOG表的字段类型不匹配造成,检查一下类型.
      

  4.   

    create or replace trigger tr_test 
    after update or delete or insert 
    on t_test 
    for each row 
    begin 
      if inserting then 
      insert into t_logs  values(seq_logid.nextval,:old.objid,:old.objname,'insert',sysdate); 
      elsif updating then 
      insert into t_logs  values(seq_logid.nextval,:old.objid,:old.objname,'update',sysdate); 
      elsif deleting then 
      insert into t_logs  values(seq_logid.nextval,:old.objid,:old.objname,'delete',sysdate); 
      end if; 
    end; logs表我是按前面所说的字段类型来建的。其中seq_logid.nextval是oracle的序列号来的。一执行insert就报ora-04098的错,请问如何解决呢?
    在线等....谢谢!
      

  5.   

    另,我想问一下old.objid及old.objname分别是什么?
      

  6.   

    更新之前的记录的值,old就是原来记录,new就是更新后的记录,insert,update才会有值,old,new是默认的也可能自定义,如下
    for each row 
    referencing new as newname old as oldname
      

  7.   

    你的意思是要在每个表上都建立一个触发器,如1楼所言,你再每种情况下写上你要执行的INSERT语句就好了!
      

  8.   

    字段          类型 
    id          number 
    objid      varchar2(50)  --操作表的ID字段 
    objname    varchar2(20)  --操作表的名称 
    optione      varcahr2(20)  --操作类型(增删改) 
    createtime  date          --logs记录创建时间 创建表logscreate or replace trigger tr_test 
    after update or delete or insert 
    on t_test 
    for each row 
    begin 
      if inserting then 
      insert into t_logs  values(seq_logid.nextval,:old.id,'t_test','insert',sysdate); 
      elsif updating then 
      insert into t_logs  values(seq_logid.nextval,:old.id,'t_test','update',sysdate); 
      elsif deleting then 
      insert into t_logs  values(seq_logid.nextval,:old.id,'t_test','delete',sysdate); 
      end if; 
    end; 
    多谢谢1楼及7楼的,按7楼的所言,明白了old.xx的意思,所有将old.objid改为old.id,由于我更改的表里没有指定表名,所以就直接写死了。谢谢~