从触发器中的DELETED表中选择特定行

时间:2010-11-10 23:21:20

标签: sql tsql triggers

我有一个中间表,用于定义例如CustomerOrders之间的多对多关系,如下所示:

USE [master]
GO

CREATE DATABASE Example
GO 

USE [Example]
GO 

CREATE TABLE [dbo].[CustomerOrders](
   [CustomerId] [int],
   [OrderId]  [int]
)
GO

INSERT INTO CustomerOrders (CustomerId, OrderId) VALUES (1, 1)
INSERT INTO CustomerOrders (CustomerId, OrderId) VALUES (1, 2)
INSERT INTO CustomerOrders (CustomerId, OrderId) VALUES (2, 1)
GO

CREATE TRIGGER [dbo].[CustomerOrdersRemoved]
   ON  [dbo].[CustomerOrders]
   FOR DELETE
AS 
   BEGIN
   SET NOCOUNT ON;

   --IF NOT EXISTS (SELECT CustomerId FROM CustomerOrders 
                    INNER JOIN deleted ON CustomerOrders.CustomerId=deleted.CustomerId)
   --this wont work
END
GO

DELETE CustomerOrders WHERE OrderId=1
GO

现在,我需要在此表上有一个ON DELETE触发器,需要根据在表中留下任何订单的客户更新另一个表。在这种情况下,DELETE操作后,CustomerId=1的客户将有1个订单,剩余OrderId=2,而CustomerId=2的客户将没有订单。因此,我只需要从触发器中的已删除 CustomerId=2中获取vtable的客户。

我该如何做到这一点?

2 个答案:

答案 0 :(得分:1)

问题是您在比较的右侧使用了deleted.CustomerId。

我正在做与你正在做的事情类似的事情。

,解决方案是定义一个@variable来保存deleted.CustomerId(在你的SET NO COUNT行之后),然后将CustomerOrders.CustomerId与变量进行比较。

编辑: 这里的代码工作正常,它是一个触发器来更新电影评级,它来自tblRating(MovieID,UserID,rating)的平均评级,它也代表tblMovies和tblUsers之间的多对多关系,这个使用插入但它与删除相同:

CREATE TRIGGER trUpdateRating
ON [dbo].[tblRating]
AFTER INSERT
AS
BEGIN
SET NOCOUNT ON
DECLARE @rate float, @mid int
SET @rate = 0;

-- here is the assignment I was talking about and it is valid
SELECT @mid=MovieID from inserted;

SELECT @rate=AVG(isnull(Rating, 0)) FROM tblRating WHERE MovieID=@mid;

-- and here is the comparison
UPDATE tblMovies
SET avg_rating = @rate
WHERE ID=@mid;
END

答案 1 :(得分:0)

我的手比我的头快: - /

答案是

SELECT CustomerId FROM deleted WHERE CustomerId NOT IN (SELECT CustomerId FROM CustomerOrders)