触发器的问题,解决后马上给分..........很急!!!!!!!!!!!!!!!!!!!!!!!!

leo_0205 2005-07-09 10:54:34
触发器执行结果正确,但是触发器里UPDATE过的表反应迟钝,大概要一分钟左右才能打开,好像是死锁的症状.打开后所有数据的更新全部达到了预期效果

请问这是为什么,本人很少写触发器,请高手指点

下面是po_receipt_goods的UPDATE触发器
主要意图是:当po_receipt_goods.state = '1' And po_receipt_goods.unok_yes = '0' 那么执行相关内容,更改po_buy_details.RECEIPT_QTY和 bs_lot.unit_qty



CREATE trigger tr_u_receipt_goods on dbo.po_receipt_goods
for update

as
declare @company_id char(10),
@receipt_id char(12),
@state char(1),
@unok_yes char(1)
Select @company_id = company_id,
@receipt_id = id,
@state = state,
@unok_yes=unok_yes from inserted

begin
if @state='1' and @unok_yes='0'
begin
--------------------------------------------------------
DECLARE @rec_state char(1),
@goods_id char(10),
@rec_line_num int,
@rec_receipt_qty decimal(14,4),
@po_id char(12),
@po_line_num int,
@vendor_id char(10),
@lot_id char(10)
SELECT @rec_state = state
from po_receipt_goods
WHERE company_id = @company_id And id = @receipt_id
If @rec_state = '1'
BEGIN
DECLARE cur_receipt_dtl CURSOR FOR
SELECT po_receipt_details.goods_id,
po_receipt_details.line_num,
po_receipt_details.receipt_qty,
po_receipt_details.lot_id,
po_receipt_details.po_id,
po_receipt_details.po_line_num,
po_receipt_goods.vendor_id
FROM po_receipt_details INNER JOIN
po_receipt_goods ON
po_receipt_details.company_id = po_receipt_goods.company_id AND
po_receipt_details.id = po_receipt_goods.id
WHERE po_receipt_details.company_id = @company_id And po_receipt_details.id = @receipt_id
BEGIN TRANSACTION TR_POST_RECEIPT
OPEN cur_receipt_dtl
FETCH NEXT FROM cur_receipt_dtl INTO @goods_id,@rec_line_num,@rec_receipt_qty,@lot_id,@po_id,@po_line_num,@vendor_id
WHILE @@FETCH_STATUS = 0
BEGIN
UPDATE po_buy_details SET receipt_qty = receipt_qty + @rec_receipt_qty
WHERE company_id = @company_id And id = @po_id And line_num = @po_line_num
if @@rowcount=0
begin
ROLLBACK TRANSACTION TR_POST_RECEIPT
end
UPDATE bs_lot SET unit_qty = unit_qty + @rec_receipt_qty
WHERE company_id = @company_id And id = @goods_id And lot_id = @lot_id And vendor_id = @vendor_id
if @@rowcount=0
begin
ROLLBACK TRANSACTION TR_POST_RECEIPT
end
FETCH NEXT FROM cur_receipt_dtl INTO @goods_id,@rec_line_num,@rec_receipt_qty,@lot_id,@po_id,@po_line_num,@vendor_id
END

CLOSE cur_receipt_dtl
DEALLOCATE cur_receipt_dtl
COMMIT TRANSACTION TR_POST_RECEIPT
END
ELSE
BEGIN
ROLLBACK TRANSACTION TR_POST_RECEIPT
END


-------------------------------------------------------------------
end
END



...全文
179 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
leo_0205 2005-07-09
  • 打赏
  • 举报
回复
TO: Frewin(Frewin)
如果在旧社会我一定叫你一声"老大"
现在只能说,大哥,太感谢了,

hsj20041004 2005-07-09
  • 打赏
  • 举报
回复
你的触发器中使用游标,当然慢了
Frewin 2005-07-09
  • 打赏
  • 举报
回复
如,应该采用这种方法,具体的,你自己修改

Update po_buy_details Set receipt_qty = Isnull(receipt_qty,0) +T.receipt_qty From(SELECT po_receipt_details.goods_id,
po_receipt_details.line_num,
po_receipt_details.receipt_qty,
po_receipt_details.lot_id,
po_receipt_details.po_id,
po_receipt_details.po_line_num,
po_receipt_goods.vendor_id
FROM po_receipt_details INNER JOIN
po_receipt_goods ON
po_receipt_details.company_id = po_receipt_goods.company_id AND
po_receipt_details.id = po_receipt_goods.id
WHERE po_receipt_details.company_id = @company_id And po_receipt_details.id = @receipt_id)T
WHERE po_buy_details.company_id = @company_id And po_buy_details.id = @po_id And line_num = @po_line_num
Frewin 2005-07-09
  • 打赏
  • 举报
回复
请在更新时不要用游标。
filebat 2005-07-09
  • 打赏
  • 举报
回复
呵呵, 好长哦

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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