CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  MS-SQL Server >  基础类

update 触发器中的inserted表和deleted表又没有联系(sqlserver自身的)

楼主nsqsmile(阿南)2005-06-20 16:42:32 在 MS-SQL Server / 基础类 提问

我现在要改一个表a的主键字段(id),触发修改表b中的id列,如何实现?  
  create   table   a(id   int   not   null,constraint   PK_1   primary   key     (id))  
  create   table   b(field1   int,id   int)  
   
  a的update触发器  
  create   trigger   tt  
  on   a  
  for   update  
  as  
  begin  
    if   update(id)  
          update   b   set   id   =   c.id  
          from   b,inserted   c,deleted   d  
          where   b.id   =   d.id                           ----问题出在这里,inserted表与deleted表孤立  
  end  
  go  
   
  还有,Inserted   、   deleted表在什么时候删除?一个事物提交后?  
   
  问题点数:50、回复次数:12Top

1 楼pbsql(风云)回复于 2005-06-20 16:53:49 得分 1

你的表应该加个列,该列在其他列改变时不会改变(如identity),这样才能把更改前后的值对应起来Top

2 楼vivianfdlpw()回复于 2005-06-20 17:06:12 得分 15

create   trigger   tt  
  on   a  
  for   update  
  as  
  begin  
    if   update(id)  
    update   b   set   id=(select   id   from   inserted)   where   id=(select   id   from   deleted)  
  end  
  goTop

3 楼nsqsmile(阿南)回复于 2005-06-20 17:44:38 得分 0

回复人:   pbsql(风云)    
   
  如果这样的话,我还不如直接不用触发器了,放到一个事务中提交.  
   
  回复人:   vivianfdlpw()    
   
  你的方法确实可以,但没看懂id=(select   id   from   inserted)这个,能不能讲一下,Top

4 楼wangdehao(找找找(现在很幸福))回复于 2005-06-20 19:29:33 得分 1

To:vivianfdlpw()  
    如果inserted表和deleted表中有多条记录的话就不可以了Top

5 楼vivianfdlpw()回复于 2005-06-20 20:22:03 得分 5

建议你使用foreign   keyTop

6 楼vivianfdlpw()回复于 2005-06-20 21:39:37 得分 5

--创建测试环境  
  create   table   a  
  (  
      id   int   ,  
      name   varchar(20)  
  )  
   
  create   table   b  
  (  
      id   int,  
      sex   bit  
  )  
  go  
  set   nocount   on  
  go  
  --创建触发器  
  create   trigger   a_to_b  
  on   a  
  for   update  
  as  
  select   *   into   #1   from   inserted  
  select   *   into   #2   from   deleted  
  update   b   set   id=A.id   from   b,   #1   A   ,   #2   BB   where   BB.id=b.id    
  drop   table   #1  
  drop   table   #2  
   
  go  
   
  --插入数据  
  insert   a   select   1,'AAAAA'   union   select   2,'A2324'  
  insert   b   select   1,1   union   select   2,0  
   
  --更新一条数据  
  update   a   set   id=100   where   id=2  
  --更新多条数据  
  update   a   set   id=1000  
   
  --查询结果  
  select   *   from   a  
  select   *   from   b  
   
  --删除测试环境  
  drop   table   a  
  drop   table   b  
  Top

7 楼nsqsmile(阿南)回复于 2005-06-21 02:40:19 得分 0

vivianfdlpw()   你的测试的和我问题中的有什么不同?Top

8 楼xiaonvjing(飞扬)回复于 2005-06-21 04:13:49 得分 1

 
  首先我解释一下:  
  系统在处理update动作时,它先删除该条记录,然后再添加一条符合条件的记录  
  在使用update触发器时,你可以根据自己的需求,如果你需要新添加的记录,  
  你可以选择inserted   表(当激活触发器时,新添加的记录被保存在inserted表中);  
  如果你需要修改后的那条记录,你可以使用deleted表(当触发器被激活后,修改前的  
  那条记录被保存在deleted表)中。当触发器执行完成后,这两个表即被删除。Top

9 楼xiaonvjing(飞扬)回复于 2005-06-21 04:43:09 得分 1

现在将你的代码,改一下就可以啦。  
  也就是 vivianfdlpw() 的方法,是对的  
   
  create   trigger   tt  
  on   a  
  for   update  
  as  
    if   update(id)  
  begin  
          update   b   set   id=(select   id   from   inserted)   where   id   in   (select   id   from   deleted)  
  end  
   
  解释一下:  
  id=(select   id   from   inserted)   
  当触发器被激活后,就有inserted这个表,这个表此时,就保存了你刚刚修改a表后的id.  
  此时,你将新修改后的id赋值给b表,就ok啦  
   
  找修改条件,需要修改前的ID   ,所以用到deleted这个表,不知我的解释你否明白。  
   
  Top

10 楼yesyesyes()回复于 2005-06-21 08:16:47 得分 18

最简单的方法就是两表的id建立级联更新关系,不要触发器Top

11 楼pengxuan(网虫先生)回复于 2005-06-21 09:01:31 得分 2

同意楼上的,建立两个表的的主键外键级联更新Top

12 楼xdhou(办公室坐久了,想晒晒太阳)回复于 2005-06-21 09:36:28 得分 1

建个唯一健就可以了.Top

相关问题

  • SQLSERVER 触发器
  • 当触发器是更新触发时,如何在触发器中定位deleted对应的inserted记录?
  • 关于触发器中的deleted和inserted问题
  • sqlserver触发器问题
  • SqlServer触发器问题
  • SQLServer触发器问题?
  • SQL SERVER 触发器中的INSERTED、DELETED,因问题简单,只能给10分
  • 请教 关于级联操作和触发器以及临时表Deleted、Inserted
  • 触发器中可不可以为inserted表 和 deleted 表建立索引 ?
  • 如何得到SQLSERVER触发器(删除型)中DELETED表中的值?

关键词

  • 修改
  • 数据
  • 触发器
  • 表
  • vivianfdlpw
  • inserted
  • 记录
  • 删除
  • deleted
  • update

得分解答快速导航

  • 帖主:nsqsmile
  • pbsql
  • vivianfdlpw
  • wangdehao
  • vivianfdlpw
  • vivianfdlpw
  • xiaonvjing
  • xiaonvjing
  • yesyesyes
  • pengxuan
  • xdhou

相关链接

  • SQL Server类图书

广告也精彩

反馈

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