请帮忙看看这个触发器那里有问题,本来是更新触发,现在插入,更新都触发。

half_fire 2015-01-25 05:26:33

CREATE TRIGGER [amt_total] ON dbo.d_stock
FOR UPDATE
AS
if(exists(select d_sto_qty,d_up from inserted where isnull(d_sto_qty,0)>0 and isnull(d_up,0)>0))
update d_stock set
d_sto_amt=round(d_sto_qty*d_up,4)



本来想要的结果是 当d_stock表中的,任何一行 d_sto_qty,d_up这2个字段发生改变的时候,自动计算d_sto_amt,没有改变的不计算。

现在问题是,一条新插入的数据,当d_sto_qty,d_up都有值的时候,也马上触发了。

请大家帮我改一下,改成插入的时候不触发,当d_sto_qty,d_up两个字段,其中任何一个字段的值发生改变的时候触发,谢谢。
...全文
249 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
还在加载中灬 2015-01-26
  • 打赏
  • 举报
回复
那个是显示的标示批处理结束,在查询分析器里面使用,于你的功能上没有影响 我也不清楚是怎么报错,可能是SQL2000的原因,你可能操作的问题 你应该是在查询分析器里面执行的吧
half_fire 2015-01-26
  • 打赏
  • 举报
回复
引用 19 楼 ky_min 的回复:
嗯,是的,根据业务的完整性,如果更新为负数呢,原来的值需要怎么处理呢
在前端已经做了限制,不能为负数。 还有个问题,刚才那代码放进去测试,提说“GO”附近有语法错误,我就把最后那个GO删除了,用的SQL2000,是不是老版本不支持这个语法,删除了有没其它的影响。
还在加载中灬 2015-01-26
  • 打赏
  • 举报
回复
嗯,是的,根据业务的完整性,如果更新为负数呢,原来的值需要怎么处理呢
half_fire 2015-01-26
  • 打赏
  • 举报
回复
如果想要 插入数据的时候也触发,是不是只用这样修改

CREATE TRIGGER [amt_total] ON dbo.d_stock
FOR INSERT, UPDATE 
AS
UPDATE T1
SET d_sto_amt=round(T1.d_sto_qty*T1.d_up,4)
FROM d_stock T1
    JOIN INSERTED T2 ON T1.d_id=T2.d_id
WHERE T2.d_sto_qty>=0 AND T2.d_up>=0
GO
half_fire 2015-01-26
  • 打赏
  • 举报
回复
引用 16 楼 ky_min 的回复:
我好奇,你在d_sto_qty>0 d_up>0的时候更新d_sto_amt 在d_sto_qty或d_up更新为0的时候,不去改吗?
=0也要修改,只是我开始不知道怎么设置条件,在网上看别人的代码,自己照着修改,是不是应该修改成 WHERE T2.d_sto_qty>=0 AND T2.d_up>=0
还在加载中灬 2015-01-26
  • 打赏
  • 举报
回复
我好奇,你在d_sto_qty>0 d_up>0的时候更新d_sto_amt 在d_sto_qty或d_up更新为0的时候,不去改吗?
还在加载中灬 2015-01-26
  • 打赏
  • 举报
回复
不清楚你的具体业务,不过,我觉得你的代码可以这样
CREATE TRIGGER [amt_total] ON dbo.d_stock
FOR UPDATE 
AS
UPDATE T1
SET d_sto_amt=round(T1.d_sto_qty*T1.d_up,4)
FROM d_stock T1
	JOIN INSERTED T2 ON T1.d_id=T2.d_id
WHERE T2.d_sto_qty>0 AND T2.d_up>0
GO
half_fire 2015-01-26
  • 打赏
  • 举报
