2017-01-15 2 views
1

Ich möchte temporäre Tabelle in SQL Server 2016 verwenden. Derzeit temporäre Tabellen erlauben die Verwendung von ON DELETE CASCADE nicht. Wie kann ich einen Auslöser implementieren, um das Verhalten zu imitieren? Ich möchte ausländische Schlüssel beibehalten, da ich die Navigationseigenschaften von Entity Framework in meiner Anwendung verwende.Wie kann ich einen SQL Server-Trigger als Alternative zu ON DELETE CASCADE implementieren?

Ich denke, ein After-Trigger funktioniert nicht, da die DELETE-Anweisung nicht mit Fremdschlüsselbedingung funktioniert.

Angenommen, wir haben die folgende einfache Situation:

enter image description here

  1. UserRole.UserId: Fremdschlüssel Role.Id
: Fremdschlüssel
  • UserRole.RoleId user.id

    Wenn ich die Rolle mit Id == 2 lösche, als ich die zweite und vierte Zeile in UserRole löschen möchte. Wie kann ich dies ohne ON DELETE CASCADE in temporalen Tabellen implementieren?

  • +0

    Haben Sie schon von der 'Statt Triggers' gehört, ist es Google. –

    +0

    Ja, aber INSTEAD OF-Trigger sind weder in der aktuellen noch in der Verlaufstabelle zulässig, um zu vermeiden, dass die DML-Logik ungültig wird. AFTER-Trigger sind nur für die aktuelle Tabelle zulässig. Sie werden in der Protokolltabelle blockiert, um zu verhindern, dass die DML-Logik ungültig wird. – cSteusloff

    +0

    Betrachten Sie dies - wenn es einfach wäre, "ON DELETE CASCADE" über etwas wie einen Trigger zu implementieren, warum hätten die Microsoft-Entwickler "ON DELETE CASCADE" nicht mit einem solchen Mechanismus implementiert, anstatt es als Einschränkung aufzuführen? Jede Problemumgehung, die Sie versuchen, wird wahrscheinlich zu ähnlichen Einschränkungen führen. –

    Antwort

    1

    Wie ich in den Kommentaren erwähnt werden Sie gleich einen Instead of Trigger, so etwas wie dieses brauchen ......

    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

    Sie sind [nicht erlaubt] (https://msdn.microsoft.com/en-gb/library/mt604468.aspx) auf temporalen Tabellen –

    Verwandte Themen