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

 

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

Διαγραφή μερικών πινάκων

Îåêßíçóå áðü ôï ìÝëïò gspiros. Τελευταία δημοσίευση από το μέλος cap στις 12-09-2007, 17:50. Υπάρχουν 8 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  11-09-2007, 17:50 34928

    Διαγραφή μερικών πινάκων

    Έχω μια βάση που περιέχει πάρα πολλούς πίνακες και θέλω τώρα να γράψω ένα query, που θα διαγράφει όλους τους πίνακες εκτός από κάποιους που θα τους καθορίζω εγώ.
    Πιθανόν ο καθορισμός να γίνεται μέσω κάποιου IF, μέσα σε ένα loop.
    Υπάρχει αυτή η δυνατότητα και αν ναι, που να ψάξω?
  •  11-09-2007, 18:15 34932 σε απάντηση της 34928

    Απ: Διαγραφή μερικών πινάκων

    Αν καταλαβαίνω καλά θέλεις κάποιο SQL Script που να διαγράφει πίνακες επιλεκτικά (χρησιμοποιώντας π.χ. κάποιο άλλο table που θα περιέχει τα ονόματα των πινάκων προς διαγραφή);

    Θα πρέπει να μας ξεκαθαρίσεις σε τι θα ήθελες να γίνει η υλοποίηση (γλώσσα προγραμματισμού όπως VB.NET, DTS package, SQL, άλλο; ) καθώς και για τι βάση μιλάς (Access, SQL Server, Oracle, MySQL, κλπ).

     


    Σωτήρης Φιλιππίδης

    DotSee Web Services

    View Sotiris Filippidis's profile on LinkedIn

    DotNetNuke them!
  •  11-09-2007, 19:01 34934 σε απάντηση της 34932

    Απ: Διαγραφή μερικών πινάκων

    Λοιπόν, η βάση είναι MSSQL (έχει σημασία αν είναι mysql με τον τρόπο που περιγράφω παρακάτω???).
    Αυτό που είχα σκεφτεί εγώ ήταν ένα sql query, το οποίο όταν γίνεται execute, θα περνά από όλους τους πίνακες. Με κάποια IF / ELSE IS (ο αριθμός των IF θα εξαρτάται από τον αριθμό των πινάκων που ΔΕΝ θέλουμε να διαγράψουμε) θα ελέγχει αν το όνομα του πίνακα που δείχνει εκείνη την στιγμή είναι από αυτούς που θέλουμε να διαγράψουμε, οπότε θα τον διαγράφει ή θα πηγαίνει στον επόμενο.
    Είναι εφικτό αυτό με sql query ή ζητάω πολλά?
    Αυτή ήταν απλά μια σκέψη. Καμία άλλη πρόταση?
  •  11-09-2007, 19:36 34936 σε απάντηση της 34934

    Απ: Διαγραφή μερικών πινάκων

    Φυσικά και έχει σημασία όταν μιλάμε για SQL Scripts, μια και η SQL Dialect, ειδικά στο DDL (Data Definition Language) αλλά ακόμα κσι σε άλλες λεπτομέρειες, διαφέρει κατά πολύ από το ένα RDBMS στο άλλο. Σημασία δεν θα είχε μονο αν επιχειρούσες να επιτύχεις αυτή την ενέργεια σε πιό high-level υλοποίηση, μέσω κάποιου driver και υλοποιώντας κάτι σε .NET Framework και ADO.NET, για παράδειγμα.

    Στο δια ταύτα:

    Οταν π.χ. μέσα από τον Enterprise Manager (SQL 2000) επιχειρούμε να κάνουμε Generate SQL Script για ένα πίνακα, τότε παράγεται και το DROP statement όπως εδώ:

    if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Activities]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
    drop table [dbo].[Activities]

    Στο παράδειγμά μας ο πίνακας είναι ο "Activities". Εδώ λοιπόν έχουμε ένα IF που κάνει τη δουλειά που θέλεις.

    Αν όμως θέλεις να είσαι πιό παραμετρικός θα πρέπει να "παίξεις" με ένα πινακάκι που θα περιέχει τα ΟΝΟΜΑΤΑ των πινάκων που θέλεις να διαγράψεις και μετά να "κατασκευάσεις" τα SQL Statements που θέλεις χρησιμοποιώντας την εντολή EXEC και dynamic SQL, σε συνδυασμό ίσως με ένα cursor. Περισσότερα όμως γι'αυτό μόνο αν τα χρειαστείς, για να μην σε μπερδέψω.

     

     

     

     


    Σωτήρης Φιλιππίδης

    DotSee Web Services

    View Sotiris Filippidis's profile on LinkedIn

    DotNetNuke them!
  •  12-09-2007, 09:13 34944 σε απάντηση της 34934

    Απ: Διαγραφή μερικών πινάκων

    Κατ' αρχάς όταν λές διαγραφή πινάκων τί εννοείς .Διαγραφή τών δεδομένων ή διαγραφή του ίδιου του πίνακα.

    Όπως και να έχει το πράγμα πάντως πιστεύω ότι πρέπει να δημιουργήσεις ένα πίνακα (myDeleteTable) που θα έχει μία στήλη (tblName varchar(255)) και θά έχει ώς δεδομένα τά ονόματα τών πινάκων που δέν θέλεις να διαγραφούν σ' αυτά θα περιέχεται και το όνομα του ίδιου του πίνακα.

    Το sql query που θα σου επιστρέφει τά ονόματα τών πινάκων που θέλεις να διαγράψεις είναι για τον MSSQL   Select name from sysobjects where UPPER(type)='U' and not exists (select * from myDeleteTable where myDeleteTable.tblName=sysobjects.name). Κατόπιν μέ ένα loop μέσα από client μπορείς να εκτελέσεις SQL Script το οποίο θα κάνει delete τα rows του πίνακα ή θα κάνει drop τον ίδιο τον πίνακα  άν όμως θέλεις αυτό να γίνει μέσω MSSQL τότε πρέπει να θλοποιήσεις ένα cursor όπως σου περιέγραψε ο cap.

    ΥΛΟΠΟΙΗΣΗ CURSOR ΣΤΟΝ MSSQL

    declare @tableName varchar(255),@execStr varchar(4000)

    declare myFirstCursor  cursor for

     Select name from sysobjects where UPPER(type)='U' and not exists (select * from myDeleteTable where myDeleteTable.tblName=sysobjects.name)

    open myFirstCursor

    fetch next from myFirstCursor into @tableName

      while @@fetch_status<>-1

         begin

         ---Άν θέλουμε να διαγράψουμε τις γραμμές του πίνακα 

          select @execStr='delete  ' + @tableName

        ---Άν θέλουμε να κάνουμε drop τον ίδιο τόν πίνακα

          select @execStr='if exists (select * from dbo.sysobjects where id = object_id(N''' + @tableName +''') and OBJECTPROPERTY(id, N''IsUserTable'') = 1)' +
                           ' drop table ' + @tableName

    ---Εκτέλεσ Script
    exec (@execStr)

    fetch next from myFirstCursor into @tableName

    end

    close myFirstCursor

    deallocate myFirstCursor


    Ιωάννης Μανουσάκης
  •  12-09-2007, 10:00 34946 σε απάντηση της 34944

    Απ: Διαγραφή μερικών πινάκων

    Αχ! Και είπα να μην του τα γράψω του ανθρώπου αυτά για να μην τον μπερδέψω περισσότερο :) Ηρθες κι εσύ και τον έριξες στα "βαθιά" κατευθείαν :) Δεν πειράζει όμως, για το καλύτερο είναι.


    Σωτήρης Φιλιππίδης

    DotSee Web Services

    View Sotiris Filippidis's profile on LinkedIn

    DotNetNuke them!
  •  12-09-2007, 17:12 34960 σε απάντηση της 34946

    Απ: Διαγραφή μερικών πινάκων

    Όταν λέω διαγραφή πίνακα, εννοώ drop table.
    Δεν με απασχολούσε να φτιάξω καινούγιο πίνακα που να περιέχει τους πίνακες που θέλω να διαγράψω. Είναι 2-3 οι πίνακες που θέλω να κρατήσω, οπότε με 2-3 IF, θα είχα καθαρίσει!
    Θα το ψάξω όμως, ώστε να το φτιάξω για την γενικότερη περίπτωση που θέλω να διαγράψω περισσότερους.
    Σας ευχαριστώ.
  •  12-09-2007, 17:46 34961 σε απάντηση της 34960

    Απ: Διαγραφή μερικών πινάκων

    Τότε μπορείς να κάνεις την αντίστροφη διαδικασία: Να "κερσοράρεις" μεταξύ όλων των πινάκων της βάσης διαγράφοντας κρατώντας ΜΟΝΟ εκείνους που θέλεις.

    Αυτό μπορείς να το επιτύχεις φτιάχνοντας ένα cursor που δεν θα κάνει select από κάποιον δικό σου custom πίνακα (οπου θα βρίσκονται τα ονόματα αυτών που θέλεις να διαγράψεις) αλλά ένα cursor που θα κάνει select από μια system view (information_schema.tables) και θα διαγράφει μόνο εκείνα τα ονόματα που θα έχεις στο IF:

    select
      table_name
    from
      information_schema.tables
    where
      table_type='BASE TABLE'
      and table_name not like 'dtproperties'

    (Το τελευταίο γράφτηκε γιατί αυτό το query σου επιστρέψει και το dtproperties που ΔΕΝ το χρειάζεσαι). Προσοχή: Αν έχεις table από πολλαπλούς χρήστες θα πρέπει να συμπεριλάβεις και ένα "and table_schema='dbo' " στο where clause σου, οπου dbo μπορεί να είναι οποιοσδήποτε χρήστης.

    Δεν κατανοώ όμως κάτι: Αφού δεν θέλεις να το κάνεις παραμετρικο και λες οτι με 2-3 IF θα είχες καθαρίσει, άρα λοιπόν θέλεις να "καρφώσεις" τα ονόματα των πινάκων, γιατί δεν φτιάχνεις ένα απλό script (όπως το πρώτο που σου έδωσα) που να κάνει drop τους ΣΥΓΚΕΚΡΙΜΕΝΟΥΣ πίνακες αντί να μπλέκεσαι με cursors, information_schema views κλπ;

    Χμ, edit από εμένα, δεν είχα κατανοήσει καλά το τελευταίο σου post. Ισχύουν τα παραπάνω όμως που έγραψα για το information_schema.

     


    Σωτήρης Φιλιππίδης

    DotSee Web Services

    View Sotiris Filippidis's profile on LinkedIn

    DotNetNuke them!
  •  12-09-2007, 17:50 34962 σε απάντηση της 34961

    Απ: Διαγραφή μερικών πινάκων

    Προς όσους φίλους πήραν το προηγούμενο post με email: Επειδή είχα κάνει λάθος διατύπωση, έκανα edit στο αρχικό post. Παρακαλώ αγνοήστε τη διατύπωση που πήρατε με mail και διαβάστε το πρωτότυπο.


    Σωτήρης Φιλιππίδης

    DotSee Web Services

    View Sotiris Filippidis's profile on LinkedIn

    DotNetNuke them!
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems