sos,觸發器運行出錯,請大家幫忙(50分)

  • 主题发起人 SayForever
  • 开始时间
S

SayForever

Unregistered / Unconfirmed
GUEST, unregistred user!
我在一個主從表中定義了一個觸發器,當從表中某一列數據發生變化時,主表中漚總行作相應修改.
我前台先查詢出從表中數據進行修改,全部修改完后 成批 提交則出錯,提示說數據已發生更改錯誤.但數據以做了保存,且主表中數據也作了相應更改.
如果我只修改一條記錄提交則不會出現上述提示信息.
請各位大俠幫幫忙.多謝!
 
把的触发器贴出来,否则怎么知道你那里错了呀
 
Create Trigger TrgUpdateGoods On EnterDetail
AS
Declare @GoodsID Char(10)
Select @GoodsID=GoodsID From Inserted
if Update(EnterNumber)
begin
Update Goods Set StoreNumber=StoreNumber+((Select EnterNumber From Inserted)-(Select EnterNumber From Deleted) ) Where GoodsID=@GoodsID
end

意思是當修改進貨數量時, 庫存數=庫存數+(現在值-原來值)
 
是不是
Update Goods Set StoreNumber=StoreNumber
+((Select IsNull(EnterNumber,0) From Inserted)
-(Select IsNull(EnterNumber,0) From Deleted) )
Where GoodsID=@GoodsID
会更好一些
因为Installed 或Deleted 在一条记录中是不是不能同时存在
 
按spymaster兄所說的操作還是不行.
 
問題不見了,頂一下.
 
在AS后面第一行加上
Set Nocount On
试试看!
 
根據HeXiang Lee兄的方式還是不行,我這里是數據集成批修改提交,不知能不能實現.
 
大家幫幫忙,很急!
 
Sql-Server不支持EACH ROW的触发,比较麻烦。
你的应该改为
Create Trigger TrgUpdateGoods On EnterDetail
AS
Declare @GoodsID Char(10)
Select @GoodsID=GoodsID From Inserted
if Update(EnterNumber)
begin
Update Goods Set StoreNumber=StoreNumber+((Select Sum(EnterNumber) From Inserted)-(Select sum(EnterNumber) From Deleted) ) Where GoodsID=@GoodsID
end
 
沙隆巴斯的主人 兄可能理解有誤,我這里是一筆一筆的筆品進貨修改,然后在提交保存的時候再一筆一筆的對庫存作修改.
 
出现错误之后,数据都添加正确了吗??
你前端是在一个transaction里做的吗??
 
TO tomol兄,出錯之前數據都已更新正確,至于transaction,小弟不才有點不懂.
 
我原来碰见过这种问题,但那是由于关键字对不上才出现的,你
这个好像跟我那个不太相同。
你前端的代码能贴出来看看吗??
 
应该是:
CERATE TRIGGER TrgUpdateGoods ON EnterDetail
FOR UPDATE
AS
IF UPDATE(EnterNumber)
BEGIN
UPDATE Goods
SET A.StoreNumber = A.StoreNumber + B.EnterNumber
FROM Goods AS A,
(SELECT GoodsID, SUM(EnterNumber) EnterNumber FROM Inserted GROUP BY GoodsID) AS B
WHERE A.GoodsID = B.GoodsID
UPDATE Goods
SET A.StoreNumber = A.StoreNumber - B.EnterNumber
FROM Goods AS A,
(SELECT GoodsID, SUM(EnterNumber) EnterNumber FROM Deleted GROUP BY GoodsID) AS B
WHERE A.GoodsID = B.GoodsID
END

SQL提供的是集合的操作,Inserted和Deleted中可能有多条记录,而这多条记录又可能涉及多条主记录(就是Goods)。
你的方法及后面几位的方法或是假想Inserted、Deleted临时表中只有单条记录,或假想临时表中的多条记录只涉及主表中的一条记录,在你成批提交时当然就会错了。

顺便问一下,你是台湾的吗?用的是繁体
 
declare @inserted_quan decimal(12,2),
@deleted_quan decimal(12,2)

Select @inserted_quan = sum(IsNull(EnterNumber,0))
From Inserted Where GoodsID=@GoodsID

Select @deleted_quan = sum(IsNull(EnterNumber,0) )
From deleted Where GoodsID=@GoodsID

Update Goods
Set StoreNumber=StoreNumber+isnull(@inserted_quan,0)-insull(@deleted_quan,0)
Where GoodsID=@GoodsID

 
用以上兄弟的方法都出現原來的錯誤﹐我把錯誤提示內貼出來﹐大家幫我看看﹕
Row Cannot be located for updating . some values may have been changed sinceit was last read.
 
一個新發現﹐我的這個修改涉及到兩個觸發器﹐因為我這里有物品兩種情況﹐
一種是長期庫存﹐一種是臨時庫存﹐這兩種物品放在兩個單獨的表中﹐所以進貨的時候
要用觸發器相應修改兩個表﹐我剛才去掉了臨時庫存表的觸發器更新運行就可以了﹐
請問大家是不是不能同時有兩個Update觸發器﹖
 
問題已解決﹐我在觸發器里用了一個if語句判斷是為臨時庫存物品還是長期庫存物品﹐這樣
分開Update就OK了﹐把代碼貼出來大家分享﹕
CREATE TRIGGER [TrgUpGoodsEnt] ON [EnterDetail]
FOR UPDATE
AS
if update(EnterNumber)
begin
if (Select SubString(GoodsID,3,1) From Inserted)='Z'
begin
update TempGoods Set TStoreNumber=TStoreNumber+B.EnterNumber From TempGoods , (Select GoodsID,Sum(EnterNumber) 'EnterNumber' From Inserted Group By GoodsID ) B Where TempGoods.TGoodsID=B.GoodsID
update TempGoods Set TStoreNumber=TStoreNumber-B.EnterNumber From TempGoods , (Select GoodsID,Sum(EnterNumber) 'EnterNumber' From Deleted Group By GoodsID ) B Where TempGoods.TGoodsID=B.GoodsID
end
else
begin
update Goods Set StoreNumber=StoreNumber+B.EnterNumber From Goods , (Select GoodsID,Sum(EnterNumber) 'EnterNumber' From Inserted Group By GoodsID ) B Where Goods.GoodsID=B.GoodsID
update Goods Set StoreNumber=StoreNumber-B.EnterNumber From Goods , (Select GoodsID,Sum(EnterNumber) 'EnterNumber' From Deleted Group By GoodsID ) B Where Goods.GoodsID=B.GoodsID
end
end

在此多謝大家的幫助。
TO fangfei 兄﹕ 我不是台灣人﹐我是湖南人﹐不過現在在廣東的一家台資企業打工。
 
多人接受答案了。
 
顶部