代码之家  ›  专栏  ›  技术社区  ›  kateroh

从触发器中的已删除表中选择特定行

  •  0
  • kateroh  · 技术社区  · 14 年前

    Customer Orders

    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 不会再有命令了。所以我只需要让顾客 客户ID=2 vtable 在扳机内。

    我怎样才能做到这一点?

    2 回复  |  直到 10 年前
        1
  •  1
  •   Ken D    14 年前

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

    我在做和你类似的事情。

    编辑: 下面的代码工作得很好,它是一个触发器,通过从tblRating(MovieID,UserID,rating)获得的平均分级来更新电影分级,tblRating也表示tblMovies和tblUsers之间的多对多关系,这个代码使用inserted,但它与deleted相同:

    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
    
        2
  •  0
  •   kateroh    14 年前

    答案是

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