USUŃ KASKADOWY w MSSQL Server można kaskadować tylko do jednej tabeli. Jeśli masz dwie tabele z relacjami kluczy obcych do tabeli wymiarów, możesz kaskadowo usuwać tylko jedną z nich. (Ma to na celu zapobieganie usuwaniu kaskadowemu przez wiele ścieżek i tworzeniu konfliktów, podobnie jak C++ pozwala na wielokrotne dziedziczenie, ale C# pozwala tylko na pojedyncze dziedziczenie)
W takim przypadku jesteś zmuszony użyć wyzwalaczy lub konkretnie obsłużyć sprawę w swoim kodzie.
Z tego powodu widziałem, jak wiele osób decyduje się na używanie wyzwalaczy we wszystkich przypadkach. Nawet jeśli jest tylko jeden obcy stół. Zapewnia to spójność, dzięki czemu ludzie wiedzą, na co zwracać uwagę podczas utrzymywania bazy danych.
Gdyby można było kaskadować usuwanie do więcej niż jednej tabeli, powiedziałbym, że byłaby to najkorzystniejsza opcja. To ograniczenie jednak zamula wody i obecnie jestem bardziej za wyzwalaczami posiadania wszystkich takich zachowań. Narzut związany z używaniem wyzwalaczy do kaskadowego usuwania i aktualizacji jest niewielki pod względem kodowania, ale pozwala na stosowanie standardowych praktyk, które są naprawdę ogólne.
EDYTUJ:
Możesz przenieść „zaakceptowaną odpowiedź” na kogoś innego, zdałem sobie sprawę, że się myliłem co do powyższego.
Możesz mieć wiele tabel faktów z ograniczeniami klucza obcego ON DELETE CASCADE do pojedynczej tabeli wymiarów.
To, czego nie możesz zrobić, to mieć jedną tabelę faktów, która ma WŁĄCZONE USUNIĘCIE KASKADY Ograniczeń klucza obcego do wielu tabel wymiarów.
Na przykład...
- Tabela wymiarów [Osoba] (id INT IDENTITY, )
- Tabela wymiarów [Egzamin] (id INT IDENTITY, )
- Tabela twarzy [Wynik_egzaminu] (identyfikator osoby INT, egzamin_id INT, wynik INT)
Jeśli osoba lub egzamin zostaną usunięte, chcesz, aby powiązane rekordy Exam_Score również zostały usunięte.
Nie jest to możliwe przy użyciu ON DELETE CASCADE w MS SQL Server, stąd potrzeba wyzwalaczy.
(Przepraszam Mehrdada, który próbował mi to wyjaśnić, ale kompletnie nie zrozumiałem jego punktu).