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. спасибо
Чтобы узнать, как задать вопрос здесь, пожалуйста [перейдите по этой ссылке] (http://mattgemmell.com/2008/12/08/what-have-you-tried/). –
Обычно лучше просто вычислить 'SUM()' когда 'SELECT'ing из базы данных и/или создать индексированное представление, которое автоматически поддерживает эту информацию для вас.Гораздо лучше, чем писать хрупкий триггер, который может (или не может) иногда быть отключен или неприменим из-за гнездования и т. Д. –