mandos Δημοσ. 15 Νοεμβρίου 2007 Δημοσ. 15 Νοεμβρίου 2007 Καλημέρα, εδώ και μερικές μέρες άρχισα να διαβάζω προγραμματισμό (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 είναι παραπάνω από καλοδεχούμενη! ΥΓ: δεν ξέρω αν περιγράφω σωστά το πρόβλημα, έχω αρκετές δυσκολίες ακόμα με τα τεχνικά και με την ορολογία, διωρθώστε με σε τυχών λάθη
sgoll Δημοσ. 15 Νοεμβρίου 2007 Δημοσ. 15 Νοεμβρίου 2007 ΦΙΛΕ ΤΡΕΞΕ ΑΥΤΟ : 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.
mandos Δημοσ. 15 Νοεμβρίου 2007 Μέλος Δημοσ. 15 Νοεμβρίου 2007 ευχαριστώ πολλύ! το output είχε τα FK και δίπλα ανέφερε τους parent & child πίνακες του καθενός, αυτό που έψαχνα από το πρώι δεν καταλαβαίνω ακόμα πως δουλεύει το query που μου έδωσες, αλλά δεν έκανα ακόμα το απαραίτητο googling procedures θα μάθω να φτιάχνω από βδομάδα, έχω αρχίσει και θολώνω! να ρωτίσω, αυτό παίζει και σε oracle??
sgoll Δημοσ. 16 Νοεμβρίου 2007 Δημοσ. 16 Νοεμβρίου 2007 ΧΑΙΡΟΜΑΙ ΠΟΥ ΒΟΗΘΗΣΑ, ΤΟ QUREY ΧΡΗΣΙΜΟΠΟΙΗΕΙ ΤΟΥΣ SYSTEM ΠΙΝΑΚΕΣ ΤΗΣ SQL ΒΑΣΗΣ(ΕΚΕΙ ΓΡΑΦΟΝΤΑΙ ΤΑ ΠΑΝΤΑ ΠΟΥ ΔΗΜΙΟΥΡΓΕΙΣ) ΚΑΝΟΝΤΑΣ JOIN ME TA ΠΕΔΙΑ ΠΟΥ ΠΡΕΠΕΙ (Ο ΠΙΝΑΚΑΣ SYSOBJECTS ΑΝΑΦΕΡΑΤΑΙ ΤΡΕΙΣ ΦΟΡΕΣ ΓΙΑΤΙ ΓΙΝΕΤΑΙ JOIN ME ΔΙΑΦΟΡΕΤΙΚΑ ΠΕΔΙΑ ΚΑΙ ΑΛΛΟ ALIAS).ΓΙΑ ΤΗΝ ORACLE ΘΑ ΠΡΕΠΕΙ ΝΑ ΧΡΗΣΙΜΟΠΟΙΗΣΕΙΣ ΤΟΥΣ ΑΝΤΙΣΤΟΙΧΟΥΣ ΠΙΝΑΚΕΣ ΤΗΣ .ΠΡΟΤΕΙΝΩ ΝΑ ΤΟ ΚΑΝΕΙΣ ΝΑ ΔΟΥΛΕΨΕΙ ΠΡΩΤΑ ΣΕ SQL SERVER KAI META ΣΕ ORACLE.EAN ΘΕΣ ΒΟΗΘΕΙΑ ΓΙΑ PROCEDURE ΠΟΣΤΑΡΕ.
Bspus Δημοσ. 16 Νοεμβρίου 2007 Δημοσ. 16 Νοεμβρίου 2007 Εγω παλι δεν εχω καταλαβει τι ακριβως θες να κανεις που δεν μπορεις να κανεις με το cascade delete. Αν το parent table ειναι οι πολεις και το child οι πελατες, αμα σβησεις μια εγγραφη απο τις πολεις, ολες οι εγγραφες των πελατων που σχετιζονται με τη συγκεκριμενη πολη θα διαγραφουν επισης (cascade delete με integrity constraint). Αν σβησεις ολες τις εγγραφες των πολεων, θα σβηστουν και ολοι οι πελατες, εκτος αν εχεις επιτρεψει το πεδιο της πολης στον πελατη να ειναι Νull και υπαρχουν και τετοιες εγγραφες. Για ποιο λογο θες να κανεις αυτη τη διαδικασια χειρωνακτικα και τι θα κερδισεις?
mandos Δημοσ. 16 Νοεμβρίου 2007 Μέλος Δημοσ. 16 Νοεμβρίου 2007 η απάντηση είναι: γιατί έτσι μου το ζήτησαν ωστόσο κατάλαβα το πρόβλημα τους όταν μου το εξήγησαν αν δεν έχεις το CASCADE DELETE ON τότε δεν μπορείς να σβήσεις μια πόλη (γιατί θα πρέπει πρώτα να έχεις σβήσει τους πελάτες) αν τρέξεις το procedure θα ανάλαβει να τα κάνει μόνο του, αλλά όπως είπες είναι manual, οπότε μειώνεις τις πιθανότητες λάθους αυτό μου ανέφεραν σαν σημαντικότερο λόγο βρήκα αυτό στο νετ: http://weblogs.asp.net/sbehera/archive/2006/02/14/438200.aspx το οποίο κάνει την δουλεία που ψάχνω σε γενικές γραμμές με τον κώδικα που μου έδωσες Sgoll και με αυτό θα κοιτάξω να μάθω τι ακριβώς γίνεται και με ποια σειρά μελλοντικά θα το ψάξω και για oracle
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.