有两个表,比如Emp(eID,sName), EmpDesc(eID,e1,e2,e3)
两表关联,外键是eID当用户插入、修改、删除员工信息的时候,会同时操作以上两个表需要建立一个Trigger,当以上两个表有Insert/Update/Delete操作的时候,记录下信息到EmpAudit(eID,sName,e1,e2,e3,user,sysdate)表 请问该如何建立Trigger呢 ?谢谢

解决方案 »

  1.   

    create or replace trigger 表名_trigger
    before insert 
    or update
    or delete
    on 表名
    for each row
    begin
     insert into 表名(......)
    end;
      

  2.   

    每个表建立一个trigger,作为两条记录分别插入到EmpAudit中可以,但似乎无法将两个表触发的数据作为一条记录插入到EmpAudit表吧
      

  3.   

    主表插入时插入细表插入时更新EmpAudit
    主表细表更新就更新
    主表delete不知道了 难道你要delete EmpAudit中相应的内容?
      

  4.   

    楼主的意思可能是要对两个表进行操作审计,
    但应在操作表中记录操作类型(optype),比如insert、update、delete等
    在两个表上分别建立触发器,如:
    CREATE OR REPLACE TRIGGER tr_iud_emp
      AFTER INSERT OR UPDATE OR DELETE ON emp
      FOR EACH ROW
    DECLARE
      v_opType VARCHAR2(20);
    BEGIN
      IF inserting THEN
        INSERT INTO EmpAudit (eid, sname, optype) VALUES (:new.eid, :new.sname, 'INSERT');
      ELSIF updating THEN
        INSERT INTO EmpAudit (eid, sname, optype) VALUES (:new.eid, :new.sname, 'UPDATE');
      ELSE
        INSERT INTO EmpAudit (eid, sname, optype) VALUES (:old.eid, :old.sname, 'DELETE');
      END IF;
    END tr_iud_emp;
    /
    CREATE OR REPLACE TRIGGER tr_iud_empdesc
      AFTER INSERT OR UPDATE OR DELETE ON empdesc
      FOR EACH ROW
    DECLARE
      v_opType VARCHAR2(20);
    BEGIN
      IF inserting THEN
        INSERT INTO EmpAudit
          (eid, e1, e2, e3, optype)
        VALUES
          (:new.eid, :new.e1, :new.e2, :new.e3, 'INSERT');
      ELSIF updating THEN
        INSERT INTO EmpAudit
          (eid, e1, e2, e3, optype)
        VALUES
          (:new.eid, :new.e1, :new.e2, :new.e3, 'UPDATE');
      ELSE
        INSERT INTO EmpAudit
          (eid, e1, e2, e3, optype)
        VALUES
          (:old.eid, :old.e1, :old.e2, :old.e3, 'DELETE');
      END IF;
    END tr_iud_empdesc;
    /
      

  5.   

    本帖最后由 wildwave 于 2010-04-20 17:11:47 编辑
      

  6.   


    这么做可以实现,但需要在第二个触发器中先根据eid到emp表查找name 然后再插入到EmpAudit表中,
    而不要第一个触发器。 也就是说只在empdesc表上建立trigger就可以了。谢谢了阿!
      

  7.   

    谢谢上面的各位的讲解,还有个需求,使用trigger不知道该如何实现,还请各位兄弟姐妹踊跃帮忙:业务表:
    Emp(eID,sName)     --eID is primary key
    EmpDesc(eID,edID)  --edID is primary key
    日志表:
    EmpAudit(eaID,eID,sName)  --eaID is primary key
    EmpAuditSub(easID,eaID,edIDstr,sName) --easID is primary key
    其中edIDstr字段:是一个字符串,如"1+2+3"
    业务处理:
    insert into Emp(eID,sName) values (1,'mike');
    insert into EmpDesc(eID,e1) values(1,1);
    insert into EmpDesc(eID,e1) values(1,2);
    insert into EmpDesc(eID,e1) values(1,3);
    --(这四条语句作为一个事务提交。)
    想通过trigger实现纪录日志的功能,将上面的操作记录的下面的日志表中:
    例如我要执行某种业务,会对Emp和EmpDesc表插入上面的四条记录,
    我想通过trigger得到的结果是:
    EmpAudit表一条记录,结果为 1,1,mike
    EmpAuditSub表一条记录, 结果为 1,1,1+2+3,mike如果用procedure来在代码中调用实现起来会很简单,但如果用trigger来做,就很难实现了阿。在Emp表作trigger,则取不到EmpDesc表中的e1字段的值;
    如果在EmpDesc表作trigger,则又无法将三条记录的e1字段组合成一个字符串存成一条记录,并且也无法获取到EmpAudit表的主键eaID,很是头疼。