Есть две таблицы A и B.
A: id — идентификатор записи (вместе с grpid), grpid — идентификатор группы (ссылается на таблицу B), status — состояние
B: grpid — идентификатор группы (ключ), cnt — кол-во модификаций группы
Нужен триггер на изменение поля status записей в таблице A так, чтобы в таблице B подсчитывалось кол-во изменений по группам.
В одном запросе к таблице A может быть изменено несколько элементов с разными/одинаковыми grpid.
Подсчет изменений несложен
CREATE TRIGGER [dbo].[CountUsed]
ON [dbo].[A]
AFTER UPDATE
AS
BEGIN
SELECT I.grpid, COUNT(*) FROM inserted AS I
JOIN deleted AS D ON I.grpid=D.grpid AND I.id=D.id
WHERE D.status<>I.status GROUP BY I.grpid
END
Вопрос, как сложить результаты подсчета со значениями соответствующих счетчиков в таблице B?
Здравствуйте, gmvr.
А в сторону индексированных вью не смотрели?
Может быть проще завести счётчик изменений конкретной строки?
А потом по этому полю индексированное вью с группировкой? Красота, и никаких триггеров.
Здравствуйте, gmvr, Вы писали:
G>Вопрос, как сложить результаты подсчета со значениями соответствующих счетчиков в таблице B?
Хм. А что, в лоб не работает?
update B set B.cnt = B.cnt + C.updatecount from B inner join
(SELECT I.grpid, COUNT(*) as updatecount FROM inserted I JOIN deleted D ON I.grpid=D.grpid AND I.id=D.id WHERE D.status<>I.status GROUP BY I.grpid) C
on B.grpid = C.grpid
Здравствуйте, Sinclair, Вы писали:
S>update B set B.cnt = B.cnt + C.updatecount from B inner join
S>(SELECT I.grpid, COUNT(*) as updatecount FROM inserted I JOIN deleted D ON I.grpid=D.grpid AND I.id=D.id WHERE D.status<>I.status GROUP BY I.grpid) C
S>on B.grpid = C.grpid
S>
Спасибо. Работает. Чего-то я пропустил, читая книжки. Не думал что в update-е можно писать from и join.
Здравствуйте, gmvr, Вы писали:
G>Спасибо. Работает. Чего-то я пропустил, читая книжки. Не думал что в update-е можно писать from и join.
https://msdn.microsoft.com/en-us/library/ms177523.aspx