首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

这个触发器如何实现?检测是否对记录进行了相同修改,有点难

2012-03-08 
这个触发器怎么实现?检测是否对记录进行了相同修改,有点难现在根据表里面的字段OpState来判定是否执行一段

这个触发器怎么实现?检测是否对记录进行了相同修改,有点难
现在根据表里面的字段   OpState来判定是否执行一段存储过程
修改OpState为1或者增加一条记录并且该OpState为1就执行存储过程

目前修改和插入的触发器我都基本实现了,是分开写的,但对于修改的触发器1个大Bug,那就是如果原来字段为1,现在还是写1,那就又执行一次存储过程,由于这个存储过程是大批量写数据,那么假如客户端不小心连续执行了更改字段的命令,那么就连续执行了触发器,或者多执行了一次,引起问题,代码如下,大家帮助看看
我现在里面是不允许OpState列同时有2个或以上的1

CREATE   trigger   Tr_Ra   on   Log_RefreshData_Table
for   update
as  
begin
      declare   @Year   int
      declare   @Month   int
      declare   @OpState   int
      declare   @OpState2   int
      declare   @Num   int
      if     Update(OpState)    
      Begin
            select   @Num   =     count(*)   from   Log_RefreshData_Table   where   OpState=1
            if   @Num=0
                  Begin  
                        Insert   into   TestInfo(Msg,TryTime)   Values( '没有可执行的任务......   OpState <> 1 ',Getdate())
                        return
                  End
           
            select   @OpState   =     OpState     from   Log_RefreshData_Table   where     ID   =   (select   ID   from   Inserted)          
            select   @OpState2   =     OpState     from   Log_RefreshData_Table   where     ID   =   (select   ID   from   Inserted)          
            select   @Num   =     count(*)   from   Log_RefreshData_Table   where   OpState=1  
/***********功能未实现,不明白为什么**************/
            if   @Num=1   and   @OpState=@OpState2--上次进行的本月导入尚未结束,取消本次指令
                  Begin  
                        --RollBack
                        Insert   into   TestInfo(Msg,TryTime)   Values( '本月批量导入正在进行...... '+str(@OpState)+str(@OpState),Getdate())
                        return
                  End
/***************************************/
            if   @Num> 1
                  Begin  
                        RollBack
                        Insert   into   TestInfo(Msg,TryTime)   Values( '某次批量导入正在进行,请等待执行...... ',Getdate())
                        return
                  End
           
            select   @Year=Years,@Month=Monthe,@OpState=OpState   from     Log_RefreshData_Table   where   ID   =   (select   ID   from   deleted)


            if   @@rowcount> 0
                  Begin
                        if   @OpState=1
                              Begin
                                  --exec   sp_BachRefresh_Data   @Year,@Month,@Num  
                                  Insert   into   TestInfo(Msg,TryTime)   Values( '开始执行任务 ',Getdate())
                                  return
                              End
                        else
                              Insert   into   TestInfo(Msg,TryTime)   Values( '没有可执行的任务......   OpState <> 1 ',Getdate())
                              return
                  End
            Else
                  Insert   into   TestInfo(Msg,TryTime)   Values( '没有修改记录吧...... ',Getdate())
      End
      else
            Insert   into   TestInfo(Msg,TryTime)   Values( '没有修改OpState列吧...... ',Getdate())
end




[解决办法]
select @OpState = OpState from Log_RefreshData_Table where ID = (select ID from Inserted)
select @OpState2 = OpState from Log_RefreshData_Table where ID = (select ID from Inserted)

@OpState2和@OpState不是肯定一样吗
这种取法在你的触发器多次出现,如果一次修改多条记录,那只能取得第一条的值


热点排行
Bad Request.