本人现在想写个更新用的触发器,功能如下:
   当更新表A某条记录的非c1列时,将当前更新记录的c1列置为2,而更新c1列是不进行任何操作。
我写过一个,但问题就出在后边的限制条件上,当更新c1列时,触发器把c1列也更新为2了,起不到更新效果。希望知道的给指点下,谢谢!
--更新结帐表时处理DataDealState字段的触发器
if Exists(select name from sysobjects where name = 'trig_Updatecheckout' and xtype = 'TR') 
  drop Trigger trig_Updatecheckout 
goCreate Trigger trig_Updatecheckout
  On TCheckOut   
  for Update            
As                      
begin
  update a set DataDealState = 2 From TCheckOut a, inserted b Where a.CheckOutID = b.CheckOutID
end   
go 

解决方案 »

  1.   

    Create Trigger trig_Updatecheckout 
      On TCheckOut  
      for Update            
    As                      
    begin 
      if Not Update(DataDealState)
       update a set DataDealState = 2 From TCheckOut a, inserted b Where a.CheckOutID = b.CheckOutID 
    end  
    go 
      

  2.   

    if Exists(select name from sysobjects where name = 'trig_Updatecheckout' and xtype = 'TR') 
      drop Trigger trig_Updatecheckout 
    go Create Trigger trig_Updatecheckout 
      On TCheckOut  
      for Update            
    As                      
    begin 
    if update(c1)  -- 更新c1就直接退出
      return;
      update a set DataDealState = 2 From TCheckOut a, inserted b Where a.CheckOutID = b.CheckOutID 
    end  
    go 
      

  3.   

    update a 
    set DataDealState = 2 
    From TCheckOut a, inserted b,deleted d
    Where a.CheckOutID = b.CheckOutID and b.CheckOutID=d.CheckOutID
      

  4.   


    if Exists(select name from sysobjects where name = 'trig_Updatecheckout' and xtype = 'TR') 
      drop Trigger trig_Updatecheckout 
    go Create Trigger trig_Updatecheckout 
      On TCheckOut  
      for Update            
    As                      
    begin   update a 
    set DataDealState = 2 
      From TCheckOut a, inserted b 
      Where a.CheckOutID = b.CheckOutID  and a.DataDealState = b.DataDealState
    end  
    go 
      

  5.   

    上述两种方法我都试过了,不行,都是在更新列c1时将所有记录的c1列都置为2了。我用的是sqlserver2000,请问是不是有什么问题啊?
      

  6.   

    我写错了……update a 
    set DataDealState = 2 
    From TCheckOut a, inserted b,deleted d
    Where a.CheckOutID = b.CheckOutID and b.CheckOutID=d.CheckOutID and b.DataDealState=d.DataDealState
    还是用update()比较简洁,学习了。
      

  7.   

    sql2000里,update()函数就对timestamp列无效,其它还是有效的
      

  8.   

    你的 CheckOutID  是主键吗?语句上应该没有问题
      

  9.   

    写了个小例子,测试是没问题的,不知道你的update语句是怎么写的?
    create table TCheckOut(CheckOutID int,DataDealState int)
    insert TCheckOut select 1,2 union select 2,4 union select 3,8
    go
    /*
    CheckOutID  DataDealState
    ----------- -------------
    1           2
    2           4
    3           8
    */
    Create Trigger trig_Updatecheckout 
      On TCheckOut  
      for Update            
    As                      
    begin 
      if Not Update(DataDealState) 
    update a set DataDealState = 2 From TCheckOut a, inserted b Where a.CheckOutID = b.CheckOutID 
    end  
    go
    --测试语句
    update TCheckOut set CheckOutID=100 where CheckOutID=3
    select * from TCheckOut
    /*
    CheckOutID  DataDealState
    ----------- -------------
    1           2
    2           4
    100         2  
    */drop table TCheckOut