В MS SQL триггер является идеальным средством организации статистических таблиц суммирующего плана типа Saldo. Дело в том, что триггер получает в оптимальном виде дельту для данных по которым ведет статистику и сразу может поправить данные статистической таблице ровно на дельту без излишних пересчетов.
Рассмотрим простой пример такого механизма.
Как уже отмечалось, проводка в Ultima-S содержит целую таблицу аналитик с суммами. Поэтому когда интересен вопрос какова сумма по такой составной проводке без учета аналитик, то выгодно иметь кеш следующего плана:
CREATE TABLE dbo.ComplectInfo (
UDN int NOT NULL , -- Проводка
sum_s money NULL , -- Общая сумма по проводке без учета аналитик
)
Такой кеш дествительно существовал некоторое время в Ultima-S, пока не стало ясно что фактически все запросы требуют раскрытия сумм в аналитиках. Тем не менее, пример этого кеша прост для понимания. Приведем текст триггера поддерживающего данный кеш.
CREATE TRIGGER ComplectInformator
ON Complect
FOR INSERT, UPDATE, DELETE
as
insert ComplectInfo(UDN, sum_s)
select distinct inserted.UDN, 0 from inserted
where not exists (
select inserted.UDN
from ComplectInfo where ComplectInfo.UDN=inserted.UDN)
update ComplectInfo
set ComplectInfo.sum_s=ComplectInfo.sum_s+(
select sum(inserted.s) from inserted
where inserted.UDN=ComplectInfo.UDN)
where exists (
select distinct ComplectInfo.UDN
from inserted where ComplectInfo.UDN=inserted.UDN)
update ComplectInfo
set ComplectInfo.sum_s=ComplectInfo.sum_s-
(select sum(deleted.s) from deleted where deleted.UDN=ComplectInfo.UDN)
where exists(
select distinct ComplectInfo.UDN from deleted
where deleted.UDN=ComplectInfo.UDN)
GO