IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MS SQL Server Discussion :

Script permettant de créer l'ensemble des indexes d'une base


Sujet :

MS SQL Server

  1. #1
    Candidat au Club
    Inscrit en
    Juillet 2003
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 4
    Points : 2
    Points
    2
    Par défaut Script permettant de créer l'ensemble des indexes d'une base
    Bonjour à tous,

    Je souhaiterais obtenir un script permettant, lorsqu'on l'applique sur une base donnée, de générer un script créant l'ensemble des indes de cette base.

    L'idée est de pouvoir passer automatiquement l'ensemble des indexes d'une base sur une autre base identique mais dépourvue d'index.

    Via Enterprise Manager, cette option est proposée dans le générateur de script, mais en complément du script générant les tables.

    Merci à ceux qui pourront m'aider.

  2. #2
    Membre émérite
    Avatar de NoisetteProd
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    1 905
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 1 905
    Points : 2 614
    Points
    2 614
    Par défaut
    Salut !

    Il existe une manière au sein d'Entreprise Manager d'obtenir le code SQL qui a permis de créer un index.

    Pour ce faire, tu vas sur la table d'ou tu souhaites extraire le code d'un index, tu fais un clic droit "Toutes le tâches" puis "gérer les index".
    Ensuite, tu choisi l'un des index de ta table, tu clique sur "modifier", et pour finir , tu clic en bas à gauche sur "Edition SQL".

    Tu vois alors aparaitre le code qui a servi à créer l'index.

    Il ne te reste plus qu'a faire un script global, et c'est OK ! (Il est néanmoins peut etre bon, de vérifier avant de faire le créate si l'index n'existe pas avec une instruction du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    IF EXISTS (SELECT name FROM sysindexes WHERE name = 'nom de l index')
        DROP INDEX  Table.[Nom de l'index]
    Voila, j'espère que ca peut t'aider !
    A+
    Fais cogiter ta Noisette !!

    Participez à la page SOURCES Delphi !

    Découvrez le Défi Delphi

    Mon Mail

  3. #3
    Candidat au Club
    Inscrit en
    Juillet 2003
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Salut,

    Merci de m'avoir répondu.

    En fait, ce n'est pas exactement ce que je cherche : ta méthode permet de générer le code pour un seul index. Or, je souhaite le faire pour l'ensemble des indexes de la base.

    Je me vois difficilement générer mes 3500 indexes un par un ;-).

  4. #4
    Membre émérite
    Avatar de NoisetteProd
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    1 905
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 1 905
    Points : 2 614
    Points
    2 614
    Par défaut
    ca dépend, si tu as des index "type" , tu peux travailer avec des variables, tu as moins de code a effectuer.
    Fais cogiter ta Noisette !!

    Participez à la page SOURCES Delphi !

    Découvrez le Défi Delphi

    Mon Mail

  5. #5
    Candidat au Club
    Inscrit en
    Juillet 2003
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Non, chaque table a ses indexes bien à elle.

    En fait, je sais que la génération d'un script global est possible. Il suffit de travailler à partir des tables système.

    Je pense que je pourrais y arriver, mais c'est une question de temps(c'est une base de prod de 900 tables qui a perdu ses scripts). Il me faudrait un tel script assez rapidement.
    C'est pour ça que je demande si quelqu'un a un tel script à disposition.

    Mais sinon, ce n'est pas très grave. Je vais le créer moi même.

    Merci quand même ;-).

  6. #6
    Membre émérite
    Avatar de NoisetteProd
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    1 905
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 1 905
    Points : 2 614
    Points
    2 614
    Par défaut
    ce code permet de recuperer les trigger d'une base... Essaye de l'adapter pour les index... :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    SELECT 
        dbo.sysobjects.name, 
        dbo.sysobjects.xtype, 
        dbo.syscomments.text, 
        dbo.sysusers.name, 
        dbo.sysobjects.crdate 
     
    FROM 
        dbo.sysobjects 
    INNER JOIN dbo.syscomments 
        ON dbo.syscomments.id = dbo.sysobjects.id 
    INNER JOIN dbo.sysusers 
        ON dbo.sysobjects.uid = dbo.sysusers.uid 
    WHERE 
        xtype = 'TR'
    Fais cogiter ta Noisette !!

    Participez à la page SOURCES Delphi !

    Découvrez le Défi Delphi

    Mon Mail

  7. #7
    Membre habitué

    Inscrit en
    Octobre 2002
    Messages
    139
    Détails du profil
    Informations forums :
    Inscription : Octobre 2002
    Messages : 139
    Points : 177
    Points
    177
    Par défaut
    salut,

    j'ai essayé par script et j'ys suis pas arrivé.
    mais en faisant dans EM sur la base de données :
    click droit->toutes les taches -> générer un script sql. Ensuite
    Appyuer sur afficher tous-> cocher les tables (et les vues si besoins)->aller sur l'onglet 'Mise en forme'->décocher générer la commande drop et create pour chaque objet-> aller sur onglets options->cocher générer un script pour les index et plus si affinité.

    J'ai testé avec cette méthode j'ai les script des indexs mais aussi ceux des clés primaires donc à voir si ça te convient.

    krest

    ps c'est un peu long

  8. #8
    Candidat au Club
    Inscrit en
    Juillet 2003
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Pour info, voici le script :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    set transaction isolation level read uncommitted
     
    set nocount on
     
    select
    	'IF EXISTS(SELECT 1 FROM SYSINDEXES WHERE ID = OBJECT_ID('''+tab.name+''') AND NAME = '''+ind.name+''')
    	DROP INDEX ['+tab.name+'].['+ind.name+']
    '
    	+ 'GO' + '
    '
    	+ 'CREATE'
    	+ case when INDEXPROPERTY(ind.id, ind.name, 'IsUnique') = 1 then ' UNIQUE' else '' end
    	+ case when INDEXPROPERTY(ind.id, ind.name, 'IsClustered') = 1 then ' CLUSTERED' else ' NONCLUSTERED' end
    	+ ' INDEX ['+ind.name+']'
    	+ ' ON ['+user_name(tab.uid)+'].['+tab.name+']'
    	+ ' ('+
    	+ '['+index_col(tab.name, ind.indid, 1)+']'
    	+ isnull(', ['+index_col(tab.name, ind.indid, 2)+']', '')
    	+ isnull(', ['+index_col(tab.name, ind.indid, 3)+']', '')
    	+ isnull(', ['+index_col(tab.name, ind.indid, 4)+']', '')
    	+ isnull(', ['+index_col(tab.name, ind.indid, 5)+']', '')
    	+ isnull(', ['+index_col(tab.name, ind.indid, 6)+']', '')
    	+ isnull(', ['+index_col(tab.name, ind.indid, 7)+']', '')
    	+ isnull(', ['+index_col(tab.name, ind.indid, 8)+']', '')
    	+ isnull(', ['+index_col(tab.name, ind.indid, 9)+']', '')
    	+ isnull(', ['+index_col(tab.name, ind.indid, 10)+']', '')
    	+ isnull(', ['+index_col(tab.name, ind.indid, 11)+']', '')
    	+ isnull(', ['+index_col(tab.name, ind.indid, 12)+']', '')
    	+ isnull(', ['+index_col(tab.name, ind.indid, 13)+']', '')
    	+ isnull(', ['+index_col(tab.name, ind.indid, 14)+']', '')
    	+ isnull(', ['+index_col(tab.name, ind.indid, 15)+']', '')
    	+ isnull(', ['+index_col(tab.name, ind.indid, 16)+']', '')
    	+ ') WITH FILLFACTOR = ' + convert(varchar, case when ind.OrigFillFactor = 0 then 100 else ind.OrigFillFactor end)
    	+ case when INDEXPROPERTY(ind.id, ind.name, 'IsPadIndex') = 1 then ', PAD_INDEX' else '' end
    	+ case when ind.status & 1 = 1 then ', IGNORE_DUP_KEY' else '' end
    	+ ' ON ['+fg.groupname+']'+'
    GO'+'
    '
    from sysindexes ind
    join sysobjects tab on tab.id = ind.id
    join sysfilegroups fg on fg.groupid = ind.groupid
    where INDEXPROPERTY(tab.id, ind.name, 'IsStatistics') = 0
    and tab.type = 'U'
    and not exists(
    	select 1
    	from sysobjects pk
    	where pk.type = 'K'
    	and pk.parent_obj = tab.id
    	and pk.name = ind.name
    )
    order by tab.name, ind.indid

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 30/06/2011, 15h56
  2. Récupérer la liste des indexes d'une base
    Par Najdar dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 03/07/2008, 12h15
  3. Réponses: 4
    Dernier message: 27/03/2008, 09h39
  4. Listes des indexes d'une base de de données
    Par The eye dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 11/01/2008, 11h55
  5. Recalcul des index d'une base de données
    Par lio33 dans le forum SQL
    Réponses: 4
    Dernier message: 18/08/2006, 15h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo