394 Stimmen

Wie verwende ich die Kaskadenlöschung mit SQL Server?

Ich habe 2 Tabellen: T1 und T2, es sind bestehende Tabellen mit Daten. Zwischen T1 und T2 besteht eine Eins-zu-viele-Beziehung. Wie ändere ich die Tabellendefinitionen, um ein kaskadierendes Löschen in SQL Server durchzuführen, wenn ein Datensatz aus T1 gelöscht wird, werden alle zugehörigen Datensätze in T2 ebenfalls gelöscht.

Zwischen ihnen besteht die ausländische Beschränkung. Ich möchte die Tabellen nicht löschen oder einen Trigger erstellen, um die Löschung für T2 durchzuführen. Wenn ich z. B. einen Mitarbeiter lösche, sollten auch alle Überprüfungsdatensätze gelöscht werden.

T1 - Mitarbeiter,

Employee ID      
Name
Status

T2 - Leistungsbeurteilungen,

Employee ID - 2009 Review
Employee ID - 2010 Review

16voto

ravula sandeep Punkte 401

Zuerst wird die Eigenschaft ONCascade aktiviert:

1. die bestehende Fremdschlüssel-Beschränkung aufheben

2.fügen Sie einen neuen hinzu, wobei die Einstellung ON DELETE CASCADE aktiviert ist

Ex:

IF EXISTS(SELECT 1 FROM sys.foreign_keys WHERE parent_object_id = OBJECT_ID(N'dbo.Response'))
 BEGIN 

ALTER TABLE [dbo].[Response] DROP CONSTRAINT [FK_Response_Request]  

ALTER TABLE [dbo].[Response] WITH CHECK ADD CONSTRAINT [FK_Response_Request]  FOREIGN KEY([RequestId])
REFERENCES [dbo].[Request] ([RequestId])
ON DELETE CASCADE
END

ELSE

 BEGIN 
 ALTER TABLE [dbo].[Response] WITH CHECK ADD CONSTRAINT [FK_Response_Request]  FOREIGN KEY([RequestId])
REFERENCES [dbo].[Request] ([RequestId])
ON DELETE CASCADE
END

Zweitens: Deaktivieren der Eigenschaft ONCascade:

1. die bestehende Fremdschlüssel-Beschränkung aufheben

2. ein neues hinzufügen, wobei die Einstellung EIN LÖSCHEN OHNE AKTION aktiviert ist

Ex:

IF EXISTS(SELECT 1 FROM sys.foreign_keys WHERE parent_object_id = OBJECT_ID(N'dbo.Response'))
 BEGIN 
ALTER TABLE [dbo].[Response] DROP CONSTRAINT [FK_Response_Request]  

ALTER TABLE [dbo].[Response] WITH CHECK ADD CONSTRAINT [FK_Response_Request]  FOREIGN KEY([RequestId])
REFERENCES [dbo].[Request] ([RequestId])
ON DELETE CASCADE
END

ELSE

 BEGIN 
 ALTER TABLE [dbo].[Response] WITH CHECK ADD CONSTRAINT [FK_Response_Request]  FOREIGN KEY([RequestId])
REFERENCES [dbo].[Request] ([RequestId])
ON DELETE NO ACTION 
END

-6voto

frank e Punkte 1

Wenn die Eins-zu-viele-Beziehung von T1 zu T2 ist, dann stellt sie keine Funktion dar und kann daher nicht verwendet werden, um eine inverse Funktion abzuleiten oder abzuleiten, die garantiert, dass der resultierende T2-Wert keine Tupel von T1 join T2 auslässt, die deduktiv gültig sind, weil es keine deduktiv gültige inverse Funktion gibt. ( Die Darstellung von Funktionen war der Zweck von Primärschlüsseln. ) Die Antwort in SQL think lautet: Ja, man kann es tun. Die Antwort im relationalen Denken lautet: Nein, das geht nicht. Siehe Punkte der Mehrdeutigkeit in Codd 1970. Die Beziehung müsste von T1 zu T2 viel zu eins sein.

-16voto

Apple Lover Punkte 1

Ich denke, Sie können nicht nur die Tabellen Eigenschaft löschen, was, wenn dies tatsächliche Produktionsdaten ist, löschen Sie einfach die Inhalte, die nicht das Tabellenschema beeinflussen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X