关于嵌套触发

firefly_xu 2003-12-02 04:42:33
我有两个表: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]未能创建约束。
请参阅前面的错误信息。”
我知道这肯定是嵌套触发引起的,(我的“服务器设置->允许激发会激发其它触发
器”选项是设置的允许嵌套。)请问高手该怎样解决,谢谢!!
...全文
29 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
firefly_xu 2003-12-02
  • 打赏
  • 举报
回复
确实,此触发器不能处理多条记录的情况。请问高手有处理多条记录的方法吗?
firefly_xu 2003-12-02
  • 打赏
  • 举报
回复
w_rose(w_rose)
”这样的逻辑,只要一条SQL语句就可以写好了,比你的应该简短、清楚。“
请问怎么实现?
txlicenhe 2003-12-02
  • 打赏
  • 举报
回复
你这不是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中用 <>
w_rose 2003-12-02
  • 打赏
  • 举报
回复
另外,你的触发器写法有问题:

1. 不能处理多条记录的情况。“select @bh=num from updated”只能得到updated的所有记录的最后一条。

2. 累赘。这样的逻辑,只要一条SQL语句就可以写好了,比你的应该简短、清楚。
w_rose 2003-12-02
  • 打赏
  • 举报
回复
我知道这肯定是嵌套触发引起的
--------------------------------------->
不是。

SQL Server不允许你定义两个表同时两个表中的外键指向对方。

在建立表结构时去掉一方的外键,该而使用触发器来实现数据记录的关联。

34,875

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