CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  MS-SQL Server >  疑难问题

UPDATE多行数据时为什么只能激发一次触发器?

楼主tlfangqing(东北大刀)2003-11-02 22:52:29 在 MS-SQL Server / 疑难问题 提问

我在一个表中设了一个触发器,此表中有一字段为TAG,我设为BIT型,作为标志,  
  触发器的作用就是当数据的TAG为1时执行,可时我用UPDATE将多行数据的TAG更新为1时,只有最后一行数据的触发器被激活了,这可如何是好? 问题点数:20、回复次数:11Top

1 楼aflyingpig(毛毛)回复于 2003-11-02 22:57:36 得分 0

把你的代码贴出来看看  
  是不是你的触发器用了变量Top

2 楼txlicenhe(马可)回复于 2003-11-03 08:14:45 得分 0

应该是你的触发器的代码有问题。Top

3 楼pengdali()回复于 2003-11-03 08:35:21 得分 0

举例多记录操作语句:(楼主看看update是怎么写的)  
   
  CREATE   TRIGGER   名1   ON   dbo.tabMain  
  FOR   INSERT  
  AS  
  insert   db2..tabSlave   select   *   from   inserted  
  go  
   
  CREATE   TRIGGER   名2   ON   dbo.tabMain  
  FOR   update  
  AS  
  update   db2..tabSlave   set   列=aa.列   from   inserted   aa   where   aa.编号=db2..tabSlave.编号  
  go  
   
  CREATE   TRIGGER   名3   ON   dbo.tabMain  
  FOR   delete  
  AS  
  delete   db2..tabSlave   where   编号   in   (select   编号   from   deleted)  
  Top

4 楼zjcxc(邹建)回复于 2003-11-03 08:58:58 得分 5

SQL中的触发器是这样的,不支持行级触发.  
   
  即:   一个更新语句如果影响到多个行时,只产生一次触发.  
   
  所以你在触发器的代码中就要考虑,更新产生的触发可能是多条记录,对就的处理语句也应该做这方面的处理.  
   
   
   
  Top

5 楼zjcxc(邹建)回复于 2003-11-03 08:59:35 得分 0

检查你的触发器代码,看有没有做这方面的考虑.如果不知道怎么做?贴出你的处理代码Top

6 楼tlfangqing(东北大刀)回复于 2003-11-03 19:52:17 得分 0

我编的是进销存系统.有一项功能为入库单审核,有入库单表和入库单商品明细表.当用户审核后,入库单表中的RITAG和明细表中的RITAG都是表示,当RITAG=1是表示此入库单或商品入库.  
  我设了两个触发器,一个是入库单表的,一个是明细表的.其中RIENO为入库单号.为RCIN表的主键,RCINB表的外键.  
  这是RCIN表中的触发器.  
  CREATE   TRIGGER   RCIN_INSERT   ON   dbo.RCIN  
  FOR   INSERTED,UPDATE  
  AS  
  DECLARE   @RITAG   BIT  
  SELECT   @RITAG=RITAG   FROM   INSERTED  
  IF   @RITAG=1    
  UPDATE   RCINB  
  SET   RITAG=1  
  WHERE   RIENO=(SELECT   RIENO   FROM   INSERTED)  
   
   
  这是RCINB(入库单细表)表中的触发器.  
  CREATE   TRIGGER   RCINB_INSERT   ON   dbo.RCINB  
  FOR   INSERTED,UPDATE  
  AS  
  DECLARE   @RITAG   BIT  
  SELECT   @RITAG=RITAG   FROM   INSERTED  
  IF   @RITAG=1   .....(执行入库操作,如使商品库存量增加等)  
   
  由于刚入库时RITAG=0,所以审核时更新为1时,每个入库单所对应的商品中只有最后一个能入库,即只执行了一次触发器,真时急死我了.大家快救我.  
  Top

7 楼pengdali()回复于 2003-11-03 19:54:56 得分 0

