当前位置: 代码迷 >> Sql Server >> SQL 触发器 疑义
  详细解决方案

SQL 触发器 疑义

热度:511   发布时间:2016-04-24 08:46:36.0
SQL 触发器 疑问
本帖最后由 maocheng82 于 2015-08-15 16:21:22 编辑
假设有个物料表ShouLiaoList  当更新物料表时  同时插入一个物料记录表LOG中

     如果物料表ShouLiaoList   某个单据  更新时,此单据的所有物料 将判断物料记录表LOG是否有该料号

如果没有 就插入该物料号和数量,如果有了 就更新该物料号的数量

代码如下

create   trigger [dbo].[update_shouliaolist]
on [dbo].[ShouLiaoList]
   for update --插入触发
as
     --更新后的数据
    select @chufaqi=chufaqi,@wuliaohao=wuliaohao,@sl=sl from Inserted;
if @chufaqi='1'--表示更新成功
    begin
if not exists(select * from log  where wuliaohao=@wuliaohao)--如果没有此物料记录,则插入
                insert into  Log values(@wuliaohao,@sl)
                ELSE
                update log set sl=sl+@sl where wuliaohao=@wuliaohao 
               end
可是如果在shouliaolist表中有两个相同的物料号同时更新  则不是我所说的要求,如图

在LOG表中,我本意是 只有一条 即数量sl是22 

为什么出现这样的情况  是不是当更新第一条数据时   插入这个命令没有执行    所以当执行第二条命令时 仍然是insert命令???

如果要实现我de要求 如何修改  谢谢大家




------解决思路----------------------
要注意,如果你的更新操作会影响多行数据,是有问题的。你这个触发器只能支持一行数据受影响的情况,如果有两行以上数据受影响,这个触发器是有问题的
------解决思路----------------------
你这个问题解决了没有,触发器如果有多条记录更新,可以参考下面的方案


CREATE TRIGGER [dbo].[update_shouliaolist]
ON dbo.ShouLiaoList 
AFTER INSERT
AS
BEGIN

--更新后的数据
SELECT 
wuliaohao,
SUM(sl) AS sl 
INTO 
#UpdList
FROM 
Inserted
GROUP BY 
wuliaohao

UPDATE 
aa
SET 
aa.sl = aa.sl + b.sl
FROM 
[log] aa INNER JOIN #UpdList b ON aa.wuliaohao = b.wuliaohao

INSERT dbo.log( 
wuliaohao, sl )
SELECT 
wuliaohao, sl
FROM 
#UpdList a
WHERE 
NOT EXISTS( SELECT * FROM log b WHERE a.wuliaohao = b.wuliaohao )

END
GO



引用:
Quote: 引用:
要注意,如果你的更新操作会影响多行数据,是有问题的。你这个触发器只能支持一行数据受影响的情况,如果有两行以上数据受影响,这个触发器是有问题的

我影响数据是多行。请问如何修改啊。

------解决思路----------------------
CREATE TRIGGER [dbo].[update_shouliaolist]
ON [dbo].[shouliaolist]
FOR UPDATE --插入触发
AS
    -- 先更新再插入,避免插入后再更新一次

    UPDATE Log
       SET sl = sl + inserted.sl
      FROM Log, inserted
     WHERE Log.wuliaohao = inserted.wuliaohao
       AND inserted.chufaqi = '1'

    INSERT INTO Log
    SELECT wuliaohao, sl
      FROM inserted
     WHERE chufaqi = '1'
       AND NOT EXISTS(SELECT *
                        FROM Log
                       WHERE Log.wuliaohao = inserted.wuliaohao)
  相关解决方案