2010-11-19 13 views
5

Haben Sie eine Tabelle namens Person. , die personid und contactid hat.Design-Entscheidung für DELETE SQL

Wenn eine Person gelöscht wird, dann möchte ich die Person aus der db und auch die zugehörigen Kontakte für diese Person entfernen.

Ist es besser, die DELETES in einem Store-Verfahren zu tun oder sollte meine Business-Schicht zuerst den pContactDelete aufrufen und dann pPersonDelete aufrufen ???????

dank Niall

+0

Nur ein Vorschlag, aber das ist die Art von Sache, die irgendwann ein 'UNDO' benötigen könnte (dh eine Person in Ihrem System wiederherstellen). Haben Sie darüber nachgedacht, eine "aktive" Flagge auf Ihrer Person zu haben und eine logische und keine physische Löschung vorzunehmen? – Paddy

Antwort

12

Sie verwenden MS SQL Server Unter der Annahme:

Sie sollten wahrscheinlich ON DELETE CASCADE auf Fremdschlüssel verwenden.

ALTER TABLE Contact 
ADD CONSTRAINT FK_PersonContact FOREIGN KEY (PersonId) 
REFERENCES Person(PersonId) ON DELETE CASCADE 

Dadurch wird sichergestellt, dass eine Kontaktzeile gelöscht wird, wenn die Personenzeile gelöscht wird. Es ist eine Einschränkung, die immer von der Datenbank erzwungen wird.

Sie können dies auch in SQL Management Studio im Dialogfeld Fremdschlüsselbeziehungen festlegen, Abschnitt INSERT- und UPDATE-Spezifikation, Regel löschen -> auf Cascade setzen.

Stellen Sie sicher, dass Sie, wenn Sie Ihre Contact Objekte in Ihrer Business-Schicht zwischenspeichern, auch Ihren Cache aktualisieren.

1

Sie

Taste, um eine kaskadierende Wirkung auf die Ihre Referenz definieren
1

Jeder Ansatz nehmen Sie sollten die Daten in konsistenten Zustand sein. Es wäre einfacher, wenn Sie Operationen in beiden Tabellen in derselben gespeicherten Prozedur ausführen. Wenn Sie es in Ihr Geschäft einbringen, sollten Sie die Transaktion verwenden. Wenn Ihre Kontakte nicht gelöscht werden, können Sie die Löschung der Person rückgängig machen.

1

Wenn Sie Oracle verwenden, haben Sie einige Optionen.

  1. Richten Sie den Fremdschlüssel zwischen den PERSON- und CONTACT-Tabellen zum Kaskadenlöschvorgang ein.

  2. Erstellen Sie einen ON DELETE-Trigger und führen Sie die Löschungen dort durch. Diese Option bietet Ihnen auch die Möglichkeit, alle erforderlichen Prüfprotokolleinträge zu erstellen oder in Protokolldateien usw. zu schreiben, die möglicherweise erforderlich sind, wenn etwas gelöscht wird.

Teilen und genießen.

+0

+1 nicht auf Oracle beschränkt, da verschiedene RDBMS ON DELETE CASCADE für Fremdschlüssel und ON DELETE Trigger unterstützen – fredt

0

Meine Herangehensweise an dieses Problem besteht darin, KEINE Kaskadenlöschbedingungen als generelles Prinzip zu verwenden. Kaskadierende Löschungen können bei zyklischen Referenzen bizarre Auswirkungen haben. In einer Produktionsumgebung ist es ratsam, das Löschen von untergeordneten Referenzen über die eine gespeicherte Prozedur zu behandeln. Sie müssen diesen Anruf nicht von der Business-Schicht aus tätigen, solange Sie vor dem Löschen der Kontakte keine signifikante Validierung durchführen.

+0

Ich habe so eine schlechte Vorstellung, dass ich eine Situation nicht sehen kann, wo es zyklische Verweise auf Fremdschlüssel mit kaskadierenden Löschungen geben könnte. Ich denke Delete <-> Set Null (oder Set Default) ist häufiger. –

+0

Hallo Arto, Um Ihrer Phantasie zu helfen, nehmen Sie Master-Tabelle "SalesMan" und Kind-Tabelle als "Bestellung". Die Auftragstabelle enthält "PrimarySalesManId" und "SecondarySalesManId". Wenn Sie nun einen Datensatz aus der Master-Tabelle löschen möchten und ein Kaskadierungs-Löschen aktiviert ist, wie können Sie erwarten, dass das Löschen funktioniert? Hilft es? – Hunter

Verwandte Themen