
Δουλεύω σε μια βάση δεδομένων που παρακολουθεί τα αρχεία και τις εξαρτήσεις σε έργα. Εν συντομία, έχω δύο κύριους πίνακες? οι λίστες ΕΡΓΑ πίνακα του έργου ονόματα και άλλες ιδιότητες, ο πίνακας ΑΡΧΕΙΑ απαριθμεί τα αρχεία. Κάθε σημεία εισόδου αρχείων σε ένα έργο σαν ένα ξένο κλειδί που να CASCADE, οπότε αν μπορώ να διαγράψω ένα αρχείο έργου από τη βάση δεδομένων, όλα τα στοιχεία του αρχείου εξαφανίζονται επίσης. Μέχρι εδώ καλά.


Τώρα έχω ένα επιπλέον τραπέζι εξαρτήσεις. Κάθε εγγραφή στον πίνακα εξάρτησης είναι δύο αρχεία, διευκρινίζοντας ότι το πρώτο αρχείο εξαρτάται από την δεύτερη. Και πάλι αυτά είναι ξένα κλειδιά, η πρώτη έχει οριστεί σε CASCADE (οπότε αν μπορώ να διαγράψω μια καταχώρηση αρχείου, το αρχείο αυτό διαγράφεται), αλλά η δεύτερη έχει οριστεί για τον περιορισμό (γι 'αυτό δεν μου επιτρέπεται να διαγράψετε μια καταχώρηση αρχείου αν υπάρχουν άλλα αρχεία εξαρτώνται σε αυτό). Και πάλι, όλα φαίνονται καλά.


Δυστυχώς, φαίνεται ότι δεν μπορώ πια να διαγράψετε ένα έργο με ένα μόνο SQL διαγραφή δήλωση! Οι διαγραφής προσπαθεί να καταρράκτης-διαγράψετε τα αρχεία, αλλά αν κάποια από αυτές εμφανίζονται στον πίνακα εξαρτήσεις, το περιορίζει ξένο κλειδί δεν επιτρέπει τη διαγραφή (έστω και αν η εγγραφή στον πίνακα εξαρτήσεων θα πρέπει να αφαιρεθεί, διότι η άλλη στήλη είναι CASCADE). Η μόνη λύση που έχω είναι να υπολογίσει με ακρίβεια για να διαγράψετε τα αρχεία, ώστε κανένας από τους περιορισμούς ρεκόρ της εξάρτησης παραβιάζονται, και αφαιρέστε τις εγγραφές του αρχείου, ένα κάθε φορά, πριν επιχειρήσετε να αφαιρέσετε το έργο.


Υπάρχει κάποιος τρόπος για να δημιουργήσει σχήμα βάσης δεδομένων μου, έτσι μια ενιαία SQL διαγράψει από τον πίνακα έργων θα καταρράκτη σωστά τις άλλες διαγραφές εκεί; Είμαι χρησιμοποιώντας Firebird 2.1, αλλά δεν ξέρω αν αυτό κάνει καμία διαφορά - φαίνεται ότι θα έπρεπε να υπάρχει ένας τρόπος για να γίνει αυτό το έργο;

 
Αντικρουόμενες CASCADE και να περιορίσει την ξένη βασικές απαιτήσεις;
=====================================================================



Δεν μπορείτε να ελέγξετε τη σειρά της διαγραφής μέσω υπερχείλιση ξένο κλειδί, αλλά ίσως να είναι σε θέση να σχεδιάσει ένα έναυσμα για `PROJECTS`να διαγράψετε γραμμές σε `FILES`ότι ανήκουν σε αυτό το πρόγραμμα και παρατίθενται επίσης στο `DEPENDENCIES`ως εξαρτάται από άλλους `FILES`. Το κάνετε μια `BEFORE DELETE`σκανδάλη, γι 'αυτό θα πρέπει να εκτελέσει πριν από τις πολλαπλές επιπτώσεις.


Κάτι σαν αυτό:



```
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

```

Έτσι, όταν διαγράφετε ένα έργο, αυτό διαγράφει όλα τα «παιδί» των αρχείων ενός έργου που εξαρτώνται από άλλα αρχεία, και αυτό καταρράκτες να διαγράψετε γραμμές στο `DEPENDENCIES`έτσι όλα τα υπόλοιπα αρχεία είναι χωρίς εξαρτήσεις. Διαγραφή σας του έργου μπορεί τώρα καταρράκτη να διαγράψετε αυτά τα αρχεία.


Δεν το έχω δοκιμάσει αυτό και Firebird σύνταξη μου μπορεί να είναι σκουριασμένα, αλλά ίσως αυτό θα σας πάρει ξεκίνησε.


Προφανώς, παρακαλούμε να ελέγξετε σε ένα αντίγραφο των δεδομένων σας, όχι τα ζωντανά στοιχεία!

 

Μήπως η υποστήριξη του συστήματος αναβάλλεται περιορισμούς, με την οποία ο έλεγχος περιορισμός μπορεί να αναβληθεί μέχρι ένα σημείο διαπράξει;


Ίσως αυτό είναι μόνο ένα πράγμα Oracle όμως.

 