Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Kaskadieren bei Löschen oder Trigger verwenden?

KASKADE LÖSCHEN in MSSQL Server kann nur auf eine einzelne Tabelle kaskadieren. Wenn Sie zwei Tabellen mit Fremdschlüsselbeziehungen zu einer Dimensionstabelle haben, können Sie das Löschen nur auf eine davon kaskadieren. (Damit soll verhindert werden, dass Löschvorgänge über mehrere Pfade kaskadieren und Konflikte erzeugen, ähnlich wie C++ Mehrfachvererbung zulässt, C# jedoch nur Einzelvererbung)

Wenn dies der Fall ist, müssen Sie Trigger verwenden oder den Fall in Ihrem Code speziell behandeln.

Aus diesem Grund habe ich viele Leute gesehen, die sich in allen Fällen für die Verwendung von Triggern entschieden haben. Auch wenn es nur einen ausländischen Tisch gibt. Dadurch wird Konsistenz gewährleistet und die Benutzer wissen, worauf sie bei der Pflege der Datenbank achten müssen.

Wenn man eine Löschung auf mehr als eine Tabelle kaskadieren könnte, würde ich sagen, dass dies die bevorzugte Option wäre. Diese Einschränkung trübt jedoch das Wasser und ich bin derzeit eher für Trigger, die all diese Verhaltensweisen besitzen. Der Overhead bei der Verwendung von Triggern für kaskadierte Löschungen und Aktualisierungen ist in Bezug auf die Codierung nur gering, ermöglicht jedoch Standardpraktiken, die wirklich generisch sind.

BEARBEITEN:

Vielleicht möchten Sie die 'akzeptierte Antwort' an jemand anderen verschieben, ich habe herausgefunden, dass ich mich bei dem oben Gesagten geirrt habe.

Sie KÖNNEN mehrere Faktentabellen haben, die ON DELETE CASCADE Foreign Key Contraints zu einer einzigen Dimensionstabelle haben.

Was Sie nicht tun können, ist, dass eine Faktentabelle ON DELETE CASCADE-Fremdschlüsseleinschränkungen für mehrere Dimensionstabellen hat.

Also zum Beispiel...
- Dimensionstabelle [Person] (id INT IDENTITY, )
- Dimensionstabelle [Prüfung] (id INT IDENTITY, )
- Gesichtstabelle [Exam_Score] (person_id INT, Prüfungs-ID INT, Punktzahl INT)

Wenn entweder die Person oder die Prüfung gelöscht werden, möchten Sie, dass auch die zugehörigen Exam_Score-Datensätze gelöscht werden.

Dies ist mit ON DELETE CASCADE in MS SQL Server nicht möglich, daher werden Trigger benötigt.

(Entschuldigung an Mehrdad, der versucht hat, mir das zu erklären, aber ich habe seinen Punkt völlig verfehlt.)