Выбор определенных строк из таблицы DELETED внутри триггера - PullRequest
0 голосов
/ 11 ноября 2010

У меня есть промежуточная таблица, которая определяет отношение многие ко многим, например, 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 заказов не останется.Поэтому мне нужно получить только клиента с CustomerId=2 из удаленных vtable в триггере.

Как мне это сделать?

Ответы [ 2 ]

1 голос
/ 11 ноября 2010

Проблема в том, что вы используете удаленный. Идентификатор клиента справа от сравнения.

Я делал что-то похожее на то, что ты делаешь.

, и решение состоит в том, чтобы определить @variable для хранения удаленного.CustomerId (после строки SET NO COUNT), а затем сравнить CustomerOrders.CustomerId с переменной.

EDIT: Вот код, который работает просто отлично. Это триггер для обновления рейтинга фильма по среднему рейтингу, который он получил от 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
0 голосов
/ 11 ноября 2010

Мои руки быстрее моей головы: - /

Ответ

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...