回复
引用 13 楼 ky_min 的回复:
[quote=引用 12 楼 half_fire 的回复:] [quote=引用 11 楼 ky_min 的回复:] ADO,那就没什么特别了 如你说的原因,在update d_stock set d_sto_amt=round(d_sto_qty*d_up,4) 加上条件,不过条件不好定 你可以先更新上再插入,就不会影响到了
这样测试过,插入当前的当前记录没问题。 下次再插入更新一条,而且d_id跟这个没关系的,也触发了。[/quote]应该是你这个没有限定条件,全表更新了 update d_stock set d_sto_amt=round(d_sto_qty*d_up,4)[/quote] 非常感谢ky_min,我对触发器不是很熟悉,我也一直在想这个问题。 在前端,可以写 update d_sale set d_sal_aud=1 WHERE d_id = '" & d_id & "',其中d_id,这个变量可以有很多获取方式 但在触发器中,我如果只想update 前端修改的那一条,这个d_id编号是怎么获取呢.
还在加载中灬 2015-01-26
  • 打赏
  • 举报
回复
引用 12 楼 half_fire 的回复:
[quote=引用 11 楼 ky_min 的回复:] ADO,那就没什么特别了 如你说的原因,在update d_stock set d_sto_amt=round(d_sto_qty*d_up,4) 加上条件,不过条件不好定 你可以先更新上再插入,就不会影响到了
这样测试过,插入当前的当前记录没问题。 下次再插入更新一条,而且d_id跟这个没关系的,也触发了。[/quote]应该是你这个没有限定条件,全表更新了 update d_stock set d_sto_amt=round(d_sto_qty*d_up,4)
half_fire 2015-01-26
  • 打赏
  • 举报
回复
引用 11 楼 ky_min 的回复:
ADO,那就没什么特别了 如你说的原因,在update d_stock set d_sto_amt=round(d_sto_qty*d_up,4) 加上条件,不过条件不好定 你可以先更新上再插入,就不会影响到了
这样测试过,插入当前的当前记录没问题。 下次再插入更新一条,而且d_id跟这个没关系的,也触发了。
还在加载中灬 2015-01-26
  • 打赏
  • 举报
回复
ADO,那就没什么特别了 如你说的原因,在update d_stock set d_sto_amt=round(d_sto_qty*d_up,4) 加上条件,不过条件不好定 你可以先更新上再插入,就不会影响到了
half_fire 2015-01-26
  • 打赏
  • 举报
回复
引用 7 楼 ky_min 的回复:
如上面说的,可能有其它触发器 还有可能与你使用的连接数据库的组件有关,我想了解你使用的是什么组件呢
用的ADO
half_fire 2015-01-26
  • 打赏
  • 举报
回复
引用 8 楼 lovelj2012 的回复:
[quote=引用 2 楼 half_fire 的回复:] [quote=引用 1 楼 lovelj2012 的回复:] 增加下面的代码(假设id是表d_stock的主键)

declare @id_i int,@id_d int
select @id_i=id from inserted
select @id_d =id from deleted
if @id_i is not null and @id_d is not null --更新操作
begin
      ---执行你上面的东东
end
插入,inserted表有记录 更新(update)=delete+insert
感谢,lovelj2012! 我测试了你给我的代码,有个奇怪的问题,还想再继续问问你 加入了触发器后,我在表里面手动添加一条记录,给d_sto_qty,d_up两个字段输入值,d_sto_amt没有触发,我再修改d_sto_qty,d_up两个字段的值的时候,触发成功。这个就是我要的结果。 但后来在前端实测插入新数据,用(insert into d_stock......)插入数据后,发现触发器直接触发,不知道是为什么。 [/quote] d_stock还有其他触发器?[/quote] 感谢大家的帮助,我仔细找了一下原因。找到问题所在,但不知道怎么解决。 出现问题的原因: 前端功能简介: 从d_stock中按数量取出id对应的数据,然后合并计算生成一条新的数据并插入,最后把取出的数据按d_id在表中扣减更新 d_id d_up d_sto_qty d_sto_amt a 5 100 500 b 6 200 1200 如上表:d_id是主键 我要把表中id=a的数量取50,id=b的数量取100,来计算出一个新的数据, 新数据 数量 = a(50)+b(100) =150 新数据 单价 = ((50*5)+(100*6))/150 =850/150= 5.67 这个时候在前端提交的时候有2个动作: 1、是插入新记录 把新算出来的数据 插入表 2、更新记录 把a,b对应的数量扣减 更新后的表 d_id d_up d_sto_qty d_sto_amt a 5 50 250 b 6 100 600 c 5.67 150 850 (新数据) 目前找到的问题就是 只做插入动作,触发器正常触发(插入不触发,更新触发) 但在插入后,再做旧数据更新时,插入的新数据触发了。 本来是按d_id :a,b更新,但c也触发。
江南小鱼 2015-01-26
  • 打赏
  • 举报
