Допустим, у меня есть три таблицы: [ONE], [ONE_TWO] и [TWO].[ONE_TWO] - это таблица соединений «многие ко многим», содержащая только столбцы [ONE_ID и [TWO_ID].Существуют внешние ключи, настроенные для связи [ONE] с [ONE_TWO] и [TWO] с [ONE_TWO].FK используют опцию ON DELETE CASCADE, чтобы при удалении записи [ONE] или [TWO] также автоматически удалялись связанные записи [ONE_TWO].
Я хочу иметь триггер для таблицы [TWO], чтобы при удалении записи [TWO] она выполняла хранимую процедуру, которая принимает в качестве параметра [ONE_ID], передавая значения [ONE_ID]которые были связаны с [TWO_ID] до того, как произошло удаление:
DECLARE @Statement NVARCHAR(max)
SET @Statement = ''
SELECT @Statement = @Statement + N'EXEC [MyProc] ''' + CAST([one_two].[one_id] AS VARCHAR(36)) + '''; '
FROM deleted
JOIN [one_two] ON deleted.[two_id] = [one_two].[two_id]
EXEC (@Statement)
Очевидно, мне нужен триггер BEFORE DELETE, но в SQL Server 2005 такого нет. Я не могу использовать INSTEAD OFтриггер из-за каскадного FK.
У меня создается впечатление, что если я использую триггер FOR DELETE, когда я присоединяю [удалено] к [ONE_TWO], чтобы найти список значений [ONE_ID], каскад FK уже удалит связанный [ONE_TWO] записей, поэтому я никогда не найду значения [ONE_ID].Это правда?Если так, как я могу достичь своей цели?
Я думаю, что мне нужно изменить FK, соединяющий [TWO] на [ONE_TWO], чтобы не использовать каскады, и вручную удалить из [ONE_TWO] в триггере перед тем, как вручную удалить[ДВА] записи.Но я бы предпочел не проходить через все это, если есть более простой способ.