注意:你的触发器必须使用cursor才能防止在一个语句中修改多行数据时发生的错误,示例如下:
...
   declare cur_trig cursor local for select ... from inserted(deleted)
  /* 使用inserted 或 deleted ,更据你是要用新的数据作关联还是旧的数据作关联*/
open cur_trig
fetch next from ...while @@fetch_status=0
begin
   /*这里写你的针对每一条修改的记录的业务*/
   fetch next from ...
end
close cur_trig
deallocate cur_trig

解决方案 »

  1.   

    CREATE TRIGGER project_saler_password_tr
    ON dbo.project_saler_password
    for insert,delete,update
    AS
    begin
     set  XACT_ABORT on
    declare @sn_del varchar(20),@sn_ins varchar(20),@cun as int
    declare @fun varchar(20), @fundel varchar(20)
    declare @salerid_del as varchar(20),@salerid_ins as varchar(20)
    /* select @salerid_del=salerid from deleted del
    select @salerid_ins=salerid from inserted ins
    select @sn_del=projectid from deleted del
    select @sn_ins=projectid from inserted ins
    select @fun ='jz' +right( @sn_ins,8)
    select @fundel='jz' + right(@sn_del,8)*/select @cun=count(*) from opendatasource('SQLOLEDB','Data Source=zlw;User ID=sa;Password=').yiyaonew2.dbo.project_saler_password p where exists ( select * from inserted i where p.projectid=i.projectid and p.salerid=salerid_ins)
    if @cun>0
    begin
        delete opendatasource('SQLOLEDB','Data Source=zlw;User ID=sa;Password=').yiyaonew2.dbo.project_saler_password p where exists ( select * from inserted i where p.projectid='jz' +right( i.projectid ,8) and p.salerid=salerid_ins)   
    --下面的类似改一下
        insert into opendatasource('SQLOLEDB','Data Source=zlw;User ID=sa;Password=').yiyaonew2.dbo.project_saler_password(Projectid,Salerid,Password,Password1,Flag,numFlag) select Projectid,Salerid,Password,Password1,Flag,numFlag from project_saler_password where projectid=@sn_ins and salerid=@salerid_ins
        update opendatasource('SQLOLEDB','Data Source=zlw;User ID=sa;Password=').yiyaonew2.dbo.project_saler_password set projectid=@fun where projectid=@sn_ins and salerid=@salerid_ins
    end
    elsebegin
       delete opendatasource('SQLOLEDB','Data Source=zlw;User ID=sa;Password=').yiyaonew2.dbo.project_saler_password where projectid=@fundel and salerid=@salerid_del
       insert into opendatasource('SQLOLEDB','Data Source=zlw;User ID=sa;Password=').yiyaonew2.dbo.project_saler_password(Projectid,Salerid,Password,Password1,Flag,numFlag) select Projectid,Salerid,Password,Password1,Flag,numFlag from project_saler_password where projectid=@sn_ins and salerid=@salerid_ins
       update opendatasource('SQLOLEDB','Data Source=zlw;User ID=sa;Password=').yiyaonew2.dbo.project_saler_password set projectid=@fun where projectid=@sn_ins and salerid=@salerid_ins
    endend
      

  2.   

    这个问题我曾经问过……
    当时得到的回答是,批量的修改,触发器只对修改的最后一条记录起作用
    解决的办法是,用游标一个一个的修改,这样触发器就可以起作用了
    这个也就是zmjszm(小人物) 说的方法……
      

  3.   

    用游标实现:declare cur_trig cursor local for select ... from inserted(deleted)
      

  4.   

    Rotaxe,我用你的方法试过但是老报错,说project_saler_product
    各位,用游标可以是可以了,但是听说游标耗资源啊,据说应该尽量少用,有别的方法吗?
    好象Rotaxe的方法是可以的,我再调调了