回复
引用 2 楼 half_fire 的回复:
[quote=引用 1 楼 lovelj2012 的回复:] 增加下面的代码(假设id是表d_stock的主键)

declare @id_i int,@id_d int
select @id_i=id from inserted
select @id_d =id from deleted
if @id_i is not null and @id_d is not null --更新操作
begin
      ---执行你上面的东东
end
插入,inserted表有记录 更新(update)=delete+insert
感谢,lovelj2012! 我测试了你给我的代码,有个奇怪的问题,还想再继续问问你 加入了触发器后,我在表里面手动添加一条记录,给d_sto_qty,d_up两个字段输入值,d_sto_amt没有触发,我再修改d_sto_qty,d_up两个字段的值的时候,触发成功。这个就是我要的结果。 但后来在前端实测插入新数据,用(insert into d_stock......)插入数据后,发现触发器直接触发,不知道是为什么。 [/quote] d_stock还有其他触发器?
还在加载中灬 2015-01-26
  • 打赏
  • 举报
回复
如上面说的,可能有其它触发器 还有可能与你使用的连接数据库的组件有关,我想了解你使用的是什么组件呢
hepe00 2015-01-26
  • 打赏
  • 举报
回复
在更新触发器中做一个更新的标记,然后插入一条记录。然后就看到是不是这个触发器的为问题了, 不要找错了方向。
卖水果的net 版主 2015-01-26
  • 打赏
  • 举报
回复

-- 这个肯定是有其他的TR ,你不用查你现在这个TR 的代码,FOR UPDATE  不可能去触发 insert 事件。
-- 试试这个。
select* from sysobjects 
where xtype = 'TR' 
and parent_obj = object_id('d_stock')
knife_s 2015-01-25
  • 打赏
  • 举报
回复
检查一下,是不是有其他的触发器:)
half_fire 2015-01-25
  • 打赏
  • 举报
回复
引用 1 楼 lovelj2012 的回复:
增加下面的代码(假设id是表d_stock的主键)

declare @id_i int,@id_d int
select @id_i=id from inserted
select @id_d =id from deleted
if @id_i is not null and @id_d is not null --更新操作
begin
      ---执行你上面的东东
end
插入,inserted表有记录 更新(update)=delete+insert
有个问题可能开始没说清楚,在插入数据的时候,需要触发的字段,d_sto_amt开始是有数据插入的。 我要的结果是,第一次插入的数据不管它,等d_sto_qty,d_up两个字段的值有修改的时候,触发器启动,重新计算d_sto_amt的值
half_fire 2015-01-25
  • 打赏
  • 举报
回复
引用 1 楼 lovelj2012 的回复:
增加下面的代码(假设id是表d_stock的主键)

declare @id_i int,@id_d int
select @id_i=id from inserted
select @id_d =id from deleted
if @id_i is not null and @id_d is not null --更新操作
begin
      ---执行你上面的东东
end
插入,inserted表有记录 更新(update)=delete+insert
感谢,lovelj2012! 我测试了你给我的代码,有个奇怪的问题,还想再继续问问你 加入了触发器后,我在表里面手动添加一条记录,给d_sto_qty,d_up两个字段输入值,d_sto_amt没有触发,我再修改d_sto_qty,d_up两个字段的值的时候,触发成功。这个就是我要的结果。 但后来在前端实测插入新数据,用(insert into d_stock......)插入数据后,发现触发器直接触发,不知道是为什么。
加载更多回复(1)

34,590

社区成员

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

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