KASKÁDOVÉ ODSTRANĚNÍ v MSSQL Server může kaskádovat pouze do jedné tabulky. Pokud máte dvě tabulky se vztahy cizích klíčů k tabulce dimenzí, můžete kaskádově odstranit pouze jednu z nich. (Toto má zabránit tomu, aby se mazání kaskádovalo přes více cest a nevytvářelo konflikty, podobně jako C++ umožňuje vícenásobnou dědičnost, ale C# pouze jednu dědičnost)
V takovém případě jste nuceni použít spouštěče nebo konkrétně zpracovat případ ve vašem kódu.
Z tohoto důvodu jsem viděl mnoho lidí, kteří se rozhodli pro použití spouště ve všech případech. I když je tam jen jeden zahraniční stůl. To zajišťuje konzistenci a lidé tak vědí, co mají hledat při údržbě databáze.
Pokud by bylo možné kaskádovat mazání do více než jedné tabulky, řekl bych, že by to byla nejvýhodnější možnost. Toto omezení však kalí vody a v současné době jsem spíše zastáncem spouštěčů vlastnících všechna taková chování. Režie při použití spouštěčů pro kaskádová mazání a aktualizace je z hlediska kódování pouze malá, ale umožňuje standardní postupy, které jsou skutečně obecné.
UPRAVIT:
Možná budete chtít přesunout „přijatou odpověď“ na někoho jiného, zjistil jsem, že jsem se ve výše uvedeném mýlil.
MŮŽETE mít více tabulek faktů, které mají ON DELETE CASCADE Omezení cizího klíče k tabulce dimenzí signle.
Nemůžete udělat, aby jedna tabulka faktů měla ON DELETE CASCADE omezení cizích klíčů pro více tabulek dimenzí.
Takže například...
- Tabulka dimenzí [Person] (id INT IDENTITY, )
- Tabulka dimenzí [zkouška] (id INT IDENTITY, )
- Face Table [Skóre_zkoušky] (person_id INT, exam_id INT, skóre INT)
Pokud je smazána osoba nebo zkouška, měli byste chtít, aby byly smazány i související záznamy o skóre zkoušky.
To není možné pomocí ON DELETE CASCADE na MS SQL Server, proto jsou potřeba spouštěče.
(Omlouvám se Mehrdadovi, který se mi to snažil vysvětlit, ale úplně mi unikla jeho pointa.)