为什么这个触发器触发了2次

aqiang1979 2007-01-17 01:22:39
CREATE TRIGGER Fnumber_t_ICitemCore_INSERT ON dbo.t_ICitemCore
WITH ENCRYPTION
FOR INSERT
AS

DECLARE

@ItemID int,
@fshortnumber varchar(100),
@fnumber varchar(100),
@maxfshortnumber varchar(100),
@maxfnumber varchar(100),
@fparentid int


SELECT @ItemID=Fitemid,@fparentid=fparentid
FROM INSERTED
if(@@rowcount=1)
begin
select @maxfnumber=max(Fnumber) from t_ICitemCore where fparentid=@fparentid
select @fnumber=right('000'+rtrim(replace(@maxfnumber,'.','')+1),5)
select @fnumber=stuff(stuff(@fnumber, 2, 0, '.'), 4, 0, '.')
select @maxfshortnumber=right(@fnumber,3)
update t_ICitemCore set fnumber=@fnumber,fshortnumber=@fshortnumber where fitemid=@ItemID
update t_item set fnumber=@fnumber,fshortnumber=@fshortnumber,ffullnumber=@fnumber where fitemid=@ItemID
insert test values(1,2)
end

编码老是+2递增,我建了表test确实进去2条记录,这是为什么
...全文
227 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
aqiang1979 2007-01-17
  • 打赏
  • 举报
回复
我用Instead of在test表是只有插入一条而用了For则插入了2条
是啊,我是在别人开发的应用程序上写触发器的
我跟踪了一下,我上面的表通过视图插入的,那这种情况会连续触发2次吗?
rookie_one 2007-01-17
  • 打赏
  • 举报
回复
我试验了一下,
情况1:Instead of触发器,其他结构与lz相同,
外围的数值没有被插入,但是test表插入正常的一条记录
情况2:For触发器,其他结构与搂住相同,
外围数值插入正常,test表插入一条
无奈了,不知道lz这个怎么回事。。。

aqiang1979 2007-01-17
  • 打赏
  • 举报
回复
不行啊,出错了
用了INSTEAD OF是不是本来要插入的没有插入呀
rookie_one 2007-01-17
  • 打赏
  • 举报
回复
AFTER

指定触发器只有在触发 SQL 语句中指定的所有操作都已成功执行后才激发。所有的引用级联操作和约束检查也必须成功完成后,才能执行此触发器。

如果仅指定 FOR 关键字,则 AFTER 是默认设置。


INSTEAD OF

指定执行触发器而不是执行触发 SQL 语句,从而替代触发语句的操作。

rookie_one 2007-01-17
  • 打赏
  • 举报
回复
FOR触发器是等语句执行完之后再触发你指定的语句

INSTEAD OF则是代替本要执行的语句。
aqiang1979 2007-01-17
  • 打赏
  • 举报
回复
OK了,谢谢,这是为什么呀,我以前好象没碰到过
marco08 2007-01-17
  • 打赏
  • 举报
回复
--try

CREATE TRIGGER Fnumber_t_ICitemCore_INSERT ON dbo.t_ICitemCore
WITH ENCRYPTION
INSTEAD OF INSERT
AS

DECLARE

@ItemID int,
@fshortnumber varchar(100),
@fnumber varchar(100),
@maxfshortnumber varchar(100),
@maxfnumber varchar(100),
@fparentid int


SELECT @ItemID=Fitemid,@fparentid=fparentid
FROM INSERTED
if(@@rowcount=1)
begin
select @maxfnumber=max(Fnumber) from t_ICitemCore where fparentid=@fparentid
select @fnumber=right('000'+rtrim(replace(@maxfnumber,'.','')+1),5)
select @fnumber=stuff(stuff(@fnumber, 2, 0, '.'), 4, 0, '.')
select @maxfshortnumber=right(@fnumber,3)
update t_ICitemCore set fnumber=@fnumber,fshortnumber=@fshortnumber where fitemid=@ItemID
update t_item set fnumber=@fnumber,fshortnumber=@fshortnumber,ffullnumber=@fnumber where fitemid=@ItemID
insert test values(1,2)
end
marco08 2007-01-17
  • 打赏
  • 举报
回复
定議成替代觸發器試試INSTEAD OF

34,590

社区成员

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

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