Προς το περιεχόμενο

SQL Cascade Delete, αλλά όχι με "ΟΝ DELETE CASCADE"


mandos

Προτεινόμενες αναρτήσεις

Καλημέρα,

 

εδώ και μερικές μέρες άρχισα να διαβάζω προγραμματισμό (vb.net και κατα συνέπεια και sql) και ξαφνικά συνιδιτοποιώ ότι 4 χρόνια turboc στο ΤΕΙ δεν ήταν προγραμματισμός... με βλέπω να ποστάρω συχνά σε αυτό το φόρουμ (κάτι που δεν είχα κάνει μέχρι τώρα)

 

anyway, στο πρόβλημα που έχω τώρα

θέλω να αδειάζω πίνακες σε sql-tables, όπου όταν αδιάζει ένα parent-table να αδιάζουν και τα child-tables (σε ότι βάθος φτάσει, ανάλογα με τα foreign keys που είναι δηλωμένα στους πινακές μου)

 

η εύκολη λύση για κάτι τέτοιο θα ήταν το cascade delete, αλλά δεν μου κάνει γιατί τότε εύκολα κάποιος θα μπορούσε να διαγράψει πχ μια πόλη και αυτομάτα να διαγραφθούν όλοι οι πελάτες χωρίς να γίνει έλεγχος (αν έχω καταλαβεί καλά την ορολογία αυτό σημαίνει ότι δεν θα είχα intergrity check)

οπότε η βάση μου πρέπει να μην επιτρέπει την cascade διαγραφή!

 

όταν θέλω να αδειάσω ένα parent-table θα πρέπει να εντοπίσω όλα τα child-tables και να τα αδιάσω ένα προς ένα

ψάχνω λοιπόν μια μέθοδο που να εντοπίζει τα child-tables, να πηγαίνει στα τελευταιά και να τα αδιάζει και να ανεβαίνει βήμα-βήμα προς το parent-table

 

ψάχνωντας βρήκα αυτό το function (γιατί το λένε function και όχι command?)

>
SELECT * FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE;

μου επιστρέφει τα keys στην βάση μου, με ένα where είδα ότι μπορώ εύκολα να πάρω μόνο τα foreign-keys

αλλά δεν με βοηθάει πολύ καθότι τα επιστρέφει με αλφαβητική σειρά, και όχι με κάποια σειρά που να δηλώνει την ιεραρχία μεταξύ των πινάκων

(όχι ότι αν τα επέστρεφε με σωστή σειρά θα ήξερα τι να κάνω... αλλά θα αισθανόμουν ότι είμαι σε καλύτερο δρόμο :-) )

 

any ideas/help είναι παραπάνω από καλοδεχούμενη!

 

ΥΓ: δεν ξέρω αν περιγράφω σωστά το πρόβλημα, έχω αρκετές δυσκολίες ακόμα με τα τεχνικά και με την ορολογία, διωρθώστε με σε τυχών λάθη

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

ΦΙΛΕ ΤΡΕΞΕ ΑΥΤΟ :

SELECT

Const.Name as ConstraintName ,

Fkey.Name as KeyTable ,

rkey.Name as ReferenceTable ,

INF.COLUMN_NAME

FROM

sysreferences SR INNER JOIN SYSOBJECTS Const ON Const.ID = SR.CONSTID

INNER JOIN SYSOBJECTS Fkey ON Fkey.ID = SR.FkeyID

INNER JOIN SYSOBJECTS rkey ON rkey.ID = sr.rkeyid

INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE INF ON Const.Name = INF.Constraint_Name

 

ΚΑΙ KANE ORDER ΒΥ ΟΠΩΣ ΘΕΛΕΙΣ .

 

ΕΑΝ ΘΕΣ ΤΡΕΞΕ ΤΟ SP_TABLES ΓΙΑ ΝΑ ΔΕΙΣ ΚΑΙ ΤΙ ΑΛΛΟΥΣ SYSTEM ΠΙΝΑΚΕΣ ΜΠΟΡΕΙΣ ΝΑ ΧΡΗΣΙΜΟΠΟΙΗΣΕΙΣ ΓΙΑ ΝΑ ΒΡΕΙΣ ΑΥΤΟ ΠΟΥ ΘΕΣ.

 

Η ΟΛΗ ΔΙΑΔΙΚΑΣΙΑ ΣΟΥ ΘΑ ΓΙΝΕΙ ΣΕ ΜΙΑ USERDEFINED PROCEDURE.create procedure etc... και κάθε φορά θα καλείς την procedure.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

