2015-07-11 5 views
0

У меня есть проект таблицы: enter image description hereTrigger обновить другую таблицу с суммы столбца исходной таблицы

и Milestone таблицу: enter image description here

Всякий раз, когда любая вставка, обновление, удаление производится в Milestone таблица, таблица проекта должна быть обновлена.

Столбец ProjectCost в таблице Проекта представляет собой сумму его вех. В таблице Milestone есть столбец ProjectId, в котором указывается, к какому проекту принадлежит эта веха.

Каждый раз, когда происходят изменения в табличной таблице, ProductCost в таблице продуктов следует обновлять.

У меня проблема в триггере:

CREATE TRIGGER UpdateProject 
    ON [Organisation].[dbo].[Milestone] 
    AFTER INSERT,DELETE,UPDATE 
AS 
BEGIN 
    UPDATE T1 
    SET T1.ProjectCost = (SELECT SUM(MilestoneCost) FROM [Organisation].[dbo].[Milestone] T2 
          WHERE T2.ProjectId=) 
    FROM [Organisation].[dbo].[Project] T1 
    INNER JOIN Inserted i ON T1.ProjectId=i.ProjectId 
    WHERE T1.ProjectId= 

END 
GO 

Как должно быть триггером?

EDIT

Я редактировал курок как:

USE Organisation 
GO 

CREATE TRIGGER [UpdateProject] 
    ON [Organisation].[dbo].[Milestone] 
    AFTER INSERT,DELETE,UPDATE 
AS 
BEGIN 
    UPDATE T1 
    SET T1.ProjectCost = (SELECT SUM(MilestoneCost) 
          FROM [Organisation].[dbo].[Milestone] T2 
          WHERE T2.ProjectId=i.ProjectId) 
    FROM [Organisation].[dbo].[Project] T1 
    INNER JOIN Inserted i ON T1.ProjectId=i.ProjectId 
END 
GO 

ответ

1

Вы довольно близки:

BEGIN 
    UPDATE T1 
     SET T1.ProjectCost = (SELECT SUM(MilestoneCost) 
           FROM [Organisation].[dbo].[Milestone] T2 
           WHERE T2.ProjectId = i.ProjectId 
          ) 
    FROM [Organisation].[dbo].[Project] T1 INNER JOIN 
     Inserted i 
     ON T1.ProjectId = i.ProjectId; 
END; 

join во внешнем запросе и корреляция в where делает фильтрация, которую вы хотите.

+0

Я получаю сообщение об ошибке: Невозможно создать триггер на «Organisation.dbo.Milestone», поскольку цель не находится в текущей базе данных. – Engineer

+0

@Engineer. , , '' Использовать Организацию перед 'create trigger'. SQL Server позволяет создавать триггер в текущей базе данных. Это документировано (https://msdn.microsoft.com/en-us/library/ms189799.aspx). Я не уверен, в чем причина, возможно, для предотвращения неоднозначности в теле о том, какая база данных используется для ссылки на не полностью квалифицированные объекты. –

+0

Разве это игнорирует удаление? – xr280xr

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