2013-03-18 179 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。谢谢