設為首頁收藏本站Access中國

Office中國論壇/Access中國論壇

 找回密碼
 注冊

QQ登錄

只需一步,快速開始

返回列表 發(fā)新帖
查看: 6541|回復: 7
打印 上一主題 下一主題

[原創(chuàng)]利用觸發(fā)器實現(xiàn)即時更新表記錄!

[復制鏈接]
跳轉(zhuǎn)到指定樓層
1#
發(fā)表于 2005-12-7 05:24:00 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
【已知條件】
“存入” “客戶” 兩表

“存入”表—字段如下:
       存入賬戶ID
       人員編號(外部鍵)
       存入金額
“客戶”表—字段如下
       人員編號(主鍵)
       姓名
      性別
      賬戶余額


在“存入”表中制有如下觸發(fā)器
  CREATE TRIGGER km_ZFQ ON [dbo].[存入]
  FOR INSERT, UPDATE, DELETE
  AS
  UPDATE  客戶
  SET  客戶.賬戶余額 = (SELECT SUM(存入金額) FROM 存入 WHERE 存入.人員編號=客戶.人員編號)
  FROM 客戶,存入
  WHERE 客戶.人員編號=存入.人員編號;


【目的】
 當對“存入”表進行插入、修改、刪除操作時“客戶”表中的〔帳戶余額〕始終保持最新。實現(xiàn)了即時更新的目的。

【問題】
  雖然上述的觸發(fā)器實現(xiàn)了“客戶”表帳戶余額的即時更新,但我覺得該觸發(fā)器如果處理數(shù)萬以上的數(shù)據(jù)可能速度會大大降底!。ㄒ驗椤癢HERE 客戶.人員編號=存入.人員編號”,是對所有記錄進行批量更新。

  要是上述觸發(fā)器按“存入”表中當前操作(修改、插入、刪除)記錄的〔人員編號〕進行更新是必甚好。

  我在想能不能把上述“WHERE 客戶.人員編號=存入.人員編號”中的“存入.人員編號”用某中方法得到“存入”表當前記錄的“人員編號”值(即“WHERE 客戶.人員編號={存入表當前記錄人員編號}”)。

望路過高手略指一二。(我正在對SQL語句學習中)
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享分享 分享淘帖 訂閱訂閱
2#
發(fā)表于 2005-12-7 17:56:00 | 只看該作者
那得先判斷正在處理的是唯一一條記錄。

我的做法是分開寫三種觸發(fā)器,可以在其它地方做個東西判斷“帳戶余額”對不對。
3#
發(fā)表于 2005-12-7 20:54:00 | 只看該作者
WHERE 客戶.人員編號=inserted.人員編號

觸發(fā)器可以生成deleted和inserted兩個臨時表。deleted存放更新前當前影響的記錄。inserted存放當前更新后的記錄。
4#
 樓主| 發(fā)表于 2005-12-10 06:49:00 | 只看該作者
是利用deleted和inserted兩個臨時表,來獲得當前操作記錄的ID號。是嗎?
5#
發(fā)表于 2005-12-17 00:13:00 | 只看該作者
這里有個觸發(fā)器的例子 ,,看看您能看懂不?

Alter TRIGGER GOODSINITTRIGGER1 ON GOODSINIT INSTEAD OF UPDATE AS
DECLARE @CurrYear INT, @CurrMonth INT
DECLARE @NEW_GOODSID T_KEYID, @NEW_YEARNUM T_KEYID_S, @NEW_MONTHNUM T_KEYID_S, @NEW_BQTY T_QUANTITY, @NEW_BPRICE T_PRICE, @NEW_INQTY
T_QUANTITY, @NEW_OUTQTY T_QUANTITY, @NEW_EQTY T_QUANTITY, @NEW_EPRICE T_PRICE, @NEW_BAMOUNT T_AMOUNT, @NEW_EAMOUNT T_AMOUNT
DECLARE @OLD_GOODSID T_KEYID, @OLD_YEARNUM T_KEYID_S, @OLD_MONTHNUM T_KEYID_S, @OLD_BQTY T_QUANTITY, @OLD_BPRICE T_PRICE, @OLD_INQTY
T_QUANTITY, @OLD_OUTQTY T_QUANTITY, @OLD_EQTY T_QUANTITY, @OLD_EPRICE T_PRICE, @OLD_BAMOUNT T_AMOUNT, @OLD_EAMOUNT T_AMOUNT
DECLARE NEWED CURSOR LOCAL FORWARD_ONLY STATIC OPTIMISTIC FOR SELECT GOODSID, YEARNUM, MONTHNUM, BQTY, BPRICE, INQTY, OUTQTY,
EQTY, EPRICE, BAMOUNT, EAMOUNT FROM INSERTED Order By GOODSID,YearNum,MonthNum
DECLARE OLDED CURSOR LOCAL FORWARD_ONLY STATIC OPTIMISTIC FOR SELECT GOODSID, YEARNUM, MONTHNUm, BQTY, BPRICE, INQTY, OUTQTY,
EQTY, EPRICE, BAMOUNT, EAMOUNT FROM DELETED Order By GOODSID,YearNum,MonthNum
OPEN NEWED
OPEN OLDED
FETCH NEXT FROM NEWED INTO @NEW_GOODSID, @NEW_YEARNUM, @NEW_MONTHNUM, @NEW_BQTY, @NEW_BPRICE, @NEW_INQTY, @NEW_OUTQTY, @NEW_EQTY,
@NEW_EPRICE, @NEW_BAMOUNT, @NEW_EAMOUNT
IF (@@FETCH_STATUS = 0)
  FETCH NEXT FROM OLDED INTO @OLD_GOODSID, @OLD_YEARNUM, @OLD_MONTHNUM, @OLD_BQTY, @OLD_BPRICE, @OLD_INQTY, @OLD_OUTQTY ,@OLD_EQTY, @OLD_EPRICE, @OLD_BAMOUNT, @OLD_EAMOUNT
