2017-01-15 1 views
1

Я хочу использовать временную таблицу в SQL Server 2016. В настоящее время временные таблицы не позволяют использовать ON DELETE CASCADE. Как я могу реализовать триггер для имитации поведения? Я хотел бы сохранить внешние ключи, потому что я использую навигационные свойства Entity Framework в своем приложении.Как я могу реализовать триггер SQL Server в качестве альтернативы ON DELETE CASCADE?

Я думаю, что после триггера не работает, потому что инструкция delete не работает с условием внешнего ключа.

Предположим, что мы имеем следующую простую ситуацию:

enter image description here

  1. UserRole.UserId: внешний ключ user.id
  2. UserRole.RoleId: внешний ключ к Role.Id

Если я удалю роль с Id == 2, я хочу удалить вторую и четвертую строки в UserRole. Как это реализовать без использования DELETE CASCADE во временных таблицах?

+0

Вы слышали о 'Вместо Triggers', Google это. –

+0

Да, но триггеры INSTEAD OF не разрешены ни в текущей, ни в таблице истории, чтобы избежать недействительности логики DML. AFTER триггеры разрешены только в текущей таблице. Они блокируются в таблице истории, чтобы избежать недействительности логики DML. – cSteusloff

+0

Рассмотрите это - если было тривиально реализовать 'ON DELETE CASCADE' с помощью чего-то вроде триггера, почему разработчики Microsoft не реализовали' ON DELETE CASCADE', используя такой механизм, вместо того, чтобы перечислять его как ограничение? Любое обходное решение, которое вы пытаетесь, может привести к аналогичным ограничениям. –

ответ

1

Как я уже упоминал в разделе комментариев вам потребуется Instead of Trigger, что-то вроде этого ......

CREATE TRIGGER tr_CascadeDelete_UserRole 
ON [Role] 
INSTEAD OF DELETE 
AS 
BEGIN 
    SET NOCOUNT ON; 

    --** Delete Rows from [UserRole] table first 
    DELETE FROM [UserRole] 
    WHERE EXISTS (SELECT 1 
       FROM Deleted d 
       WHERE d.RoleID = [UserRole].RoleID) 

    --** Delete Rows from [Role] table first 
    DELETE FROM [Role] 
    WHERE EXISTS (SELECT 1 
       FROM Deleted d 
       WHERE d.RoleID = [Role].RoleID) 

END 
+0

Они [не разрешены] (https://msdn.microsoft.com/en-gb/library/mt604468.aspx) на временных таблицах –

Смежные вопросы