sql >> Databasteknik >  >> RDS >> Sqlserver

Kaskadera på radera eller använda triggers?

KASKADRADERA i MSSQL Server kan bara kaskad till en enda tabell. Om du har två tabeller med främmande nyckelrelationer till en dimensionstabell kan du bara kaskadta bort till en av dem. (Detta är för att förhindra att raderingar går genom flera sökvägar och skapar konflikter, ungefär som C++ tillåter flera arv men C# bara tillåter enstaka arv)

När så är fallet tvingas du använda triggers eller specifikt hantera ärendet i din kod.

Av denna anledning har jag sett många människor välja att använda triggers i alla fall. Även när det bara finns ett utländskt bord. Detta säkerställer konsekvens och så att folk vet vad de ska leta efter när de underhåller databasen.

Om man kunde kaskad en radering till mer än en tabell skulle jag säga att det skulle vara det mest föredragna alternativet. Den här begränsningen lerar dock vattnet och jag är för närvarande mer för triggers som äger alla sådana beteenden. Overheaden med att använda triggers för kaskadraderingar och uppdateringar är endast liten när det gäller kodning, men tillåter standardpraxis som är verkligt generiska.

EDIT:

Du kanske vill flytta det "godkända svaret" till någon annan, jag har kommit fram till att jag hade fel om ovanstående.

Du KAN ha flera faktatabeller som har ON DELETE CASCADE Utländska nyckelkontraint till en teckendimensionstabell.

Vad du inte kan göra är att en faktatabell har ON DELETE CASCADE Utländska nyckelbegränsningar till flera dimensionstabeller.

Så till exempel...
- Dimensionstabell [Person] (id INT IDENTITY, )
- Dimensionstabell [Exam] (id INT IDENTITY, )
- Face Table [Exam_Score] (person_id INT, exam_id INT, poäng INT)

Om antingen personen eller provet raderas, vill du att de tillhörande Exam_Score-posterna också ska raderas.

Detta är inte möjligt med ON DELETE CASCADE i MS SQL Server, och därför behövs triggers.

(Ursäkta till Mehrdad som försökte förklara detta för mig men jag missade helt hans poäng.)



  1. Den specifika modulen kunde inte hittas. Undantag från HRESULT:0x8007007E

  2. Att omge kolumnnamn inom dubbla citattecken med CREATE-kommandot i Oracle fungerar inte korrekt. Varför?

  3. user postgres lanserar en process som tar alla processorer till 100 % användning

  4. utvalda användare har mer än en distinkt post i mysql