WHILE (@@FETCH_STATUS = 0)
  BEGIN
    --BEGIN TRANSACTION
    SET @NEW_EQTY = @NEW_BQTY + @NEW_INQTY - @NEW_OUTQTY
    IF (@NEW_BQTY <> @OLD_BQTY OR @NEW_BPRICE <> @OLD_BPRICE)
      SET @NEW_BAMOUNT = @NEW_BQTY * @NEW_BPRICE
    IF (- 0.0000001 < @NEW_EQTY AND @NEW_EQTY < 0.0000001)
      SET @NEW_EQTY = 0
    IF (@NEW_EAMOUNT = @OLD_EAMOUNT AND @NEW_BAMOUNT <> @OLD_BAMOUNT)
      SET @NEW_EAMOUNT = @OLD_EAMOUNT + @NEW_BAMOUNT - @OLD_BAMOUNT
    IF (@NEW_BQTY <> @OLD_BQTY OR @NEW_BPRICE <> @OLD_BPRICE)
    BEGIN
        SELECT @CURRYEAR = POSYEAR, @CURRMONTH = POSMON FROM ACCINFO
        UPDATE DETAILBILLFLOW SET CACULATEFLAG = 'F' WHERE BILLDATE >= CAST (convert (varchar,@CURRMONTH) + '/01/' + convert (varchar,@CURRYEAR) AS DATETIME) AND                  GOODSID = @OLD_GOODSID
    END
    UPDATE GOODSINIT SET GOODSID = @NEW_GOODSID, YEARNUM = @NEW_YEARNUM, MONTHNUM = @NEW_MONTHNUM, BQTY = @NEW_BQTY, BPRICE =                                                  @NEW_BPRICE, INQTY = @NEW_INQTY, OUTQTY = @NEW_OUTQTY, EQTY = @NEW_EQTY, EPRICE = @NEW_EPRICE, BAMOUNT = @NEW_BAMOUNT,
                                                 EAMOUNT =   @NEW_EAMOUNT
     WHERE GOODSINIT.GOODSID = @OLD_GOODSID AND GOODSINIT.YEARNUM = @OLD_YEARNUM AND GOODSINIT.MONTHNUM = @OLD_MONTHNUM

     FETCH NEXT FROM NEWED INTO @NEW_GOODSID, @NEW_YEARNUM, @NEW_MONTHNUM, @NEW_BQTY, @NEW_BPRICE, @NEW_INQTY, @NEW_OUTQTY,                                                                @NEW_EQTY, @NEW_EPRICE, @NEW_BAMOUNT, @NEW_EAMOUNT
     IF (@@FETCH_STATUS = 0)
             FETCH NEXT FROM OLDED INTO @OLD_GOODSID, @OLD_YEARNUM, @OLD_MONTHNUM, @OLD_BQTY, @OLD_BPRICE, @OLD_INQTY, @OLD_OUTQTY,                                                                        @OLD_EQTY, @OLD_EPRICE, @OLD_BAMOUNT, @OLD_EAMOUNT
    END
    CLOSE NEWED
    DEALLOCATE NEWED
    CLOSE OLDED
    DEALLOCATE OLDED




---以上代碼中T_KEYID_S  ,T_QUANTITY 等是自定義數(shù)據(jù)類型

[此貼子已經(jīng)被作者于2005-12-16 16:14:58編輯過]

6#
發(fā)表于 2006-1-15 05:37:00 | 只看該作者
what
7#
發(fā)表于 2012-4-22 18:43:45 | 只看該作者
好復雜的程序,看不懂
8#
發(fā)表于 2013-3-28 16:00:13 | 只看該作者
{:soso_e115:}黑麻麻一片
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則

QQ|站長郵箱|小黑屋|手機版|Office中國/Access中國 ( 粵ICP備10043721號-1 )  

GMT+8, 2024-10-23 08:32 , Processed in 0.103950 second(s), 31 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回復 返回頂部 返回列表