增加下面的代码(假设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
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......)插入数据后,发现触发器直接触发,不知道是为什么。
-- 这个肯定是有其他的TR ,你不用查你现在这个TR 的代码,FOR UPDATE 不可能去触发 insert 事件。
-- 试试这个。
select* from sysobjects
where xtype = 'TR'
and parent_obj = object_id('d_stock')
感谢,lovelj2012!我测试了你给我的代码,有个奇怪的问题,还想再继续问问你加入了触发器后,我在表里面手动添加一条记录,给d_sto_qty,d_up两个字段输入值,d_sto_amt没有触发,我再修改d_sto_qty,d_up两个字段的值的时候,触发成功。这个就是我要的结果。但后来在前端实测插入新数据,用(insert into d_stock......)插入数据后,发现触发器直接触发,不知道是为什么。
d_stock还有其他触发器?
感谢,lovelj2012!我测试了你给我的代码,有个奇怪的问题,还想再继续问问你加入了触发器后,我在表里面手动添加一条记录,给d_sto_qty,d_up两个字段输入值,d_sto_amt没有触发,我再修改d_sto_qty,d_up两个字段的值的时候,触发成功。这个就是我要的结果。但后来在前端实测插入新数据,用(insert into d_stock......)插入数据后,发现触发器直接触发,不知道是为什么。
d_stock还有其他触发器?感谢大家的帮助,我仔细找了一下原因。找到问题所在,但不知道怎么解决。出现问题的原因:前端功能简介:从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也触发。
d_sto_amt=round(d_sto_qty*d_up,4)
加上条件,不过条件不好定你可以先更新上再插入,就不会影响到了
这样测试过,插入当前的当前记录没问题。下次再插入更新一条,而且d_id跟这个没关系的,也触发了。
这样测试过,插入当前的当前记录没问题。下次再插入更新一条,而且d_id跟这个没关系的,也触发了。应该是你这个没有限定条件,全表更新了
update d_stock set
d_sto_amt=round(d_sto_qty*d_up,4)
这样测试过,插入当前的当前记录没问题。下次再插入更新一条,而且d_id跟这个没关系的,也触发了。应该是你这个没有限定条件,全表更新了
update d_stock set
d_sto_amt=round(d_sto_qty*d_up,4)非常感谢ky_min,我对触发器不是很熟悉,我也一直在想这个问题。在前端,可以写 update d_sale set d_sal_aud=1 WHERE d_id = '" & d_id & "',其中d_id,这个变量可以有很多获取方式但在触发器中,我如果只想update 前端修改的那一条,这个d_id编号是怎么获取呢.
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
=0也要修改,只是我开始不知道怎么设置条件,在网上看别人的代码,自己照着修改,是不是应该修改成WHERE T2.d_sto_qty>=0 AND T2.d_up>=0
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
在前端已经做了限制,不能为负数。还有个问题,刚才那代码放进去测试,提说“GO”附近有语法错误,我就把最后那个GO删除了,用的SQL2000,是不是老版本不支持这个语法,删除了有没其它的影响。
我也不清楚是怎么报错,可能是SQL2000的原因,你可能操作的问题你应该是在查询分析器里面执行的吧