ευχαριστώ πολλύ!

 

το output είχε τα FK και δίπλα ανέφερε τους parent & child πίνακες του καθενός, αυτό που έψαχνα από το πρώι :)

δεν καταλαβαίνω ακόμα πως δουλεύει το query που μου έδωσες, αλλά δεν έκανα ακόμα το απαραίτητο googling

 

procedures θα μάθω να φτιάχνω από βδομάδα, έχω αρχίσει και θολώνω!

 

να ρωτίσω, αυτό παίζει και σε oracle??

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

ΧΑΙΡΟΜΑΙ ΠΟΥ ΒΟΗΘΗΣΑ,

 

ΤΟ QUREY ΧΡΗΣΙΜΟΠΟΙΗΕΙ ΤΟΥΣ SYSTEM ΠΙΝΑΚΕΣ ΤΗΣ SQL ΒΑΣΗΣ(ΕΚΕΙ ΓΡΑΦΟΝΤΑΙ ΤΑ ΠΑΝΤΑ ΠΟΥ ΔΗΜΙΟΥΡΓΕΙΣ) ΚΑΝΟΝΤΑΣ JOIN ME TA ΠΕΔΙΑ ΠΟΥ ΠΡΕΠΕΙ (Ο ΠΙΝΑΚΑΣ SYSOBJECTS ΑΝΑΦΕΡΑΤΑΙ ΤΡΕΙΣ ΦΟΡΕΣ ΓΙΑΤΙ ΓΙΝΕΤΑΙ JOIN ME ΔΙΑΦΟΡΕΤΙΚΑ ΠΕΔΙΑ ΚΑΙ ΑΛΛΟ ALIAS).ΓΙΑ ΤΗΝ ORACLE ΘΑ ΠΡΕΠΕΙ ΝΑ ΧΡΗΣΙΜΟΠΟΙΗΣΕΙΣ ΤΟΥΣ ΑΝΤΙΣΤΟΙΧΟΥΣ ΠΙΝΑΚΕΣ ΤΗΣ .ΠΡΟΤΕΙΝΩ ΝΑ ΤΟ ΚΑΝΕΙΣ ΝΑ ΔΟΥΛΕΨΕΙ ΠΡΩΤΑ ΣΕ SQL SERVER KAI META ΣΕ ORACLE.EAN ΘΕΣ ΒΟΗΘΕΙΑ ΓΙΑ PROCEDURE ΠΟΣΤΑΡΕ.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Εγω παλι δεν εχω καταλαβει τι ακριβως θες να κανεις που δεν μπορεις να κανεις με το cascade delete.

Αν το parent table ειναι οι πολεις και το child οι πελατες, αμα σβησεις μια εγγραφη απο τις πολεις, ολες οι εγγραφες των πελατων που σχετιζονται με τη συγκεκριμενη πολη θα διαγραφουν επισης (cascade delete με integrity constraint). Αν σβησεις ολες τις εγγραφες των πολεων, θα σβηστουν και ολοι οι πελατες, εκτος αν εχεις επιτρεψει το πεδιο της πολης στον πελατη να ειναι Νull και υπαρχουν και τετοιες εγγραφες.

Για ποιο λογο θες να κανεις αυτη τη διαδικασια χειρωνακτικα και τι θα κερδισεις?

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

η απάντηση είναι: γιατί έτσι μου το ζήτησαν :)

 

ωστόσο κατάλαβα το πρόβλημα τους όταν μου το εξήγησαν

αν δεν έχεις το CASCADE DELETE ON τότε δεν μπορείς να σβήσεις μια πόλη (γιατί θα πρέπει πρώτα να έχεις σβήσει τους πελάτες)

 

αν τρέξεις το procedure θα ανάλαβει να τα κάνει μόνο του, αλλά όπως είπες είναι manual, οπότε μειώνεις τις πιθανότητες λάθους

αυτό μου ανέφεραν σαν σημαντικότερο λόγο

 

βρήκα αυτό στο νετ: http://weblogs.asp.net/sbehera/archive/2006/02/14/438200.aspx

το οποίο κάνει την δουλεία που ψάχνω σε γενικές γραμμές

με τον κώδικα που μου έδωσες Sgoll και με αυτό θα κοιτάξω να μάθω τι ακριβώς γίνεται και με ποια σειρά

μελλοντικά θα το ψάξω και για oracle

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...