Во-первых, я настоятельно рекомендую вам , а не использовать триггеры.
Если вы получаете синтаксическую ошибку, проверьте, сбалансированы ли ваши парены, а также begin
/ ends
. В вашем случае у вас есть end
(в конце), но нет начала. Вы можете исправить это, просто удалив end
.
Как только вы исправите это, вы, скорее всего, получите еще несколько ошибок, таких как «столбцы x, y, z не в агрегате или в группе по». Это потому, что у вас есть несколько столбцов, которых нет ни в одном. Вам необходимо добавить thread.rating, thread.voters и т. Д. В свою группу или выполнить какое-либо объединение для них.
Все это при условии, что существует несколько записей с одинаковым идентификатором потока (т. Е. Это не первичный ключ). Если это не случай, то какова цель группы?
Edit:
Я в тупике из-за синтаксической ошибки. Я работал над этим с парой связанных подзапросов. Я догадался о вашей структуре таблицы, поэтому измените по мере необходимости и попробуйте это:
--CREATE TABLE ThreadRating (threadid int not null, userid int not null, rating int not null)
--CREATE TABLE Thread (threadid int not null, rating int not null, voters int not null)
ALTER TRIGGER thread_rating ON threadrating
AFTER INSERT
AS
UPDATE Thread
SET Thread.rating =
(SELECT (Thread.Rating * Thread.Voters + SUM(I.Rating)) / (Thread.Voters + COUNT(I.Rating))
FROM ThreadRating I WHERE I.ThreadID = thread.ThreadID)
,Thread.Voters =
(SELECT Thread.Voters + COUNT(I.Rating)
FROM ThreadRating I WHERE I.ThreadID = Thread.ThreadID)
FROM Thread
JOIN Inserted ON Inserted.ThreadID = Thread.ThreadID
Если это то, что вы хотели, тогда мы можем проверить план производительности / выполнения и изменить при необходимости. Возможно, мы сможем заставить его работать с группой.
Альтернативы триггерам
Если вы обновляете данные, которые влияют на оценки только в нескольких выбранных местах, я бы рекомендовал обновить оценки непосредственно там. Включение логики в триггер это хорошо, но создает много проблем (производительность, видимость и т. Д.). Этому может помочь функция.
Учтите это: ваш триггер будет срабатывать каждый раз, когда кто-то касается этой таблицы. Такие вещи, как количество просмотров, даты последнего обновления и т. Д. Будут выполнять этот триггер. В этих случаях вы можете добавить логику для короткого замыкания триггера, но это быстро усложняется.