Помогите создать триггер (MS SQL2008)
От: gmvr  
Дата: 10.07.15 18:49
Оценка:
Есть две таблицы 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?
Отредактировано 11.07.2015 13:23 gmvr . Предыдущая версия .
Re: Помогите создать триггер (MS SQL2008)
От: Tigor Россия  
Дата: 10.07.15 19:26
Оценка: +1
Здравствуйте, gmvr.

А в сторону индексированных вью не смотрели?
Может быть проще завести счётчик изменений конкретной строки?
А потом по этому полю индексированное вью с группировкой? Красота, и никаких триггеров.
К сожалению, в действительности все выглядит иначе, чем на самом деле.
Отредактировано 10.07.2015 19:26 Tigor . Предыдущая версия .
Re: Помогите создать триггер (MS SQL2008)
От: fmiracle  
Дата: 10.07.15 19:58
Оценка:
Здравствуйте, gmvr, Вы писали:

G>Вопрос, как сложить результаты подсчета со значениями соответствующих счетчиков в таблице B?


А оно надо? Может просто пересчитать счетчики по всем группам, которые были затронуты в процессе изменения?
Re: Помогите создать триггер (MS SQL2008)
От: Sinclair Россия https://github.com/evilguest/
Дата: 13.07.15 04:32
Оценка: 2 (1)
Здравствуйте, 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
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[2]: Помогите создать триггер (MS SQL2008)
От: gmvr  
Дата: 13.07.15 14:14
Оценка:
Здравствуйте, 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.
Re[3]: Помогите создать триггер (MS SQL2008)
От: Sinclair Россия https://github.com/evilguest/
Дата: 13.07.15 20:15
Оценка:
Здравствуйте, gmvr, Вы писали:
G>Спасибо. Работает. Чего-то я пропустил, читая книжки. Не думал что в update-е можно писать from и join.
https://msdn.microsoft.com/en-us/library/ms177523.aspx
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.