CREATE   TRIGGER   RCIN_INSERT   ON   dbo.RCIN  
  FOR   INSERT,UPDATE  
  AS  
  UPDATE   RCINB  
  SET   RITAG=1  
  WHERE   RIENO   in   (SELECT   RIENO   FROM   INSERTED   where   RITAG=1)Top

8 楼pengdali()回复于 2003-11-03 19:55:29 得分 0

你都改为这样。Top

9 楼tlfangqing(东北大刀)回复于 2003-11-03 20:24:22 得分 0

还是没能实现.此改后,RCINB表中对应的RITAG是全变成了1,可是只有最后一个入库商品执行了触发器,入了库,不知为何.Top

10 楼cadinfo(无语清风)回复于 2003-11-04 12:09:20 得分 15

这个问题我在近期发现,已经成功解决,原因是在你这样更新多条记录的时候,inserted表中存在多条记录,这样我是采用游标进行遍历,然后进行逐行处理。  
   
  我的问题是存在于delete触发器,如果采用delete   from   table1时候,希望用触发器删除所有相关信息,同样的问题是只删除一条,现在用游标解决了,示例代码如下,希望对你有启发:  
   
  --drop   trigger   trg_delete_crjlb  
  create   trigger   trg_delete_crjlb   on   crjlb   with   encryption   for   delete   as  
  declare   @cpbs   char(3),@crbh   char(2)  
  declare   del_cursor   cursor   for   select   cpbs,crbh   from   deleted   --看看能否管用  
  open   del_cursor  
  fetch   del_cursor   into   @cpbs,@crbh  
  while   @@fetch_status=0  
  begin  
      exec('drop   table   B'+@cpbs+@crbh)  
      fetch   del_cursor   into   @cpbs,@crbh  
  end  
  close   del_cursor  
  deallocate   del_cursor  
  go  
   
  ---------------------------------  
  你可以将我的代码修改,这仅仅是个思路,祝你顺利Top

11 楼tlfangqing(东北大刀)回复于 2003-11-04 20:43:06 得分 0

我用游标写成了这样,可还是不行,在RCIN表中更改后RCINB表的数据居然没反应,不知为何.  
  用游标怎样进行定位更新呢?就是说,我遍历到哪一行,就对那一行的RITAG字段进行更新,该怎么写呢???  
   
  CREATE   TRIGGER   [NEWRCIN_INSERTED]   ON   [dbo].[RCIN]    
  FOR   INSERT    
  AS  
  DECLARE   @RITAG   BIT,@RIENO   NUMERIC  
  SELECT   @RITAG=RITAG   FROM     INSERTED  
  IF   @RITAG=1    
  BEGIN  
  DECLARE   UPDATE_CURSOR   CURSOR   FOR   SELECT   RIENO   FROM   RCINB   WHERE   RIENO=(SELECT   RIENO   FROM   INSERTED)  
  OPEN   UPDATE_CURSOR  
  FETCH   NEXT   FROM   UPDATE_CURSOR    
  WHILE   @@fetch_status=0  
  BEGIN    
      UPDATE   RCINB    
      SET   RITAG=1   WHERE   CURRENT   OF   UPDATE_CURSOR  
      FETCH   NEXT   FROM   UPDATE_CURSOR    
  END  
       
  CLOSE   UPDATE_CURSOR  
  DEALLOCATE   UPDATE_CURSOR  
   
  END  
   
  Top

相关问题

  • 求购触发器,批量删除数据的触发器
  • update触发器的问题
  • UPDATE触发器问题!
  • update触发器的问题
  • update触发器的问题?
  • update简单触发器
  • UPDATE触发器的问题
  • update触发器的问题
  • 急问:DTS怎么激发触发器?
  • 触发器更新数据问题!

关键词

  • 代码
  • 数据
  • 语句
  • db
  • 触发器
  • tabslave
  • cpbs
  • crbh
  • tabmainfor
  • 游标

得分解答快速导航

  • 帖主:tlfangqing
  • zjcxc
  • cadinfo

相关链接

  • SQL Server类图书

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo