增加下面的代码(假设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

解决方案 »

  1.   


    感谢,lovelj2012!我测试了你给我的代码,有个奇怪的问题,还想再继续问问你加入了触发器后,我在表里面手动添加一条记录,给d_sto_qty,d_up两个字段输入值,d_sto_amt没有触发,我再修改d_sto_qty,d_up两个字段的值的时候,触发成功。这个就是我要的结果。但后来在前端实测插入新数据,用(insert into d_stock......)插入数据后,发现触发器直接触发,不知道是为什么。
      

  2.   

    有个问题可能开始没说清楚,在插入数据的时候,需要触发的字段,d_sto_amt开始是有数据插入的。我要的结果是,第一次插入的数据不管它,等d_sto_qty,d_up两个字段的值有修改的时候,触发器启动,重新计算d_sto_amt的值
      

  3.   


    -- 这个肯定是有其他的TR ,你不用查你现在这个TR 的代码,FOR UPDATE  不可能去触发 insert 事件。
    -- 试试这个。
    select* from sysobjects 
    where xtype = 'TR' 
    and parent_obj = object_id('d_stock')
      

  4.   


    感谢,lovelj2012!我测试了你给我的代码,有个奇怪的问题,还想再继续问问你加入了触发器后,我在表里面手动添加一条记录,给d_sto_qty,d_up两个字段输入值,d_sto_amt没有触发,我再修改d_sto_qty,d_up两个字段的值的时候,触发成功。这个就是我要的结果。但后来在前端实测插入新数据,用(insert into d_stock......)插入数据后,发现触发器直接触发,不知道是为什么。
    d_stock还有其他触发器?
      

  5.   


    感谢,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也触发。
      

  6.   

    ADO,那就没什么特别了如你说的原因,在update d_stock set
              d_sto_amt=round(d_sto_qty*d_up,4)
    加上条件,不过条件不好定你可以先更新上再插入,就不会影响到了
      

  7.   


    这样测试过,插入当前的当前记录没问题。下次再插入更新一条,而且d_id跟这个没关系的,也触发了。
      

  8.   


    这样测试过,插入当前的当前记录没问题。下次再插入更新一条,而且d_id跟这个没关系的,也触发了。应该是你这个没有限定条件,全表更新了
    update d_stock set
              d_sto_amt=round(d_sto_qty*d_up,4)
      

  9.   


    这样测试过,插入当前的当前记录没问题。下次再插入更新一条,而且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编号是怎么获取呢.
      

  10.   

    不清楚你的具体业务,不过,我觉得你的代码可以这样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
      

  11.   

    我好奇,你在d_sto_qty>0  d_up>0的时候更新d_sto_amt在d_sto_qty或d_up更新为0的时候,不去改吗?
      

  12.   


    =0也要修改,只是我开始不知道怎么设置条件,在网上看别人的代码,自己照着修改,是不是应该修改成WHERE T2.d_sto_qty>=0 AND T2.d_up>=0
      

  13.   

    如果想要 插入数据的时候也触发,是不是只用这样修改
    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
      

  14.   


    在前端已经做了限制,不能为负数。还有个问题,刚才那代码放进去测试,提说“GO”附近有语法错误,我就把最后那个GO删除了,用的SQL2000,是不是老版本不支持这个语法,删除了有没其它的影响。
      

  15.   

    那个是显示的标示批处理结束,在查询分析器里面使用,于你的功能上没有影响
    我也不清楚是怎么报错,可能是SQL2000的原因,你可能操作的问题你应该是在查询分析器里面执行的吧