Woher weiß ich, ob datasatz aus einer SQL-database an anderer Stelle verwendet wird?

Gibt es eine Möglichkeit zu wissen, dass ein datasatz von einem anderen datasatz in der database verwendet wird?

Verwenden Sie das Löschen als Beispiel: Wenn ich eine SQL-statement erstellen, die versucht, eine Gruppe in dbo.group zu löschen, bekomme ich diese Fehlermeldung:

Die DELETE-statement steht im Widerspruch zur REFERENCE-Einschränkung "FK_MyTable". Der Konflikt trat in der database "MyDB", Tabelle "dbo.User", Spalte 'Group_ID' auf.

Da ich einen Benutzer habe, der eine ausländische Schlüsselbeziehung zur Gruppe hat, kann ich die Gruppe nicht löschen. Ich möchte in der Lage sein zu wissen, ob der datasatz mit anderen datasätzen verknüpft ist, bevor ich die Delete-statement ausführe. Gibt es einen path, das zu tun?

Grundsätzlich möchte ich dem Benutzer zeigen, dass der Rekord, den sie sehen, undeleable ist. Ich möchte nicht versuchen, den datasatz zu löschen.

Andere Leute weisen auf Möglichkeiten hin, um abhängige Zeilen zu erkennen, aber das Problem damit ist, dass es eine Racebedingung gibt: Wenn Ihr Test keine abhängigen Zeilen findet und Sie versuchen, die Gruppe zu löschen, könnte es eine andere Client-Anwendung geben, die eine abhängige Zeile hinzufügt der kurze Moment zwischen deinen beiden Abfragen. Also deine Informationen, die die Gruppe nicht benutzt hat, ist potentiell veraltet, sobald du es bekommst.

Der bessere Ansatz ist, zu versuchen, die Gruppe zu löschen, und behandeln alle Fehler, die angehoben werden

Dies ist auch besser für die performance, da Sie keine SELECT Abfrage ausführen müssen, um zu prüfen, ob die abhängigen Zeilen vorhanden sind.


Re deinen Kommentar und bearbeitete Frage: Okay, fair genug, es macht Sinn, diese Informationen zu verwenden, um Hinweise für den Benutzer zu geben (zB eine "Löschgruppe" -button oder sonst grau aus der Schaltfläche).

In diesem Fall können Sie einen der Vorschläge von anderen Leuten verwenden, z. B. Abfrage der Anzahl der abhängigen Zeilen in der Tabelle Users . Wenn Sie Informationen für mehrere Gruppen benötigen, würde ich eine Abfrage machen, die Groups zu Users join und dann durch die Gruppen-ID gruppieren.

 SELECT g.groupid, COUNT(*) AS user_count FROM dbo.Groups g JOIN dbo.Users u ON (g.groupid = u.groupid) GROUP BY g.groupid; 

Das wäre besser als eine separate SQL-Abfrage für jede Gruppe, um die Anzahl der Benutzer zu bekommen.

Wenn Sie nicht wissen, wie viele Tabellen auf Groups angewiesen sind, sollten Sie lernen, die INFORMATION_SCHEMA Systemansichten zu verwenden, um nach Metadaten abzufragen. Ich glaube nicht, dass dies für dich der Fall ist, also werde ich nicht ins Detail gehen.

Machen Sie eine Abfrage, die überprüft, ob es Benutzer gibt, die die Spalte group_id auf die ID haben, die Sie löschen möchten. Wenn die Abfrage 0 Zeilen zurückgibt, können Sie ohne exception löschen

 SELECT count(group_id) FROM dbo.User WHERE group_id = [yourgroupidtodeletevalue] 
  1. Sie können kaskadierende Löschungen einrichten.

  2. Sie können die Forign Key-Tabelle abfragen. Der Fehler zeigt an, welche Tabelle von der Fremdschlüssel-search abhängig ist.