2010-11-10 4 views
0

J'ai une table intermédiaire qui définit plusieurs à plusieurs entre, par exemple, Customer et Orders, comme ceci:Sélection des lignes spécifiques de table deleted dans un déclencheur

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 

Maintenant, je dois avoir un déclencheur ON DELETE sur cette table, qui aurait besoin de mettre à jour une autre table basée sur les clients qui n'ont pas ont des ordres restant dans la table. Dans ce cas, après l'opération DELETE le client avec CustomerId=1 aura 1 commande avec OrderId=2 à gauche et le client avec CustomerId=2 n'aura plus aucune commande. Donc, je dois obtenir seulement le client avec CustomerId=2 du supprimévtable dans le déclencheur.

Comment puis-je accomplir ceci?

Répondre

0

Mes mains sont plus rapides que ma tête: -/

La réponse est

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

1

Le problème est que vous utilisez deleted.CustomerId sur le côté droit d'une comparaison. Je faisais quelque chose de similaire à ce que tu faisais.

et la solution est de définir une @variable pour conserver deleted.CustomerId (après votre ligne SET NO COUNT), puis comparez CustomerOrders.CustomerId à la variable.

EDIT: Voici le code qui fonctionne très bien, Il est un déclencheur pour mettre à jour le classement des films par le classement moyen obtenu par tblRating (MovieID, UserID, rating) qui représente également une relation many-to-many entre tblMovies et tblUsers, celle-ci utilise inséré mais il en est de même supprimé:

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 [email protected]; 

-- and here is the comparison 
UPDATE tblMovies 
SET avg_rating = @rate 
WHERE [email protected]; 
END 
+0

vous ne pouvez pas faire quelque chose comme ceci: @ variable = (SELECT CustomerId dE supprimé), car il lancera quand un déclencheur sera tiré sur la suppression de plusieurs lignes et car ils ne peuvent pas être affectés à 1 variable. – kateroh

+0

Je vois, la situation est différente. –

Questions connexes