sql >> Database teknologi >  >> RDS >> Sqlserver

Cascade på Slet eller bruge triggere?

CASCADE SLETT i MSSQL Server kan kun kaskade til en enkelt tabel. Hvis du har to tabeller med fremmednøglerelationer til en dimensionstabel, kan du kun kaskadeslette til én af dem. (Dette er for at forhindre, at sletninger kaskade gennem flere stier og skabe konflikter, ligesom C++ tillader multipel nedarvning, men C# kun tillader enkelt nedarvning)

Når dette er tilfældet, er du tvunget til at bruge triggere eller specifikt håndtere sagen i din kode.

Af denne grund har jeg set mange mennesker vælge at bruge triggere i alle tilfælde. Også når der kun er ét udenlandsk bord. Dette sikrer konsistens, og så folk ved, hvad de skal kigge efter, når de vedligeholder databasen.

Hvis man kunne kaskadere en sletning til mere end én tabel, ville jeg sige, at det ville være den mest foretrukne mulighed. Denne begrænsning gør imidlertid vandet mudret, og jeg er i øjeblikket mere tilhænger af triggere, der ejer al sådan adfærd. Overheaden ved at bruge triggere til kaskadede sletninger og opdateringer er kun mindre med hensyn til kodning, men giver mulighed for standardpraksis, der er virkelig generisk.

EDIT:

Du vil måske flytte det 'accepterede svar' til en anden, jeg har fundet ud af, at jeg tog fejl af ovenstående.

Du KAN have flere faktatabeller til at have ON SLET CASCADE Fremmednøglekontraint til en signle-dimensionstabel.

Hvad du ikke kan gøre, er at have én faktatabel til at have ON SLET CASCADE Fremmednøglebegrænsninger til flere dimensionstabeller.

Så for eksempel...
- Dimensionstabel [Person] (id INT IDENTITY, )
- Dimensionstabel [Eksamen] (id INT IDENTITY, )
- Face Table [Exam_Score] (person_id INT, eksamens_id INT, score INT)

Hvis enten personen eller eksamen slettes, vil du gerne have, at de tilhørende Exam_Score record(s) også slettes.

Dette er ikke muligt at bruge ON DELETE CASCADE i MS SQL Server, og derfor er der behov for triggere.

(Undskyld til Mehrdad, som prøvede at forklare mig dette, men jeg missede fuldstændig hans pointe.)



  1. Infinite Scroll Indlæser alle elementer på én gang?

  2. Hvordan importerer jeg en .sql-fil i mysql-databasen ved hjælp af PHP?

  3. Hvordan bruger jeg PHP korrekt til at kode MySQL-objekt til JSON?

  4. Flytning af en database med pg_dump og psql -U postgres db_name <... resulterer i FEJL:relation tabelnavn eksisterer ikke