CREATE TRIGGER salesUpdate ON SALES
AFTER INSERT, UPDATE, DELETE
AS
BEGIN
;WITH cteAffectedCustomers AS (
SELECT DISTINCT CustomerId
FROM
inserted
UNION
SELECT DISTINCT CustomerId
FROM
deleted
)
, cteAggregations AS (
SELECT
ca.CustomerId
,SUM(ISNULL(s.Amount,0)) as SalesAmount
,COUNT(s.SalesId) as NumOfSales
FROM
cteAffectedCustomers ca
INNER JOIN Customers c
ON ca.CustomerId = c.CustomerId
LEFT JOIN Sales s
ON ca.CustomerId = s.CustomerId
GROUP BY
ca.CustomerId
)
UPDATE c
SET SalesAmount = ca.SalesAmount
,NumOfSales = ca.NumOfSales
FROM
Customers c
INNER JOIN cteAggregations ca
ON c.CustomerId = ca.CustomerId
END
Вот пример типа логики вам нужно будет создать для поддержания предварительно agregated значения. Если вы хотите SUM
a Amount
в таблице Sales
, вам понадобится AFTER INSERT, UPDATE, and DELETE
. Тогда вам нужно будет:
- определить все пострадавшие клиент Таким образом, вы не обновлять всю таблицу клиентов
- сделать агрегацию
- обновления с внутренним присоединиться к агрегированным данным
Замечание о триггерах, это операция, основанная на наборе, не являющаяся скаляром. Это означает, что они стреляют один раз для x # строк NOT x # раз для x # строк. Таким образом, вам приходится учитывать несколько записей во время обновлений и делать соединения так же, как и вне триггера при обновлении одной таблицы с другой.
Это влияет на производительность операций записи, но ускоряет чтение, однако если вы не используете чрезвычайно высокую скорость чтения, вам лучше использовать просмотр/запрос и оптимизировать свои индексы. Существует менее вероятный капюшон синхронизации сбоев данных агрегатов. Если вы выполняете маршрут триггера, я предлагаю вам также настроить SQL-задание на некоторый разумный прирост (в ночное время), который проверяет и устраняет любые несоответствия, которые могут возникнуть.
Да, да и да. – RBarryYoung
@RBarryYoung Я думаю, что да, нет, да –
Также, как правило, вы * не * хотите делать такую предварительную агрегацию в SQL-базах данных. Вместо этого вы должны создавать запросы и/или виды, которые выполняют свертывания «по требованию». – RBarryYoung