邹建等等等各路高手,关于触发器!如何禁用递归调用触发器?

wumylove1234 2004-11-16 03:24:59
CREATE TRIGGER [Update_ChildWareID] ON [dbo].[t_goodlctn_std]
FOR UPDATE
AS
declare @Lctn_Order int
declare @OldWareID int
declare @NewWareID int
declare @strSql varchar(8000)
declare @Lctn_Id varchar(50)
IF Update(Ware_id)
Begin
select @OldWareID=Ware_Id from deleted
select @Lctn_ID=Lctn_ID,@NewWareID=ware_Id,@Lctn_order=lctn_order from inserted
if @OldWareId<>@NewWareId
Begin
set @strSql='update t_goodlctn_std set ware_id='+cast(@NewWareID as varchar(10))+'where '
select @strSql=
Case
when @Lctn_order=0 then @strSql+'substring(Lctn_id,1,1)'
when @Lctn_order=1 then @strSql+'substring(Lctn_id,1,3)'
when @Lctn_order=2 then @strSql+'substring(Lctn_id,1,4)'
when @Lctn_order=3 then @strSql+' Lctn_id'
End
set @strSql=@strSql+'='+''''+@Lctn_id+''''
exec(@strSql)
End
End


CREATE TABLE [dbo].[t_goodlctn_std] (
[lctn_id] [varchar] (30) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[lctn_name] [varchar] (30) COLLATE Chinese_PRC_CI_AS NULL ,
[length] [decimal](10, 0) NULL ,
[width] [decimal](10, 0) NULL ,
[high] [decimal](10, 0) NULL ,
[goodtype_id] [int] NULL ,
[hold_num] [decimal](18, 0) NULL ,
[digt_id] [int] NULL ,
[ware_id] [int] NULL ,
[parent_lctn] [varchar] (30) COLLATE Chinese_PRC_CI_AS NULL ,
[lctn_order] [smallint] NOT NULL
) ON [PRIMARY]

其中,Lctn_ID是有编码规则的.
仓库级:1位; 料斗2位; 层:1位; 货盒:2位
例如A01B01,代表:A号仓库,01号料斗,B层,01号货盒

现在要求当更改某级的记录的Ware_id时,要求下级也要随着更改,我采用了触发器,但是我现在不知道它具体的工作流程.举个例子来说:
有四条记录
Lctn_id Ware_ID
A 1
A01 1
A01B 1
A01B01 1

这样,如果更新第一条记录,Lctn_ID为A的Ware_id为2,则触发器将2,3,4的Ware_id都改成2,但是我想了一下这是个递归的调用,因为当触发器更新A01时,实际上又触发了Update触发器.......这肯定要花费时间,而我要求它只进行一次Update就可以了.

现在请问:1/我设计的触发器有没有问题?
2/如果我的是正确的,如果实现禁用递归?
...全文
206 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
wumylove1234 2004-11-16
  • 打赏
  • 举报
回复
啊.原来是这样啊!又学一手,好了问题解决,结帖.
zjcxc 元老 2004-11-16
  • 打赏
  • 举报
回复
和程序中的递归是一样的嘛

create proc p_test
@a int
as
if @a<10
begin
set @a=@a+1
exec p_test @a
end
go

--调用
exec p_test 2
wumylove1234 2004-11-16
  • 打赏
  • 举报
回复
无论你怎么写,都要用到递归算法,因为SQL不支持语句上的直接递归


嗯.我看了,现在确实是"允许嵌套"的设置.

你说要用到递归算法?这个我用其它的程序设计语言可以实现,用TSQL也可以吗???

能举个例子吗?

我从没想过TSQL也能用递归算法!
zjcxc 元老 2004-11-16
  • 打赏
  • 举报
回复
无论你怎么写,都要用到递归算法,因为SQL不支持语句上的直接递归
sdhdy 2004-11-16
  • 打赏
  • 举报
回复
企业管理器 右键 服务器-》属性-》服务器设置-》服务器行为-》去掉允许会激发其他触发器的触发器的选项 试试
zjcxc 元老 2004-11-16
  • 打赏
  • 举报
回复
你要设置允许递归才行

exec sp_dboption '库名','recursive triggers','true'
wumylove1234 2004-11-16
  • 打赏
  • 举报
回复
啊.楼上这么快.
那再请问,用Sp的存储过程如何设置呢?
因为有时候,可能要在触发器内部临时更改选项!
wumylove1234 2004-11-16
  • 打赏
  • 举报
回复
我刚才测试了一下,在触发器里写了一条Print,我改了记录之后就输出了一条Print,看来是没有递归调用,那如何调归调用呢?
up0point 2004-11-16
  • 打赏
  • 举报
回复
企业管理器->服务器->属性->服务器设置->允许激发会激发其它触发器(嵌套触发器)的触发器
勾上即可以嵌套,否则不会嵌套。

34,576

社区成员

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

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