最近写了个触发器
同步2张表 
但是现在触发器内写的insert不能用
create or replace trigger xnuser
  after insert 
  on tab_webusers  
  for each row
declare
  -- local variables here
     integrity_error exception;
    errno            integer;
    errmsg           char(200);
    maxid            integer;
    sex              char(10);
    type1            char(1);
    orgid            char(1);
begin   select max(id) into maxid from vr_userinfo@xnsql;
  maxid:=maxid+1;  if inserting then
    if :new.utype='1' then 
    type1:='1';
    orgid:='1';
    else
    type1:='3';
   orgid:='3';
   end if;    
   if  :new.usex='1' then
   sex:='男';
   elsif  :new.usex='2' then
    sex:='女';
    else
   sex:='';
    end if;
    insert into vr_userinfo@xnsql("ID","Code","Pass","Name","Type","AdminType","Level","SpriteCode","Sex","OrgID","Re","Status") values
    (maxid,:NEW.USENO,:NEW.UPASSWORD,:NEW.UNAME,type1,'0','1','man1',sex,orgid,'dead测试','1');
end if;
exception
    when integrity_error then
       raise_application_error(errno, errmsg);end xnuser;单独把insert语句拿出来运行没有问题 但是放在触发器内就有问题 发生死锁 说被事务挂起
谁帮我分析分析?

解决方案 »

  1.   

      SELECT MAX(id) INTO maxid FROM vr_userinfo@xnsql;
      maxid := maxid + 1;
    这种方式生成ID存在并发问题,改成序列
      

  2.   

    我也删除过这句话 SELECT MAX(id) INTO maxid FROM vr_userinfo@xnsql;
      maxid := maxid + 1;
    就是单独的
     insert into vr_userinfo@xnsql
    ("ID","Code","Pass","Name","Type","AdminType","Level","SpriteCode","Sex","OrgID","Re","Status")  
    values
      ('1','1','1','1','1','0','1','man1','1','1','dead测试','1');
    这样插入 也在触发器内也还是报一样的错误
    单独执行INSERT就可以 所以很纳闷
      

  3.   

    create or replace trigger xnuser
      after insert 
      on tab_webusers  
      for each row
    declare
      -- local variables herebegin
      if inserting then
        insert into vr_userinfo@xnsql
    ("ID","Code") 
    values
        ('10','10');end xnuser;我都改成这样了 还是报错 说事务挂起~难道触发器内不能INSERT?
      

  4.   

    exec dbms_sesssion.close_database_link('xnsql');ran hou zai shi shi
      

  5.   

    写在哪里?触发器编译不过
    TRIGGER TCLM.XNUSER 编译错误错误:PLS-00103: 出现符号 "DBMS_SESSSION"在需要下列之一时:
            := . ( @ % ;
           符号 ":=" 被替换为 "DBMS_SESSSION" 后继续。
    行:16
    文本:exec dbms_sesssion.close_database_link('xnsql');
      

  6.   


    --事情是这样的,oracle中存在事务的概念,而事务是由oracle自动维护的
    --而类似于 insert into xxx@dblink_name .... 这样的语句,将数据插入到远端数据库的操作
    --会造成oracle无法控制远端数据库的事务而导致 事务发生终端,因此oracle中是不允许进行类似的操作的。
    ----换句话说你的触发器设计思路就存在问题--不过你可以改一个思路,在本地建一个表 vr_userinfo,将数据插入
    --然后在远端数据库上建一个定时任务,同步这个表
    ----insert into vr_userinfo select * from vr_userinfo@dblink_name;
    -----这样的语句是不会导致oracle的事务中断而报错的。
      

  7.   

    真的没什么办法了吗?
    高手求解~
    ORACLE不准~~555