Ich habe die folgende DDL, die ich mit SQL Server 2012 verwende:
%Vor%Was ich möchte, dass der SQL Server mich daran hindert, einen Elternteil zu löschen, wenn ein Verweis auf diesen Elternteil im Kind existiert? Zum Beispiel möchte ich eine Löschung auf subjectID = 3 in Betreff, um zu scheitern, wenn es Kinder mit SubjectId von 3 gibt.
Dafür bin ich unklar und kann die Antwort nicht finden. Muss ich "DELETE NO ACTION" hinzufügen oder kann ich diese drei Wörter nicht entfernen.
Ich stelle diese Frage, da ich in einer ähnlichen Frage eine Antwort hatte, dass ich einen Auslöser für den Elternteil definieren sollte. Ich dachte jedoch, nur den Fremdschlüssel zu definieren würde mich stoppen, das Elternteil zu löschen, wenn ein Kind existiert.
Von der column_constraint-Seite auf MSDN :
EIN LÖSCHEN {KEINE AKTION | CASCADE | SET NULL | SET DEFAULT}
Gibt an, welche Aktion mit Zeilen in der Tabelle ausgeführt wird, die geändert wird Zeilen haben eine referenzielle Beziehung und die referenzierte Zeile wird gelöscht aus der Elterntabelle. Der Standardwert ist KEINE AKTION .
Also, du kannst ON DELETE NO ACTION
lieben, wenn du magst und es wird genauso funktionieren.
KEINE AKTION bedeutet, dass nichts passiert, wenn Sie von Ihrer Betreff-Tabelle zur Themen-Tabelle löschen. In diesem Fall, wenn es eine Zeile in Topic für eine gegebene SubjectId gibt, können Sie nicht löschen, ohne die referenzielle Integrität zu zerstören, so dass das Löschen rückgängig gemacht wird.
Mehr von MSDN:
KEINE AKTION - Das SQL Server-Datenbankmodul löst einen Fehler aus und der Löschaktion für die Zeile in der übergeordneten Tabelle wird zurückgesetzt.
Sie können die Schlüsselwörter entfernen (dies ist die Standardeinstellung)
%Vor%Wäre besser, diese Aktionen anzugeben
%Vor%Hier finden Sie weitere Informationen: Ссылка
Sie müssen einen Trigger schreiben, um sicherzustellen, dass untergeordnete Zeilen nicht gelöscht werden, da ich nicht glaube, dass SQL Server diese Option von ON DELETE RESTRICT
Ich werde Ihnen vorschlagen, dass, während Sie die Aktion "Keine Aktion löschen" überspringen können, es nicht in Ihrem besten Interesse ist, dies zu tun. Wenn dies in der Tabellendefinition angegeben wird, kann später verhindert werden, dass jemand ein Kaskadierungslöschung hinzufügt, weil sie erkannt haben, dass dies nicht beabsichtigt ist. Dies gilt insbesondere dann, wenn Sie alle Datenbankobjekte korrekt skripten und sie in die Quellcodeverwaltung einbetten, und der Code-Überprüfer erkennt, dass ein Unterschied besteht, und fragt, warum das passiert ist. Allzu oft sind die Leute zu eifrig bemüht, Löschkaskaden hinzuzufügen und Daten zu zerstören, die aufbewahrt werden sollten (wie Finanzdaten für einen Kunden, der nicht mehr gültig ist). Sie tun dies, weil sie den Fehler bekommen, der sie nicht löschen lässt und einfach nur loswerden will, anstatt zu realisieren, dass dies ihnen vor einem massiven Fehler bewahrt. Zumindest, wenn Sie den Code für Delete No Action in Ihrem Tabellenskript haben, werden zukünftige Betreuer sehen, dass dies beabsichtigt war und nicht nur, dass Sie vergessen haben, Kaskadenlöschungen einzurichten. Natürlich, wenn Ihr dba keine kaskadierenden Löschungen erlaubt (wie viele nicht und aus gutem Grund!), Dann ist dies kein potentielles Problem, aber die Angabe Ihrer Absicht ist oft eine gute Sache für Wartbarkeit.
Tags und Links sql sql-server sql-server-2012