In Konflikt stehende CASCADE und Fremdschlüssel Anforderungen einstelle?

stimmen
2

Ich arbeite an einer Datenbank, die Dateien und Abhängigkeiten in Projekten verfolgt. Kurz gesagt, ich habe zwei Haupttabellen; Die Projekte Tabelle listet Namen und andere Eigenschaften projizieren, listet die Dateien Tabellendateien. Jeder Dateieintrag verweist auf ein Projekt als Fremdschlüssel zu CASCADE eingestellt, so dass, wenn ich ein Projekt Datensatz aus der Datenbank löschen, werden alle Dateieinträge verschwinden auch. So weit, ist es gut.

Jetzt habe ich einen zusätzlichen DEPENDENCIES Tisch. Jeder Datensatz in der Abhängigkeitstabelle ist zwei Dateien, die Angabe, dass die erste Datei auf dem zweiten abhängt. Wieder sind diese Fremdschlüssel wird die erste auf CASCADE eingestellt (also wenn ich eine Datei Eintrag löschen, dieser Datensatz gelöscht wird), aber der zweite Satz ist zu beschränken (so einen Dateieintrag zu löschen, wenn alle anderen Dateien, die ich bin nicht abhängig erlaubt darauf). Auch hier scheint alles gut.

es scheint, kann ich leider nicht mehr ein Projekt mit einem einzigen SQL-Anweisung löschen löschen! Der Lösch versucht, die Dateien in Kaskade löschen, aber wenn irgendetwas davon in der DEPENDENCIES Tabelle angezeigt, die einstelle Fremdschlüssel den Lösch verhindert (obwohl dieser Datensatz in der Tabelle Abhängigkeiten entfernt werden, da die andere Säule CASCADE ist). Die einzige Abhilfe, die ich habe, ist eine genaue Reihenfolge zu berechnen, die Dateien so keines der Abhängigkeitsrekord Einschränkungen verletzt werden zu löschen und entfernen Sie eine Datei die Aufzeichnungen zu einem Zeitpunkt, bevor das Projekt zu entfernen.

Gibt es eine Möglichkeit, mein Datenbankschema einzurichten so dass eine einzelne SQL aus der Projekte-Tabelle löscht, wird die anderen Löschungen richtig kaskadieren? Ich bin mit Firebird 2.1, aber ich weiß nicht, ob das einen Unterschied macht - es scheint, wie es sollte ein Weg, um diese Arbeit zu machen?

Veröffentlicht am 09/12/2008 um 19:51
quelle vom benutzer
In anderen Sprachen...                            


2 antworten

stimmen
0

Unterstützt das System Zwang Verschoben, in dem die Bedingungsprüfung, bis ein COMMIT-Punkt verschoben werden kann?

Vielleicht ist es nur eine Oracle-Sache aber.

Beantwortet am 09/12/2008 um 20:11
quelle vom benutzer

stimmen
4

Sie können nicht die Reihenfolge der Löschung durch eine Kaskadierung von Fremdschlüssel steuern, aber Sie können einen Trigger entwerfen können , auf PROJECTSZeilen löschen in FILESdie zu diesem Projekt gehören und auch in aufgeführt DEPENDENCIESals abhängig von anderen FILES. Machen Sie es einen BEFORE DELETEAuslöser, so sollte es vor den Kaskadeneffekte auszuführen.

Etwas wie das:

CREATE TRIGGER Del_Child_Files FOR PROJECTS
BEFORE INSERT IGNORE 
AS BEGIN
  FOR SELECT F.FILE_ID FROM FILES F JOIN DEPENDENCIES D 
      ON F.FILE_ID = D.CHILD_ID
    WHERE F.PROJECT_ID = OLD.PROJECT_ID
    INTO :file_id
  DO
    DELETE FROM FILES WHERE FILE_ID = :file_id;
  DONE
END

Also , wenn Sie ein Projekt löschen, löscht dies alle „Kind“ Dateien eines Projekts , das auf andere Dateien abhängig sind, und diese Kaskaden Zeilen gelöscht werden in DEPENDENCIESso alle übrigen Dateien sind frei von Abhängigkeiten. Ihre Löschung des Projekts können nun kaskadieren , diese Dateien zu löschen.

Ich habe nicht getestet dies und meine Firebird Syntax kann rostig sein, aber vielleicht wird es Sie loslegen.

Offensichtlich bitte testen diese auf einer Kopie Ihrer Daten, nicht die Live-Daten!

Beantwortet am 09/12/2008 um 20:24
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more