2013-03-18 5 views
1

У меня есть две таблицыTrigger, 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 столе, и триггер будет срабатывать на вставки, обновления и удаления, которые обновляет totalpaid поле PaymentData таблицы. Каждый раз, когда новая запись квитанции вставлена ​​или обновляется в отношении какого-то customerid, totalpaid, поле для этого клиента также будет обновляться. Триггер должен делать следующее.

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

Чтобы узнать, как задать вопрос здесь, пожалуйста [перейдите по этой ссылке] (http://mattgemmell.com/2008/12/08/what-have-you-tried/). –

+0

Обычно лучше просто вычислить 'SUM()' когда 'SELECT'ing из базы данных и/или создать индексированное представление, которое автоматически поддерживает эту информацию для вас.Гораздо лучше, чем писать хрупкий триггер, который может (или не может) иногда быть отключен или неприменим из-за гнездования и т. Д. –

ответ

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 

Имейте в виду - это AINT буду работать с многократно обновления/удаления/вставки - Это просто пример того, как нужно сделать, это

+0

Большое спасибо, палочки, это помогло мне теперь почти все смущение исчезло. еще раз спасибо. –

+0

Просто примите ответ, если он помог :) – Sergio

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

спасибо Alexander :) –

+0

@Mirza Asghir Baig Нет проблем;) Это означает, что триггер работает нормально? –

+0

есть триггер работает отлично спасибо; –

0

CREATE TRIGGER [DBO] .upd_PaymentData НА dbo.Receipt

для добавления, обновления, DELETE

КАК

ЕСЛИ @@ ROWCOUNT = 0 возврат

SET NOCOUNT НА;

DECLARE @actionTable NVARCHAR (10),

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


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

ВЫБОР @actionTable = случай, когда @insCount> @delCount ТОГДА 'вставлена'

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

ЕСЛИ @actionTable IN ('вставляется', 'обновленный')

НАЧАТЬ

;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

НАЧАТЬ

;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, как указано в Таге , но он дает ошибку и не работает. просто добавил одно поле в обе таблицы. in paymentdata добавлен lastpaymentdate и в квитанции добавлена ​​оплатадана при вставке или обновлении таблицы чеков paymentdata.lastpaymentdate также необходимо обновить квитанцию.paymentdate. спасибо