Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια
σε

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

Εύρεση schema βάσης στον SQL Server

Îåêßíçóå áðü ôï ìÝëïò George J. Capnias. Τελευταία δημοσίευση από το μέλος Markos στις 25-03-2012, 22:50. Υπάρχουν 10 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  30-12-2008, 21:59 47316

    Εύρεση schema βάσης στον SQL Server

    Κάτι 'μαγειρεύω' τις τελευταίες μέρες και προσπαθώ να βρω τρόπους να 'βρίσκω' το schema μιας βάσης του SQL Server. Έχω ακούσει και έχω βρει διάφορους τρόπους, αλλά δεν είμαι σίγουρος ποιος από όλους είναι ο καλύτερος.

    Έχω κάποια SQL scripts που δίνουν το ποθητό αποτέλεσμα, αλλά δεν ξέρω πόσο 'wide' είναι - ξέρω ότι δουλέυουν στην έκδοση που έχω εγώ εγκατεστημένη, αλλά δεν ξέρω κατά πόσο δουλεύουν σε άλλες εκδόσεις του SQL server.

    Για όποιον θέλει να βοηθήσει, ας τα τρέξει σε μια βάση που ξέρει το schema της, να δει κατά πόσο τα αποτελέσματα που επιστρέφουν είναι σωστά. Παρακαλώ μόνο να αναφέρεται και η έκδοση του SQL Server που έτρεξαν για να ξέρω που δοκιμάστηκαν. Τα script έτρεξαν σε SQL Server 2008 - 10.0.1600.22, RTM, Express Edition with Advanced Services.

    Τα SQL scripts είναι τα παρακάτω:

    --Tables
    SELECT *
    FROM INFORMATION_SCHEMA.TABLES
    WHERE TABLE_TYPE='BASE TABLE'
    ORDER BY TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME

    --Columns
    SELECT *
    FROM INFORMATION_SCHEMA.COLUMNS INNER JOIN
    INFORMATION_SCHEMA.TABLES ON INFORMATION_SCHEMA.COLUMNS.TABLE_CATALOG = INFORMATION_SCHEMA.TABLES.TABLE_CATALOG AND
    INFORMATION_SCHEMA.COLUMNS.TABLE_SCHEMA = INFORMATION_SCHEMA.TABLES.TABLE_SCHEMA AND
    INFORMATION_SCHEMA.COLUMNS.TABLE_NAME = INFORMATION_SCHEMA.TABLES.TABLE_NAME
    WHERE (INFORMATION_SCHEMA.TABLES.TABLE_TYPE = 'BASE TABLE')
    ORDER BY INFORMATION_SCHEMA.COLUMNS.TABLE_CATALOG, INFORMATION_SCHEMA.COLUMNS.TABLE_SCHEMA,
    INFORMATION_SCHEMA.COLUMNS.TABLE_NAME, INFORMATION_SCHEMA.COLUMNS.ORDINAL_POSITION

    --PrimaryKeys
    SELECT Constraints.TABLE_NAME, Constraints.CONSTRAINT_NAME, Keys.COLUMN_NAME, Keys.ORDINAL_POSITION
    FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS AS Constraints INNER JOIN
    INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS Keys ON Constraints.CONSTRAINT_CATALOG = Keys.CONSTRAINT_CATALOG AND
    Constraints
    .CONSTRAINT_SCHEMA = Keys.CONSTRAINT_SCHEMA AND Constraints.CONSTRAINT_NAME = Keys.CONSTRAINT_NAME
    WHERE (Constraints.CONSTRAINT_TYPE = 'PRIMARY KEY')
    ORDER BY Constraints.TABLE_NAME, Constraints.CONSTRAINT_NAME, Keys.ORDINAL_POSITION

    --ForeignKeys
    SELECT Parent.TABLE_NAME AS ParentTableName, Parent.CONSTRAINT_NAME AS ParentConstrainName, ParentIndexes.COLUMN_NAME AS ParentColumnName,
    Child
    .TABLE_NAME AS ChildTableName, Child.CONSTRAINT_NAME AS ChildConstrainName, ChildIndexes.COLUMN_NAME AS ChildColumnName
    FROM INFORMATION_SCHEMA.CONSTRAINT_TABLE_USAGE AS Parent INNER JOIN
    INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS AS Constraints ON Constraints.UNIQUE_CONSTRAINT_CATALOG = Parent.CONSTRAINT_CATALOG AND
    Constraints
    .UNIQUE_CONSTRAINT_SCHEMA = Parent.CONSTRAINT_SCHEMA AND Constraints.UNIQUE_CONSTRAINT_NAME = Parent.CONSTRAINT_NAME INNER JOIN
    INFORMATION_SCHEMA.CONSTRAINT_TABLE_USAGE AS Child ON Constraints.CONSTRAINT_CATALOG = Child.CONSTRAINT_CATALOG AND
    Constraints
    .CONSTRAINT_SCHEMA = Child.CONSTRAINT_SCHEMA AND Constraints.CONSTRAINT_NAME = Child.CONSTRAINT_NAME INNER JOIN
    INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE AS ParentIndexes ON Parent.TABLE_CATALOG = ParentIndexes.TABLE_CATALOG AND
    Parent
    .TABLE_SCHEMA = ParentIndexes.TABLE_SCHEMA AND Parent.TABLE_NAME = ParentIndexes.TABLE_NAME AND
    Parent.CONSTRAINT_CATALOG = ParentIndexes.CONSTRAINT_CATALOG AND Parent.CONSTRAINT_SCHEMA = ParentIndexes.CONSTRAINT_SCHEMA AND
    Parent
    .CONSTRAINT_NAME = ParentIndexes.CONSTRAINT_NAME INNER JOIN
    INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE AS ChildIndexes ON Child.TABLE_CATALOG = ChildIndexes.TABLE_CATALOG AND
    Child
    .TABLE_SCHEMA = ChildIndexes.TABLE_SCHEMA AND Child.TABLE_NAME = ChildIndexes.TABLE_NAME AND
    Child
    .CONSTRAINT_CATALOG = ChildIndexes.CONSTRAINT_CATALOG AND Child.CONSTRAINT_SCHEMA = ChildIndexes.CONSTRAINT_SCHEMA AND
    Child
    .CONSTRAINT_NAME = ChildIndexes.CONSTRAINT_NAME
    ORDER BY ParentTableName, ParentColumnName, ChildTableName, ChildColumnName

    Υπενθύμιση για να βρούμε την έκδοση του SQL Server που έχουμε εγκατεστημένη τρέχουμε το SQL statement:

    SELECT SERVERPROPERTY('productversion'), SERVERPROPERTY ('productlevel'), SERVERPROPERTY ('edition')

     

    George J.


    George J. Capnias: Χειροπρακτικός Υπολογιστών, Ύψιστος Γκουράρχης της Κουμπουτερολογίας
    w: capnias.org, t: @gcapnias, l: gr.linkedin.com/in/gcapnias
    dotNETZone.gr News
  •  30-12-2008, 22:07 47317 σε απάντηση της 47316

    Απ: Εύρεση schema βάσης στον SQL Server

    Να κάνω μια ερώτηση. Γιατί όχι με SMO;
    Ακόμα κι ένας άνθρωπος μπορεί ν' αλλάξει τον κόσμο. Μη θέλεις να κυβερνήσεις. Απλά δείξε το μονοπάτι κι ο κόσμος θ' ακολουθήσει!!
  •  30-12-2008, 23:22 47319 σε απάντηση της 47317

    Απ: Εύρεση schema βάσης στον SQL Server

    Markos:
    Να κάνω μια ερώτηση. Γιατί όχι με SMO;

    Πρέπει να είναι εγκαταστημένα τα SQL Client Tools για να έχεις SMO στο μηχάνημά σου. Πόσες είναι οι πιθανότητες να τα έχεις εγκατεστημένα σε ένα μηχάνημα που δεν είναι εγκαταστημένος ο SQL Server, και τι πιθανότητες έχεις να τα βρεις στο μηχάνημα ενός end-user;

     

    George J.


    George J. Capnias: Χειροπρακτικός Υπολογιστών, Ύψιστος Γκουράρχης της Κουμπουτερολογίας
    w: capnias.org, t: @gcapnias, l: gr.linkedin.com/in/gcapnias
    dotNETZone.gr News
  •  30-12-2008, 23:28 47320 σε απάντηση της 47319

    Απ: Εύρεση schema βάσης στον SQL Server

    ΟΚ. Απλή απορία. Όσον αφορά τώρα στα scripts τα έτρεξα στην πιο σύνθετη βάση που έχω φτιάξει σε SQLServer 2005 Express και φαίνεται να δουλεύουν μια χαρά. Βέβαια, αυτό με την πρώτη ματιά, γιατί τα objects είναι πολλά. Αν διαπιστώσω κάτι θα κάνω post. Τι να πω... Ευχαριστώ για τα scipts!
    Ακόμα κι ένας άνθρωπος μπορεί ν' αλλάξει τον κόσμο. Μη θέλεις να κυβερνήσεις. Απλά δείξε το μονοπάτι κι ο κόσμος θ' ακολουθήσει!!
  •  30-12-2008, 23:34 47321 σε απάντηση της 47319

    Απ: Εύρεση schema βάσης στον SQL Server

    Η αλήθεια είναι ότι δεν θα με πείραζαν τα SMO Tools - ο αληθινός λόγος που θέλω να τα χρησιμοποιήσω, είναι ότι τα INFORMATION_SCHEMA views είναι μέρος του SQL-92 standard, αν καταλαβαίνεις προς τα που κατευθύνεται η προσπάθεια.

     

    George J.


    George J. Capnias: Χειροπρακτικός Υπολογιστών, Ύψιστος Γκουράρχης της Κουμπουτερολογίας
    w: capnias.org, t: @gcapnias, l: gr.linkedin.com/in/gcapnias
    dotNETZone.gr News
  •  31-12-2008, 13:50 47325 σε απάντηση της 47316

    Απ: Εύρεση schema βάσης στον SQL Server

    Χρόνια Πολλά.
    Δοκίμασα τα script σε Sql Server 2000 έκδοση 8.00.2039 SP4 Standard Edition και δουλεύει μια χαρά.



    Φιλάρετος Σεβαστιάδης.

    Albert Camus: Life is the sum of your choices.

  •  31-12-2008, 19:55 47338 σε απάντηση της 47325

    Απ: Εύρεση schema βάσης στον SQL Server

    Filaretos:
    Χρόνια Πολλά.

    Δοκίμασα τα script σε Sql Server 2000 έκδοση 8.00.2039 SP4 Standard Edition και δουλεύει μια χαρά.

    Ευχαριστώ πολύ για τη βοήθεια. Κάνοντας αναζήτηση στο Internet βρήκα μια δημοσίευση ότι ο SQL Server ξεκινώντας από την έκδοση 7 υποστηρίζει πλήρως το πρότυπο. Τώρα μένει να εξακριβώσω αν οι υπόλοιπες σχεσιακές βάσεις της Microsoft, τουλάχιστον, υποστηρίζουν το πρότυπο.

     

    George J.


    George J. Capnias: Χειροπρακτικός Υπολογιστών, Ύψιστος Γκουράρχης της Κουμπουτερολογίας
    w: capnias.org, t: @gcapnias, l: gr.linkedin.com/in/gcapnias
    dotNETZone.gr News
  •  20-03-2012, 10:54 69728 σε απάντηση της 47316

    Απ: Εύρεση schema βάσης στον SQL Server

    Γιώργο, δε μπορείς να φανταστείς πόσο χρήσιμο μου φάνηκε αυτό το script τη συγκεκριμένη στιγμή! Αν έχεις κι άλλες τέτοιες εμπνεύσεις... ελεύθερα!!Yes

    Ακόμα κι ένας άνθρωπος μπορεί ν' αλλάξει τον κόσμο. Μη θέλεις να κυβερνήσεις. Απλά δείξε το μονοπάτι κι ο κόσμος θ' ακολουθήσει!!
  •  25-03-2012, 01:39 69764 σε απάντηση της 47338

    Απ: Εύρεση schema βάσης στον SQL Server

    Εξαιρετικό script. Μέχρι τώρα χρησιιμοποιούσα procedures  sp_tables & sp_columns.  Αυτό είναι καλύτερο και πολύ χρήσιμο για την ανίχνευση αλλαγών στo schema.
    Stefan
  •  25-03-2012, 16:22 69767 σε απάντηση της 69764

    Απ: Εύρεση schema βάσης στον SQL Server

    Καλησπέρα,

    Η αλήθεια είναι ότι έχω εγκαταλήψει την ιδέα να τα κάνω αυτά με SQL κώδικα - ήταν σαν να προσπαθούσα να εφεύρω ξανά τον τροχό, όπως έχουν κάνει σχεδόν όλα τα ORM εκτός από το EF - μιας και οι περισσότεροι έχουμε μείνει με την εντύπωση ότι το παλιό ADOX έχει καταργηθεί. Η αλήθεια πως δεν έχει καταργηθεί, αλλά έχει ενσωματωθεί στο ADO.NET όπως και τα υπόλοιπα. Αν κάτσει και το ψάξει κάποιος λίγο παραπάνω, θα δει ότι όλη η τεχνολογία να δεις το schema μιας βάσης υπάρχει μέσα στο core του .NET και χρησιμοποιείται από την έκδοση 1.0 του κιόλας για να φτιάχνει τα typed datasets!

    Κάποια στιγμή είχα δημοσιεύσει μια βιβλιοθήκη με τα ευρήματά μου (Data.Common.DbSchema), και έχω τα εφαρμώσει να βρήσκω schema με κώδικα σχεδόν σε όλες τις βάσεις έχω χρησιμοποιήσει. Ο κώδικας που έχω επάνω στο Codeplex είναι 1.x, αλλά η βιβλιοθήκη έχει προχωρίσει αρκετά, και έχει και κάμποσα fixes που μου έχουν στήλει, παραμένει σε .NET v2.0, εκτός από κάποια Extensions που είχα φτιάξει για να παίξει και με LINQ.

    Σκεφτόμουν κάποια στιγμή να ξανακάνω ένα re-write σε .NET 4.x και να αφαιρέσω τα datasets από μέσα...

     

    George J.


    George J. Capnias: Χειροπρακτικός Υπολογιστών, Ύψιστος Γκουράρχης της Κουμπουτερολογίας
    w: capnias.org, t: @gcapnias, l: gr.linkedin.com/in/gcapnias
    dotNETZone.gr News
  •  25-03-2012, 22:50 69768 σε απάντηση της 69767

    Απ: Εύρεση schema βάσης στον SQL Server

    Τα ORMs και τα DALs είναι η μία όψη του νομίσματος η οποία, μάλιστα, δεν έχει εξαντληθεί όσο πιστεύουμε. Για τον χ, ψ, ζ, λόγο, κάποια στιγμή, είμαστε αναγκασμένοι για χρησιμοποιήσουμε ORMs για οποία δεν υπάρχουν code generators ούτε για τις κλάσεις ούτε για το DAL. Οι κλάσεις πρέπει να γραφτούν με το χέρι, καθώς και όλα τ' άλλα. Και καλά να γνωρίζεις το business model. Αν έχει πλήρη μεσάνυχτα περί του τίνος πρόκειται, τότε τι κάνεις; Η απάντηση είναι: reverse engineering στη βάση (η άλλη όψη του νομίσματος). Και καλά η βάση να έχει 10, 20, 30 πίνακες. Αν έχει 200, 300, 400 ή και περισσότερους, κλάφτα Χαράλαμπε! Προσοχή. Μιλάμε για άγνωστο business model. Αυτό σε δυσκολεύει και στη συγγραφή του presentation κώδικα. Το να προσπαθήσω να διαβάσω ένα διάγραμμα με 300+ πίνακες είναι αποθαρρυντικό. Πρέπει να φτιάξω μικρότερα, προσπαθώντας να μαντέψω ποιοι πίνακες πρέπει να μπουν μαζί και ποιοι όχι. Και μετά να καταλάβω πως λειτουργεί συνολικά το μοντέλο μου. Κατά τη γνώμη μου, το θέμα έχει ακόμα πολύ ψωμί. Μάλιστα, πείστηκα ακόμα περισσότερο γι' αυτό όταν διάβασα αυτή τη συζήτηση. Ο τύπος τα είχε παίξει. Εδώ που τα λέμε, ο καθένας θα τα έπαιζε με τέτοιο μέγεθος βάσης...

    Ακόμα κι ένας άνθρωπος μπορεί ν' αλλάξει τον κόσμο. Μη θέλεις να κυβερνήσεις. Απλά δείξε το μονοπάτι κι ο κόσμος θ' ακολουθήσει!!
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems