0

У меня есть эти 2 таблицы:Trigger обновить конкретную ячейку другой таблицы

dbo.Restaurants(rid,name,phone,area,address,zip,desc,foodtype,avgRating) 

и

dbo.Reviews(rev_id,rest_id,user_id,taste, service,environment,value,average,comment) 

Я пытался создать триггер, который делает это: , когда строка на dbo.Reviews удаляется, обновляется или вставляется, триггер затем вычисляет новый средний рейтинг для ресторана следующим образом:

select rid, round(avg(average)*20,0) as 'average' 
from dbo.Restaurants inner join dbo.Reviews on rid=rest_id 
group by rid 

И затем обновляет прогиб-камеру на dbo.Рестораны, где dbo.Restaurants.rid = dbo.Reviews.rest_id.

До сих пор я придумал это:

CREATE TRIGGER [defAverage] 
ON [dbo].[Reviews] 
AFTER UPDATE, DELETE, INSERT 
AS 
BEGIN 

select rid, round(avg(average)*20,0) as 'average' 
from Restaurants inner join Reviews on rid=rest_id 
group by rid 
order by 'average' desc 
    SET NOCOUNT ON 
    UPDATE [dbo].[Restaurants] 
    SET [dbo].[Restaurants].avgRating = 'average' 
    where [dbo].[Reviews].rest_id = [dbo].[Restaurants].rid 

END 

который, очевидно, не работает, иначе я бы здесь не было. Я использую Visual Studio Ultimate 2013, который использует SQL Server Tools 2012.

Заранее благодарим за ваше время и предложения.

ответ

2

Существует две таблицы псевдонимов с именем inserted и deleted, которые доступны только в триггерах DML. По очевидным причинам inserted таблица пуста в случае delete, deleted пуста в случае insert, а в случае update обе таблицы заселены. И вы можете использовать их в триггере.

CREATE TRIGGER [defAverage] 
ON [dbo].[Reviews] 
AFTER UPDATE, DELETE, INSERT 
AS 
BEGIN 

SET NOCOUNT ON 
UPDATE [dbo].[Restaurants] 
    SET avgRating = round(avg(rv.average)*20,0) 
from Restaurants r inner join Reviews rv on r.rid=rv.rest_id 
where r.rid in (select rest_id from inserted 
       union 
       select rest_id from deleted) 
group by r.rid 

END 
Смежные вопросы