写一个triger,实现如下功能,
有emp和emp2两张表,
当emp表发生插入,更新和删除时,复制emp的资料到emp2表.
就是保持emp表和emp2表的一致性.
头痛ing...求助...

解决方案 »

  1.   

    这个又不难
    insert的时候,同样INSERT一条到表2去
    update后,同样update表2
    delete一样
      

  2.   

    这些动作是由一个程序控制的,所以不能在程序里直接update另张表,只能由triger来实现...
      

  3.   

    我目前写到这里,这两张表没有主键,
    当第一张表更新时,当作:new条件,将第二张表的资料:old当做where条件,对第二张表进行update.
    具体怎么写begin后面的还米想好....痛苦....
      

  4.   

    用物化视图吧。你都没的主键,有主键就很简单了。
    if inseting..
    if updating..
    if deleting..
      

  5.   


    create or replace trigger myTrigger
    after insert or update or delete on emp
    for each row
    begin
     delete from emp2;
     insert into emp2 as select * from emp;
    end;
      

  6.   

    额...必须用triger...客户的要求...
      

  7.   

    呵呵,偷懒!改进吓
    [ID]为emp的主键create or replace trigger myTrigger 
    before insert or update or delete on emp 
    for each row 
    begin 
    if inserting then
      insert into emp2 as select * from emp where id=:new.id;
     elsif updating then
       delete from emp2 where select * from emp where id=:new.id;
       insert into emp2 as select * from emp where id=:new.id;
      else 
        delete from emp2 where select * from emp where id=:old.id;
       end if;
      

  8.   


    create or replace trigger myTrigger 
    before insert or update or delete on emp 
    for each row 
    begin 
    if inserting then
      insert into emp2 as select * from emp where id=:new.id;
     else if updating then
       delete from emp2 where select * from emp where id=:new.id;
       insert into emp2 as select * from emp where id=:new.id;
      else 
        delete from emp2 where select * from emp where id=:old.id;
       end if;
    end
      

  9.   

    呵呵~~我用update写了~~triger是挂在emp表上的~~
    帮我看看这样写ok不?~create or replace trigger NLTrigger
    before insert or update or delete
    for each row
    begin
         UPDATE emp2
         SET CO=:NEW.CO,
             DtLvDp=:NEW.DtLvDp,
             DtCyc=:NEW.DtCyc,
             DlvDat=:NEW.DlvDat,
             PmCen=:NEW.PmCen,
             CnsmMtsNo=:NEW.CnsmMtsNo,
             CnsmNtwgt=:NEW.CnsmNtwgt,
             ROne=:NEW.ROne,
             RTwo=:NEW.RTwo,
             XtOutMtNoOne=:NEW.XtOutMtNoOne,
             XtOutMtNoTwo=:NEW.XtOutMtNoTwo,
             ShPrOne=:NEW.ShPrOne,
             ShPrTwo=:NEW.ShPrTwo,
             MtzStk=:NEW.MtzStk,
             TxEmp=:NEW.TxEmp,
             TxDat=:NEW.TxDat,
             TxTm=:NEW.TxTm
         WHERE
             CO=:OLD.CO,
             DtLvDp=:OLD.DtLvDp,
             DtCyc=:OLD.DtCyc,
             DlvDat=:OLD.DlvDat,
             PmCen=:OLD.PmCen,
             CnsmMtsNo=:OLD.CnsmMtsNo,
             CnsmNtwgt=:OLD.CnsmNtwgt,
             ROne=:OLD.ROne,
             RTwo=:OLD.RTwo,
             XtOutMtNoOne=:OLD.XtOutMtNoOne,
             XtOutMtNoTwo=:OLD.XtOutMtNoTwo,
             ShPrOne=:OLD.ShPrOne,
             ShPrTwo=:OLD.ShPrTwo,
             MtzStk=:OLD.MtzStk,
             TxEmp=:OLD.TxEmp,
             TxDat=:OLD.TxDat,
             TxTm=:OLD.TxTm
    end;
      

  10.   

    肯定不行呀
    第一:删除操作还会有:new这个虚表,你怎么通过更新删除一张表类,我期待你的想法?
    第二:你没有写操作对象,呵呵(before insert or update or delete on emp)-_-
      

  11.   


    第一:删除操作还会有:new这个虚表,你怎么通过更新删除一张表类,我期待你的想法? 
    米看懂撒意思...还有哦,上面的triger会报错...我加上了before insert or update or delete on emp,
    这句也会报错...郁闷...
      

  12.   


    第一:删除操作还会有:new这个虚表,你怎么通过更新删除一张表类,我期待你的想法? 
    米看懂撒意思...还有哦,上面的triger会报错...我加上了before insert or update or delete on emp,
    这句也会报错...郁闷...
      

  13.   


    第一:删除操作还会有:new这个虚表,你怎么通过更新删除一张表类,我期待你的想法? 
    米看懂撒意思...还有哦,上面的triger会报错...我加上了before insert or update or delete on emp,
    这句也会报错...郁闷...
      

  14.   

    比如我数据库中有一条记录
    0001,'xiaoluo',20;我引用他的ID时候你是不是用:old.id?
    现在我更新他。
    0001,'xiaohei',23;我引用他的ID时候你是不是用:new.id?
    如果是删除操作
    记录都删除了你:new.id引用的是什么?
    只有insert和update才可以用:old.XX和:new.XX
    删除就只可以用:old.XX
      

  15.   

    明白拉.呵呵,就是说对于状态插入,更新,删除,进行判断,然后进行操作.create or replace trigger NLTrigger
    before insert or update or delete on emp
    for each row
    begin
    if insert then
      insert into emp2 values (:NEW.CO,:NEW.DtLvDp,:NEW.DtCyc,:NEW.DlvDat,:NEW.PmCen,:NEW.CnsmMtsNo,
      :NEW.CnsmNtwgt,:NEW.ROne,:NEW.RTwo,:NEW.XtOutMtNoOne,:NEW.XtOutMtNoTwo,:NEW.ShPrOne,:NEW.ShPrTwo,:NEW.MtzStk,
      :NEW.TxEmp,:NEW.TxDat,:NEW.TxTm);
     else if update then
        UPDATE emp2
         SET CO=:NEW.CO,
             DtLvDp=:NEW.DtLvDp,
             DtCyc=:NEW.DtCyc,
             DlvDat=:NEW.DlvDat,
             PmCen=:NEW.PmCen,
             CnsmMtsNo=:NEW.CnsmMtsNo,
             CnsmNtwgt=:NEW.CnsmNtwgt,
             ROne=:NEW.ROne,
             RTwo=:NEW.RTwo,
             XtOutMtNoOne=:NEW.XtOutMtNoOne,
             XtOutMtNoTwo=:NEW.XtOutMtNoTwo,
             ShPrOne=:NEW.ShPrOne,
             ShPrTwo=:NEW.ShPrTwo,
             MtzStk=:NEW.MtzStk,
             TxEmp=:NEW.TxEmp,
             TxDat=:NEW.TxDat,
             TxTm=:NEW.TxTm
         WHERE
             CO=:OLD.CO AND 
             DtLvDp=:OLD.DtLvDp AND 
             DtCyc=:OLD.DtCyc AND
             DlvDat=:OLD.DlvDat AND 
             PmCen=:OLD.PmCen AND 
             CnsmMtsNo=:OLD.CnsmMtsNo AND 
             CnsmNtwgt=:OLD.CnsmNtwgt AND 
             ROne=:OLD.ROne AND 
             RTwo=:OLD.RTwo AND 
             XtOutMtNoOne=:OLD.XtOutMtNoOne AND 
             XtOutMtNoTwo=:OLD.XtOutMtNoTwo AND 
             ShPrOne=:OLD.ShPrOne AND 
             ShPrTwo=:OLD.ShPrTwo AND 
             MtzStk=:OLD.MtzStk AND 
             TxEmp=:OLD.TxEmp AND 
             TxDat=:OLD.TxDat AND
             TxTm=:OLD.TxTm;
      else 
        delete from emp2 where select * from emp where CO=:OLD.CO AND 
             DtLvDp=:OLD.DtLvDp AND 
             DtCyc=:OLD.DtCyc AND
             DlvDat=:OLD.DlvDat AND 
             PmCen=:OLD.PmCen AND 
             CnsmMtsNo=:OLD.CnsmMtsNo AND 
             CnsmNtwgt=:OLD.CnsmNtwgt AND 
             ROne=:OLD.ROne AND 
             RTwo=:OLD.RTwo AND 
             XtOutMtNoOne=:OLD.XtOutMtNoOne AND 
             XtOutMtNoTwo=:OLD.XtOutMtNoTwo AND 
             ShPrOne=:OLD.ShPrOne AND 
             ShPrTwo=:OLD.ShPrTwo AND 
             MtzStk=:OLD.MtzStk AND 
             TxEmp=:OLD.TxEmp AND 
             TxDat=:OLD.TxDat AND
             TxTm=:OLD.TxTm;
       end if;    
    end NLTrigger;这样对么?可是我在command的时候,还是有错误.汗....2/4      PLS-00103: 出现符号 "INSERT"在需要下列之一时:   ( - + case     mod new not null <an identifier>     <a double-quoted delimited-identifier> <a bind variable> avg     count current exists max min prior sql stddev sum variance     execute forall merge time timestamp interval date     <a string literal with character set specification>     <a number> <a single-quoted SQL string> pipe     <an alternatively-quoted string literal with character set specification>     <an alternatively-quoted SQL string>  符
    6/10     PLS-00103: 出现符号 "UPDATE"在需要下列之一时:   ( - + case     mod new not null <an identifier>     <a double-quoted delimited-identifier> <a bind variable> avg     count current exists max min prior sql stddev sum variance     execute forall merge time timestamp interval date     <a string literal with character set specification>     <a number> <a single-quoted SQL string> pipe     <an alternatively-quoted string literal with character set specification>     <an alternatively-quoted SQL string>  符
    44/35    PLS-00103: 出现符号 "SELECT"在需要下列之一时:   ( - + case     mod new not null <an identifier>     <a double-quoted delimited-identifier> <a bind variable> avg     count current exists max min prior sql stddev sum variance     execute forall merge time timestamp interval date     <a string literal with character set specification>     <a number> <a single-quoted SQL string> pipe     <an alternatively-quoted string literal with character set specification>     <an alternatively-quoted SQL string>  
    64/5     PLS-00103: 出现符号 "NLTRIGGER"在需要下列之一时:   if  
      

  16.   

    .....trigger语法:
    if UPDATING then
      ......
    elsif INSERTING then
      ......
    else
      ......
    end if;"delete from emp2 where select * from emp where ....;"
    这是delete语句语法?
    delete from emp2 where CO=:OLD.CO AND 
             DtLvDp=:OLD.DtLvDp AND 
             DtCyc=:OLD.DtCyc AND
             DlvDat=:OLD.DlvDat AND 
             PmCen=:OLD.PmCen AND 
             CnsmMtsNo=:OLD.CnsmMtsNo AND 
             CnsmNtwgt=:OLD.CnsmNtwgt AND 
             ROne=:OLD.ROne AND 
             RTwo=:OLD.RTwo AND 
             XtOutMtNoOne=:OLD.XtOutMtNoOne AND 
             XtOutMtNoTwo=:OLD.XtOutMtNoTwo AND 
             ShPrOne=:OLD.ShPrOne AND 
             ShPrTwo=:OLD.ShPrTwo AND 
             MtzStk=:OLD.MtzStk AND 
             TxEmp=:OLD.TxEmp AND 
             TxDat=:OLD.TxDat AND
             TxTm=:OLD.TxTm;
      

  17.   

    update改成updating
    insert改成inserting
      

  18.   

    上面那个太多栏位了,我建了个简单的表,emp和emp2.
    create table emp(id number(3),name varchar2(30),age number(5));
    create table emp2(id number(3),name varchar2(30),age number(5));
    create or replace trigger myTrigger 
    before insert or update or delete on emp 
    for each row 
    begin 
    if inserting then
      insert into emp2 values (:NEW.id,:NEW.name,:NEW.age);
     else if updating then
      update emp2 set(id=:NEW.id,name=:NEW.name,age=:NEW.age)
      where id=:old.id and name = :old.name and age=:old.age;
      else 
        delete from emp2 where id=:old.id and name = :old.name and age=:old.age;
       end if;
    end;这个还是有错...
      

  19.   


    create or replace trigger myTrigger 
    before insert or update or delete on emp 
    for each row 
    begin 
    if inserting then
      insert into emp2 values (:NEW.id,:NEW.name,:NEW.age);
     elsif updating then
      update emp2 set(id=:NEW.id,name=:NEW.name,age=:NEW.age)
      where id=:old.id and name = :old.name and age=:old.age;
      else 
        delete from emp2 where id=:old.id and name = :old.name and age=:old.age;
       end if;
    end;5/21     PL/SQL: ORA-00907: 缺失右括号
    5/3      PL/SQL: SQL Statement ignored
      

  20.   

    是elsif...
    即是insert/update/delete中的哪一个触发了触发器?
    可以在触发器中使用inserting / updating / deleting 条件谓词,作判断:
    begin
       if inserting then
        -----
       elsif updating then
        -----
       elsif deleting then
        ------
       end if;
    end;
      

  21.   


    create or replace trigger myTrigger 
    before insert or update or delete on emp 
    for each row 
    begin 
    if inserting then
      insert into emp2 values (:NEW.id,:NEW.name,:NEW.age);
     elsif updating then
      update emp2 set(id=:NEW.id,name=:NEW.name,age=:NEW.age)--这里出错了,去掉()
                 ------update emp2 set id=:NEW.id,name=:NEW.name,age=:NEW.age
      where id=:old.id and name = :old.name and age=:old.age;
      else 
        delete from emp2 where id=:old.id and name = :old.name and age=:old.age;
       end if;
    end;
    还不行我就无语言了
      

  22.   

    create or replace trigger myTrigger 
    before insert or update or delete on emp 
    for each row 
    begin 
    if inserting then
      insert into emp2 values (:NEW.id,:NEW.name,:NEW.age);
    elsif updating then  --你的错误在这里
      update emp2 set(id=:NEW.id,name=:NEW.name,age=:NEW.age)
      where id=:old.id and name = :old.name and age=:old.age;
    else 
        delete from emp2 where id=:old.id and name = :old.name and age=:old.age;
    end if;
    end;
      

  23.   

    我把我写的贴上来
    create or replace trigger mytrigger
    before update or insert or delete on emp
    for each row
    begin
    if inserting then
    insert into emp2 values(:new.empno,:new.ename,:new.job,:new.mgr,:new.hiredate,:new.sal,:new.comm,:new.deptno);
    elsif updating then
    update emp2 t set t.empno=:new.empno,t.ename=:new.ename,
    t.job=:new.job,t.mgr=:new.mgr,t.hiredate=:new.hiredate,t.sal=:new.sal,t.comm=:new.sal,t.deptno=:new.deptno
    where t.empno=:old.empno; 
    elsif deleting then
    delete from emp2 t where t.empno=:old.empno;
    end if;
    end;
      

  24.   

    疯了...终于知道错误在那里了.
    update那里的set不用加().....
    这样就ok了...create or replace trigger myTrigger 
    before insert or update or delete on emp 
    for each row 
    begin 
    if inserting then
      insert into emp2 values (:NEW.id,:NEW.name,:NEW.age);
     elsif updating then
      update emp2 set id=:NEW.id,name=:NEW.name,age=:NEW.age
      where id=:old.id and name = :old.name and age=:old.age;
      else 
        delete from emp2 where id=:old.id and name = :old.name and age=:old.age;
       end if;
    end;