Create Or Replace Trigger Jde_Ap_After_Insert
After Insert  On texp.Jde_Accountpayment 
For Each RowBegin
  
  if :New.company = 700 Then
  Begin
       
       Insert Into wnc.Jde_Accountpayment Values
       (  
         :New.APPID         
        ,:New.EEBATCHID     
        ,:New.SUPPLIERNO    
        ,:New.INVOICENO     
        ,:New.INVOICEAMOUNT 
        ,:New.INVOICEDATE   
        ,:New.GLDATE        
        ,:New.VOUCHER       
        ,:New.TYPE          
        ,:New.COMPANY       
        ,:New.BUSINESSUNIT  
        ,:New.GLBANKACCOUNT 
        ,:New.SUBNO         
        ,:New.SUBTYPE       
        ,:New.STATE         
        ,:New.FINALNAME     
        ,:New.FINALDATE     
        ,:New.PAYMENTTYPE   
        ,:New.REMARK          
       );
       
       Delete from texp.Jde_Accountpayment a Where a.Appid=:New.appid;
  End;
  End if;
End Jde_Ap_After_Insert;

解决方案 »

  1.   

    texp ,wnc这两个用户下表都存在吗?
      

  2.   

    补充要求:写一个触发器,满足如果:New.company = 700 时,触发插入另一个数据库的wnc.Jde_Accountpayment 表,同时保证不插入texp.Jde_Accountpayment 表。
      

  3.   

    当前用户texp是有访问wnc.Jde_Accountpayment,texp.Jde_Accountpayment 这俩表的权限!
      

  4.   

    插入另一个数据库?那要建dblink吧
      

  5.   

    select * from wnc.Jde_Accountpayment;
    select * from texp.jde_accountpayment;可以查询结果!
      

  6.   

    Create Or Replace Trigger Jde_Ap_After_Insert 
    After Insert  On texp.Jde_Accountpayment@link 
    For Each Row Begin 
      
      if :New.company = 700 Then 
      Begin 
          
          Insert Into wnc.Jde_Accountpayment Values 
          (  
            :New.APPID        
            ,:New.EEBATCHID    
            ,:New.SUPPLIERNO    
            ,:New.INVOICENO    
            ,:New.INVOICEAMOUNT 
            ,:New.INVOICEDATE  
            ,:New.GLDATE        
            ,:New.VOUCHER      
            ,:New.TYPE          
            ,:New.COMPANY      
            ,:New.BUSINESSUNIT  
            ,:New.GLBANKACCOUNT 
            ,:New.SUBNO        
            ,:New.SUBTYPE      
            ,:New.STATE        
            ,:New.FINALNAME    
            ,:New.FINALDATE    
            ,:New.PAYMENTTYPE  
            ,:New.REMARK          
          ); 
          
          Delete from texp.Jde_Accountpayment a Where a.Appid=:New.appid; 
      End; 
      End if; 
    End Jde_Ap_After_Insert; 编译时出现错误,出现ORA-02021: 不允许对远程数据库进行DDL 操作的错误,如何解决?
      

  7.   

    检查触发器所在用户是否有访问其他用户表的权限。一般是由权限引起,将另一用户表的权限grant 给当前用户即可。
      

  8.   

    For Each Row 的触发器中,Delete from texp.Jde_Accountpayment a Where a.Appid=:New.appid 是有问题的因为你在表texp.Jde_Accountpayment上出发for each row的触发器,则在trigger体中,不能使用:New.appide作为限制去
    遍历texp.Jde_Accountpayment中的记录。
    即:texp.Jde_Accountpayment 是mutating only for a row-level trigger. This means that we cannot
    query it in a row-level trigger, but we can in a statement-level trigger你可以查询下相关Mutating Table(变异表)上trigger的应用。
      

  9.   

    to 9楼:
    grant insert,delete on wnc.Jde_Accountpayment to texp; 不能正确的进行赋权,提示为:ORA-01749:用户不能自己为自己 GRANT/REVOKE权限
      

  10.   

    to 10楼:我把这条语句先注销掉,还是编译不通过呀
     --Delete from texp.Jde_Accountpayment a Where a.Appid=:New.appid;
      

  11.   

    按照正常情况,测试是没有问题的:
    ----- 测试表
    CREATE TABLE  TEST_A(
    COL_1 NUMBER,
    COL_2 VARCHAR2(10)
    );CREATE TABLE  TEST_B(
    COL_1 NUMBER,
    COL_2 VARCHAR2(10)
    );-----  测试 trigger
    Create Or Replace Trigger TEST_A_After_Insert 
    After Insert  On TEST_A 
    For Each Row Begin 
      
      if :NEW.COL_1 = 1 Then 
      Begin  
          Insert Into TEST_B Values 
          (  
            :New.COL_1        
            ,:New.COL_2         
          ); 
          
          --Delete from texp.Jde_Accountpayment a Where a.Appid=:New.appid; 
      End; 
      End if; 
    End TEST_A_After_Insert; ---- 测试数据
    INSERT INTO TEST_A VALUES (1,'A');
    INSERT INTO TEST_A VALUES (1,'B');
    INSERT INTO TEST_A VALUES (2,'A');
    INSERT INTO TEST_A VALUES (3,'A');
    INSERT INTO TEST_A VALUES (4,'A');
    INSERT INTO TEST_A VALUES (1,'C');
    COMMIT;--------结果
    SELECT * FROM TEST_A;
    COL_1 COL_2
    1 A
    1 B
    2 A
    3 A
    4 A
    1 C
    SELECT * FROM TEST_B;
    COL_1 COL_2
    1 A
    1 B
    1 C----- 删除
    DROP TRIGGER TEST_A_After_Insert;
    DROP TABLE TEST_A;
    DROP TABLE TEST_B;
      

  12.   

    请检查:
    1、当前用户是否有create trigger的权限;
    2、是否有向wnc.Jde_Accountpayment插入数据的权限;
    3、到底是After Insert  On texp.Jde_Accountpayment@link  还是
    After Insert  On texp.Jde_Accountpayment;
    4、如果是通过db_link插入数据,请确认插入的数据没有LOB类型的字段
      

  13.   

    在别处看到过类似的问题,貌似把触发器建到texp用户下不会出现问题,而建到wnc下就会报错
      

  14.   

    谢谢大家的跟贴,也谢谢大家的帮助与指点,现在问题已经解决,问题的根源是由于当前用户没有对wnc.Jde_Accountpayment表INSERT权限,当前用户是texp,用另一个用户wnc登录后赋权就OK了,触发器Jde_Ap_After_Insert编译成功!GRANT INSERT,DELETE ON wnc.Jde_Accountpayment TO TEXP;要求:写一个触发器,满足如果:New.company = 700 时,触发插入另一个数据库的wnc.Jde_Accountpayment 表,同时保证不插入texp.Jde_Accountpayment 表。完整的代码如下:
    Create Or Replace Trigger Jde_Ap_After_Insert
    After Insert  On texp.Jde_Accountpayment 
    For Each RowBegin
      
      if :New.company = 700 Then
      
      begin       Insert Into wnc.Jde_Accountpayment Values
           (  
             :New.APPID         
            ,:New.EEBATCHID     
            ,:New.SUPPLIERNO    
            ,:New.INVOICENO     
            ,:New.INVOICEAMOUNT 
            ,:New.INVOICEDATE   
            ,:New.GLDATE        
            ,:New.VOUCHER       
            ,:New.TYPE          
            ,:New.COMPANY       
            ,:New.BUSINESSUNIT  
            ,:New.GLBANKACCOUNT 
            ,:New.SUBNO         
            ,:New.SUBTYPE       
            ,:New.STATE         
            ,:New.FINALNAME     
            ,:New.FINALDATE     
            ,:New.PAYMENTTYPE   
            ,:New.REMARK          
           );
           
           Delete from texp.Jde_Accountpayment a Where a.Appid=:New.appid;
      end;
      End if;
      
         
    Exception
         WHEN Others THEN  
              Rollback;
    End Jde_Ap_After_Insert;
      

  15.   

    不好意思,Delete from texp.Jde_Accountpayment a Where a.Appid=:New.appid; 
    这句是有问题的,看上面回复知道我建的触发器属于 行触发器,那语句触发器的语法是怎么样的呢?怎样修改才能成功执行上面删除语句呢
      

  16.   

    没有实现需求  同时保证不插入texp.Jde_Accountpayment 表。