2015-07-11 54 views
0

我有一个项目表的总和来更新另一个表: enter image description here触发与原表的列

的又一个里程碑表: enter image description here

每当任何插入,更新,删除就是里程碑制作表,项目表需要更新。

项目表中的ProjectCost列是其里程碑的总和。里程碑表具有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 

触发应该如何呢?

编辑

我编辑的触发为:

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

@工程师。 。 。在创建触发器之前使用组织。 SQL Server只允许你在当前数据库中创建一个触发器。这是记录(https://msdn.microsoft.com/en-us/library/ms189799.aspx)。我不确定是什么原因,也许是为了防止在用于引用非完全限定对象的数据库的正文中存在歧义。 –

+0

这不会忽略删除吗? – xr280xr