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

关于嵌套触发

楼主firefly_xu(萤火虫)2003-12-02 16:42:33 在 MS-SQL Server / 基础类 提问

我有两个表:eq表和server表  
  eq表有num(关键字)、state等几个字段  
  server表有id(关键字)、num(非关键字)、state、acceptdate等几个字段  
  我在server表设置了一个UPDATE触发器,代码如下:  
   
  CREATE   TRIGGER   [serupdate]   ON   dbo.server_t    
  FOR   UPDATE  
  AS  
  declare   @xh   int,@bh   char(10),@accdate   datetime,@st   nchar(10)  
   
  select   @bh=num   from   updated  
   
  select   @accdate=max(acceptdate)   from   server_t   where   num=@bh  
   
  select   @st=state   from   server_t   where   num=@bh   and   acceptdate=@accdate  
   
  update   equipment   set   state=@st   where   num=@bh   and   state!=@st  
   
  作用是当server表里的记录更新的时候,保存被更新记录的num字段值到bh里,  
  找出表中num字段等于此值并且acceptdate为最大的那条的state值。用此  
  state值更新eq表中num字段等于bh的那条记录的state值。  
   
  现在我希望建立一个eq表和server表之间的关系:  
  主键为eq.num,外键为server.num。目的是对server表的num字段进行级联更新  
  (这也是server表的num字段的唯一更新方式,我的前台程序不会提供单独更新  
  server表的num字段的途径)。但是在保存时报错:  
  “'eq'   表成功保存  
  'server'   表  
  -   不能创建关系   'FK_server_eq'。      
  ODBC   错误:   [Microsoft][ODBC   SQL   Server   Driver][SQL   Server]将   FOREIGN   KEY    
  约束   'FK_server_eq'   引入表   'server'   中将导致循环或多重级联路径。  
  请指定   ON   DELETE   NO   ACTION   或   ON   UPDATE   NO   ACTION,或修改其它   FOREIGN   KEY    
  约束。[Microsoft][ODBC   SQL   Server   Driver][SQL   Server]未能创建约束。  
  请参阅前面的错误信息。”  
  我知道这肯定是嵌套触发引起的,(我的“服务器设置->允许激发会激发其它触发  
  器”选项是设置的允许嵌套。)请问高手该怎样解决,谢谢!! 问题点数:100、回复次数:5Top

1 楼w_rose(w_rose)回复于 2003-12-02 17:29:57 得分 100

我知道这肯定是嵌套触发引起的  
  --------------------------------------->  
  不是。  
   
  SQL   Server不允许你定义两个表同时两个表中的外键指向对方。  
   
  在建立表结构时去掉一方的外键,该而使用触发器来实现数据记录的关联。Top

2 楼w_rose(w_rose)回复于 2003-12-02 17:37:28 得分 0

另外,你的触发器写法有问题:  
   
  1.   不能处理多条记录的情况。“select   @bh=num   from   updated”只能得到updated的所有记录的最后一条。  
   
  2.   累赘。这样的逻辑,只要一条SQL语句就可以写好了,比你的应该简短、清楚。Top

3 楼txlicenhe(马可)回复于 2003-12-02 17:43:45 得分 0

你这不是SQL   Server的触发器吧?  
  CREATE   TRIGGER   [serupdate]   ON   dbo.server_t    
  FOR   UPDATE  
  AS  
  declare   @xh   int,@bh   char(10),@accdate   datetime,@st   nchar(10)  
   
  select   @bh=num   from   updated         --   有这个表吗?(有也只能取到一条)  
   
  select   @accdate=max(acceptdate)   from   server_t   where   num=@bh  
   
  select   @st=state   from   server_t   where   num=@bh   and   acceptdate=@accdate  
   
  update   equipment   set   state=@st   where   num=@bh   and   state!=@st  
   
  (!=是什么用法,SQL中用   <>Top

4 楼firefly_xu(萤火虫)回复于 2003-12-02 17:51:37 得分 0

w_rose(w_rose)    
  ”这样的逻辑,只要一条SQL语句就可以写好了,比你的应该简短、清楚。“  
  请问怎么实现?Top

5 楼firefly_xu(萤火虫)回复于 2003-12-02 17:53:55 得分 0

确实,此触发器不能处理多条记录的情况。请问高手有处理多条记录的方法吗?Top

相关问题

  • 关于SQL触发器的嵌套
  • 如何在存储过程或触发器里 临时禁用触发器的嵌套?
  • 急!在SQL SERVER 7 中,默认是否允许触发器嵌套?
  • 超出了存储过程、函数、触发器或视图的最大嵌套层数最大层数为 32
  • "超出了存储过程,函数、触发器或视图的最大嵌套层数(最大层数为32)"是什么错误?,
  • 问一句话:javascript中嵌套的<%%>(即jsp语句)是页面加载时执行还是触发javascript时执行!?
  • 嵌套查询!
  • 嵌套(select)
  • 嵌套的datagrid?
  • datalist嵌套RadioButtonList

关键词

  • 字段
  • sql
  • server
  • 表
  • acceptdate
  • 触发器
  • 嵌套触发
  • bh
  • eq
  • 记录

得分解答快速导航

  • 帖主:firefly_xu
  • w_rose

相关链接

  • SQL Server类图书

广告也精彩

反馈

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