由于学艺不到家,对Oracle的触发器不深了解,在此求个触发器的写法。下面是这种情况:A表中有enterpiseId和B表中enterpriseId是关联的,当A表中CRUD时,就在B表的NO字段进行自动+1,但是enterpriseId要和A表中的crud时对应。这个实例怎么使用触发器实现,求教了。先多谢各位大侠些了。

解决方案 »

  1.   

    [code=XML]
    --可能有问题 , 这里没oracle环境 不好测试 ,  
    create or replate trigger test
    after update or insert or delete or select on A --不知道这里能不能用or关键字相连 , 还有不知道能不能对select进行监听 ,这以前都没试过,你试试。
    for each row
    begin
    update B b set b.NO = (b.No + 1) , b.enterpriseId = :new.enterpiseId ;
    end;
    /code]
      

  2.   


    --可能有问题 , 这里没oracle环境 不好测试 ,  
    create or replate trigger test
    after update or insert or delete or select on A --不知道这里能不能用or关键字相连 , 还有不知道能不能对select进行监听 ,这以前都没试过,你试试。
    for each row
    begin
    update B b set b.NO = (b.No + 1) , b.enterpriseId = :new.enterpiseId ;
    end;
      

  3.   


    --可能有问题 , 这里没oracle环境 不好测试 ,  
    create or replate trigger test
    after update or insert or delete or select on A --不知道这里能不能用or关键字相连 , 还有不知道能不能对select进行监听 ,这以前都没试过,你试试。
    for each row
    begin
    update B b set b.NO = (b.No + 1) , b.enterpriseId = :new.enterpiseId  where b.enterpriseId = :old.enterpiseId; --更正一下 ,这里最重要的where刚才忘记写了
    end;
      

  4.   


    多谢哥们的帮助,我试了下,删除、修改能够满足功能,只是在新增条记录的时候,B表的中NO没有更新。下面我把,我写的给你看下,还有什么地方需要更改的。create or replace
    TRIGGER TEST_TRIGGER 
    BEFORE INSERT OR DELETE OR UPDATE ON TB_ACTIVEINFO 
    FOR EACH ROW 
    BEGIN
      UPDATE tb_interface_update t SET t.UPDATE_VERSION_NO = t.UPDATE_VERSION_NO+1,t.enterpriseid=:new.enterpriseid WHERE t.update_id=1 AND t.enterpriseid =:old.enterpriseid;
    END;
      

  5.   


    CRUD是指在做计算处理时的增加(Create)、查询(Retrieve)(重新得到数据)、更新(Update)和删除(Delete)几个单词的首字母简写。主要被用在描述软件系统中数据库或者持久层的基本操作功能。
      

  6.   

    多谢4#的哥们的帮助,我完善了下,可以实现INSERT/DELETE/UPDATE的触发器了。
    我贴出来,帮我看看,有什么问题没??触发器实在对我有点困难。
    create or replace
    TRIGGER TEST_TRIGGER 
    BEFORE INSERT OR DELETE OR UPDATE ON TB_ACTIVEINFO 
    FOR EACH ROW 
    BEGIN
      IF UPDATING OR DELETING THEN
        UPDATE tb_interface_update t SET t.UPDATE_VERSION_NO = t.UPDATE_VERSION_NO+1,t.enterpriseid=:new.enterpriseid WHERE t.update_id=1 AND t.enterpriseid =:old.enterpriseid;
      ELSE 
         UPDATE tb_interface_update t SET t.UPDATE_VERSION_NO = t.UPDATE_VERSION_NO+1,t.enterpriseid=:new.enterpriseid WHERE t.update_id=1 AND t.enterpriseid =:new.enterpriseid;
      END IF;
    END;
      

  7.   

    还有要注意对Insert单独处理 , 因为A表Inset时B表还没有数据。应该判断如果B表中没有数据,就插入数据,如果B表中有数据,就修改
    IF UPDATING OR DELETING THEN -- 这样写 , 可以吗? 好像不行吧?
      

  8.   


    这个可以,ORACLE对触发器的触发类型有分类的。分为INSERTING /UPDATING/DELETING
      

  9.   

    我在执行下面的触发器的时候老是报错:
    create or replace
    TRIGGER DRESSUP_UPDATE_TRIGGER 
    BEFORE INSERT OR DELETE OR UPDATE ON TB_DRESSUPINFO 
    FOR EACH ROW
    DECLARE 
      ENTERID NUMBER(32,0);
       PRAGMA AUTONOMOUS_TRANSACTION;
    BEGIN
    IF UPDATING OR DELETING THEN
        SELECT b.enterpriseid INTO ENTERID FROM tb_brandinfo b WHERE b.brandid = (SELECT DISTINCT(brandorproductid) FROM tb_dressupinfo t WHERE t.brandorproductid=:old.brandorproductid);
      
    ELSIF INSERTING THEN
        SELECT b.enterpriseid INTO ENTERID FROM tb_brandinfo b WHERE b.brandid = (SELECT DISTINCT(brandorproductid) FROM tb_dressupinfo t WHERE t.brandorproductid=:new.brandorproductid);
      END IF;
        UPDATE tb_interface_update t SET t.UPDATE_VERSION_NO = t.UPDATE_VERSION_NO+1, t.update_date=sysdate,t.enterpriseid=ENTERID WHERE t.update_id=1 AND t.enterpriseid =ENTERID;
    END;
    本地更改已清除
    UPDATE "ADMIN"."TB_DRESSUPINFO" SET CARDRESSUPNAME = '车前窗2' WHERE ROWID = 'AAAR+gAAEAAAAFOAAA' AND ORA_ROWSCN = '4361942'
    ORA-06519: 检测到活动的独立的事务处理, 已经回退
    ORA-06512: 在 "ADMIN.DRESSUP_UPDATE_TRIGGER", line 15
    ORA-04088: 触发器 'ADMIN.DRESSUP_UPDATE_TRIGGER' 执行过程中出错
    保存对表 "ADMIN"."TB_DRESSUPINFO" 的更改时出现一个错误:
    行 8: ORA-06519: 检测到活动的独立的事务处理, 已经回退
    ORA-06512: 在 "ADMIN.DRESSUP_UPDATE_TRIGGER", line 15
    ORA-04088: 触发器 'ADMIN.DRESSUP_UPDATE_TRIGGER' 执行过程中出错