sql >> Database >  >> RDS >> Sqlserver

Cascade bij verwijderen of triggers gebruiken?

CASCADE VERWIJDEREN in MSSQL Server kan alleen naar een enkele tabel worden gecascadeerd. Als u twee tabellen met externe-sleutelrelaties met een dimensietabel hebt, kunt u slechts één van beide trapsgewijs verwijderen. (Dit is om te voorkomen dat verwijderingen door meerdere paden lopen en conflicten veroorzaken, net zoals C++ meerdere overerving toestaat, maar C# alleen enkele overerving toestaat)

Wanneer dit het geval is, wordt u gedwongen om triggers te gebruiken of specifiek de zaak in uw code af te handelen.

Om deze reden heb ik veel mensen zien kiezen om in alle gevallen triggers te gebruiken. Ook als er maar één buitenlandse tafel is. Dit zorgt voor consistentie en zodat mensen weten waar ze op moeten letten bij het onderhouden van de database.

Als men een verwijdering naar meer dan één tabel zou kunnen trapsgewijze, zou ik zeggen dat dit de meest geprefereerde optie zou zijn. Deze beperking vertroebelt echter de wateren en ik ben momenteel meer voorstander van triggers die al dergelijk gedrag bezitten. De overhead bij het gebruik van triggers voor trapsgewijze verwijderingen en updates is slechts klein in termen van codering, maar staat standaardpraktijken toe die echt generiek zijn.

BEWERKEN:

Misschien wil je het 'geaccepteerde antwoord' naar iemand anders verplaatsen, ik ben erachter gekomen dat ik het bij het verkeerde eind had met het bovenstaande.

U KUNT meerdere feitentabellen hebben met ON DELETE CASCADE Foreign Key-beperkingen voor een signle-dimensietabel.

Wat u niet kunt doen, is één feitentabel hebben met ON DELETE CASCADE Foreign Key-beperkingen voor meerdere dimensietabellen.

Dus bijvoorbeeld...
- Dimensietabel [Persoon] (id INT IDENTITY, )
- Dimensietabel [Exam] (id INT IDENTITY, )
- Gezichtstabel [Exam_Score] (person_id INT, exam_id INT, score INT)

Als de persoon of het examen wordt verwijderd, wilt u dat de bijbehorende Exam_Score-record(s) ook worden verwijderd.

Dit is niet mogelijk met ON DELETE CASCADE in MS SQL Server, dus er zijn triggers nodig.

(Excuses aan Mehrdad die me dit probeerde uit te leggen, maar ik miste zijn punt volledig.)



  1. Hoe voeg ik een nieuwe kolom toe aan de MYSQL-tabel?

  2. Mysql, mogelijk probleem met geneste categorie

  3. Oracle Sequence beginnend met 2 in plaats van 1

  4. Automatiseer de implementatie van uw MySQL- of Postgres-cluster vanuit een back-up