2013-03-18 180 views
1

我有兩個表觸發器,SQL SERVER 2008

PaymentData 
Ser Customerid Totalpaid 
1. AGP001  2400 
2. AGP002  1000 
3. AGP003  1500 

Receipt 
Receipt# Customerid Paid 
1.   AGP001  1200 
2.   AGP001  1200 

我想在Receipt表上創建觸發器,並觸發條件會在插入,更新和刪除哪些更新PaymentData表的totalpaid野外作業。每次插入或更新新收據記錄時,該客戶的某些customerid,totalpaid字段也會更新。 觸發器應該執行以下操作。

Update PaymentData.totalpaid = sum(Recipt.paid) 
where Receipt.customerID = PaymentData.customerID 
+0

要了解如何在此提問,請點擊此鏈接(http://mattgemmell.com/2008/12/08/what-have-you-tried/)。 – 2013-03-18 10:20:58

+0

當從數據庫中選擇'SELECT'並/或創建一個索引視圖來自動保存這些信息時,通常最好只計算'SUM()'。遠遠好於編寫一個脆弱的觸發器,可能(或可能不)由於嵌套等原因而被禁用或不適用。 – 2013-03-18 10:55:12

回答

0

我想你需要一些觸發條件:

CREATE TRIGGER dbo.OnReceiptUpdate 
    ON dbo.Receipt 
    AFTER INSERT,DELETE,UPDATE --operations you want trigger to fire on 
AS 
BEGIN 
    SET NOCOUNT ON; 

    DECLARE @customer_id VARCHAR(10) 

    SET @customer_id= COALESCE 
         (
          (SELECT customer_id FROM inserted), --table inserted contains inserted rows (or new updated rows) 
          (SELECT customer_id FROM deleted) --table deleted contains deleted rows 

         ) 

    DECLARE @total_paid DECIMAL 

    SET @total_paid = 
      (
       SELECT SUM(paid) 
       FROM Receipt 
       WHERE customer_id = @customer_id 
      ) 

    UPDATE PaymentData 
     SET total_paid = @total_paid    
    WHERE customer_id = @customer_id 

    IF @@ROWCOUNT = 0    --if nothing was updated - you don't have record in PaymentData, so make it 
     INSERT INTO PaymentData (customer_id, total_paid) 
      VALUES (@customer_id, @total_paid) 

END 
GO 

請記住 - 這是不是要去工作,多次更新/刪除/插入 - 這是你需要怎麼辦呢

只是例子
+0

非常感謝您休息,現在它幫助了我很多困惑已經消失。再次感謝。 – 2013-03-18 11:17:25

+0

只需接受答案,如果它幫助:) – Sergio 2013-03-18 11:34:47

0

嘗試使用此更新,插入或刪除的觸發器。

CREATE TRIGGER [dbo].upd_PaymentData ON dbo.Receipt 
FOR INSERT, UPDATE, DELETE 
AS 
IF @@ROWCOUNT = 0 return 
SET NOCOUNT ON; 
DECLARE @actionTable nvarchar(10), 
     @insCount int = (SELECT COUNT(*) FROM inserted), 
     @delCount int = (SELECT COUNT(*) FROM deleted) 
SELECT @actionTable = CASE WHEN @insCount > @delCount THEN 'inserted' 
          WHEN @insCount < @delCount THEN 'deleted' ELSE 'updated' END 
IF @actionTable IN ('inserted', 'updated') 
    BEGIN 
    ;WITH cte AS 
    (
     SELECT r.Customerid, SUM(r.Paid) AS NewTotalPaid 
     FROM dbo.Receipt r 
     WHERE r.Customerid IN (SELECT i.Customerid FROM inserted i) 
     GROUP BY r.Customerid 
    ) 
     UPDATE p 
     SET p.Totalpaid = c.NewTotalPaid 
     FROM dbo.PaymentData p JOIN cte c ON p.Customerid = c.Customerid 
    END 
ELSE 
    BEGIN 
    ;WITH cte AS 
    (
     SELECT d.Customerid, SUM(ISNULL(r.Paid, 0)) AS NewTotalPaid 
     FROM deleted d LEFT JOIN dbo.Receipt r ON d.Customerid = r.Customerid 
     GROUP BY d.Customerid 
    ) 
     UPDATE p 
     SET p.Totalpaid = c.NewTotalPaid 
     FROM dbo.PaymentData p JOIN cte c ON p.Customerid = c.Customerid 
    END 
+0

感謝亞歷山大:) – 2013-03-19 13:42:07

+0

@Mirza Asghir Baig沒問題;)這意味着觸發工作正常嗎? – 2013-03-19 13:52:11

+0

是觸發器很好,謝謝; – 2013-03-20 04:01:45

0

CREATE TRIGGER [DBO] .upd_PaymentData ON dbo.Receipt

插入,更新,刪除

AS

IF @@ ROWCOUNT = 0返回

SET NOCOUNT上;

DECLARE @actionTable爲nvarchar(10),

@insCount int = (SELECT COUNT(*) FROM inserted), 


    @delCount int = (SELECT COUNT(*) FROM deleted) 

SELECT @actionTable = CASE WHEN @insCount> @delCount THEN '插入'

     WHEN @insCount < @delCount THEN 'deleted' ELSE 'updated' END 

IF @actionTable IN( '插入', '更新')

BEGIN

;WITH cte AS 

(

    SELECT r.Customerid, SUM(r.Paid) AS NewTotalPaid,<strike> r.paymentDate</strike> 

    FROM dbo.Receipt r 

    WHERE r.Customerid IN (SELECT i.Customerid FROM inserted i) 

    GROUP BY r.Customerid 

) 

    UPDATE p 

    SET p.Totalpaid = c.NewTotalPaid 

    <strike>SET p.lastpaymentDate = c.paymentDate</strike> 

    FROM dbo.PaymentData p JOIN cte c ON p.Customerid = c.Customerid 

END

ELSE

BEGIN

;WITH cte AS 

(

    SELECT d.Customerid, SUM(ISNULL(r.Paid, 0)) AS NewTotalPaid 

    FROM deleted d LEFT JOIN dbo.Receipt r ON d.Customerid = r.Customerid 

    GROUP BY d.Customerid 

) 

    UPDATE p 

    SET p.Totalpaid = c.NewTotalPaid 

    FROM dbo.PaymentData p JOIN cte c ON p.Customerid = c.Customerid 

END

我試圖更functionaly添加爲內 踏歌 表示,但它給錯誤,無法正常工作。 只需在兩個表中添加一個字段。 付款數據添加lastpaymentdate 並在收到添加付款日期 上插入或更新收據表paymentdata.lastpaymentdate也應更新至receipt.paymentdate。謝謝