设为首页收藏本站Access中国

Office中国论坛/Access中国论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

返回列表 发新帖
查看: 1807|回复: 8
打印 上一主题 下一主题

有關SQLSERVER中觸發器的控討

[复制链接]
跳转到指定楼层
1#
发表于 2002-6-12 19:35:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
高手指點一下我:
現有一個觸發器功能如下:
在表中插入一新記錄時,觸發操作
--------------------------------------------
alter trigger utr_trade_request_line_ins on trade_request_line after insert  as

if  @@rowcount = 0
   return

    declare @surplus as decimal(8,2),@col as int
    select @col = (select wh_ins_line_no from inserted)
    set @surplus = (select trade_wh_ins_line.wh_ins_line_pt - trade_request_line.request_line_pt from trade_wh_ins_line  inner join trade_request_line on trade_wh_ins_line.wh_ins_line_no = trade_request_line.wh_ins_line_no and trade_request_line.request_line_no = @@identity)
     --取得紗請求項后紗倉項尚存的值

    if @surplus > 0
             update trade_wh_ins_line set wh_ins_line_pt = @surplus where trade_wh_ins_line.wh_ins_line_no = @col
          --精確定位到和插入虛擬表相對應的紗倉項,然后更新磅數為變量@surplus      
      else
           begin
               print 'Error!'
               rollback transaction
            end
--------------------------------------------------
此觸發器,調試通過,
但出現如下情況,
當變量@surplus<0時,我想停此任何運作命令,rollback tran
但在實際操作中,隨然返回觸發,
但一個Identity列,卻不能在邊續下去。
比如:
id列    ??值
1         xx
2          xx---->如果在這里觸發變值為負,則取消所用操作。
              但下一記錄,id列,則為3,而2卻不可在用。
------------------------------
如何修改是好哪?
望指點。多謝。
             mail:hghuanguan@cmmail.com
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 分享淘帖 订阅订阅
2#
 楼主| 发表于 2002-6-12 19:36:00 | 只看该作者
各位版主:
老革命又遇新問題,
現在如果在一個單表上發生觸發,在觸發的同事,去更新更一個表的值
alter trigger utr_trade_request_line_ins on trade_request_line after insert as
   declare @surplus as decimal(8,2),@col as int
   select  @col =(select wh_ins_line_no from inserted)
   select  @surplus = trade_wh_ins_line.wh_ins_line_pt - inserted.request_line_pt  from trade_wh_ins_line inner join inserted on trade_wh_ins_line.wh_ins_line_no = inserted.wh_ins_line_no
   --分別給變量賦值,@col為預操作的入倉項,@surplus為預操作的結余值
  if @surplus < 0  goto error

  if @@error <>0
               print 'Error: unknown  error !'

  begin transaction
       update trade_wh_ins_line set wh_ins_line_pt = @surplus where wh_ins_line_no = @col
       if @@error <> 0 goto problem
       commit transaction
     
problem:
      print 'error:unknown error!'
      rollback transaction
error:
      raiserror('Error:wh_ins_line_pt < request_line_pt!',16,1)
---------------------------------------------------
比如上例:
隨然已可控制,在更新值為負的情況下,對更一表的更新跳過,
但在觸發表上的操作缺已發生,(即已有新數據插入觸發表,但另一預同時操作的表缺沒有同步處理,同時取消,或同時更新)
請問高手,如何在變鎕為負的情況下,同時中斷觸發表的插入操作,
又不占用一個ID數?
如果用事務怎么寫好哪?
請指導。
3#
 楼主| 发表于 2002-6-12 19:38:00 | 只看该作者
如果不介意的話,論壇也可開一塊區哉,
內容是有關SQLserver的,也末嘗不可。

点击这里给我发消息

4#
发表于 2002-6-12 20:13:00 | 只看该作者
5#
 楼主| 发表于 2002-6-12 20:23:00 | 只看该作者
呵:zhuyiwen
答的妙!
--------------
讓我又一次驚喜.
我以為你有好辦法,處理這個哪?
---------------------------
也送您個驚喜.
請看
http://www.office-cn.net/bbs/dispbbs.asp?boardID=2&RootID=5884&ID=5884

点击这里给我发消息

6#
发表于 2002-6-13 08:05:00 | 只看该作者
谢谢,已观!三本上蹦下跳,WINRAR 乘风破浪。
7#
 楼主| 发表于 2002-6-13 16:52:00 | 只看该作者
看了彩蛋后,不要忘了再看一看本貼囑。
如是用觸發器,不便處理這樣的問題,哪就只要用VBA+ADO在非邦定窗體上了,
哪就要用一個連接來同時操作兩個基表了。
我還第一次用這樣的寫法。
您寫過這樣的嗎?
給弟一些參考。

点击这里给我发消息

8#
发表于 2002-6-13 20:12:00 | 只看该作者
应该用触发器是最好的,可惜我用得太少,不很熟悉。
再者你的变量和列名好长,看起眼花。

事实上,要维护动态值,insert、update、delete都要编写触发器
9#
 楼主| 发表于 2002-6-13 23:15:00 | 只看该作者
請接著關注
單連接,非綁定窗體,同時涉及多基表數據處理,高深探討
http://www.office-cn.net/bbs/dispbbs.asp?boardID=2&RootID=5950&ID=5950
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|站长邮箱|小黑屋|手机版|Office中国/Access中国 ( 粤ICP备10043721号-1 )  

GMT+8, 2024-4-26 11:28 , Processed in 0.137643 second(s), 32 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表