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 :

COLLATION et index de base


Sujet :

MS SQL Server

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 73
    Points : 52
    Points
    52
    Par défaut COLLATION et index de base
    Bonjour a tous

    Je m'occupe de reprise de donnee . De ce faite j'ai des base en collation differente. Certaine sont en FRENCH d'autre en Latins ect....
    Mon probleme est que je suis obliger de casser tous les indexs afin de changer les collations des tables des bases sources pour les mettre tous en FRENCH.

    Y a til un moyen de les changer lors de la restauration de la base???

    Je n'ai pas trouvé, donc dans un premier temps je me suis amusé à casser les index et contrainte des tables pour changer les collation.
    Du coup je me suis dis qu'avec les table master y a un moyen de casser tous ca. Mais ca marche un fois sur deux. Car je pense qu'il doit avoir un ordre pour les cassées ses index.
    Voici mon code :
    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
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    DECLARE @ncvRequete AS NVARCHAR(4000);
    DECLARE @contraintName as VARCHAR(4000)
    DECLARE @nameTable as VARCHAR(4000)
    DECLARE @nameTable2 as VARCHAR(4000)
    DECLARE @schemaTable as VARCHAR(4000)
     
    DECLARE cur CURSOR FOR
    SELECT
        pk.TABLE_SCHEMA AS PK_TableSchema,
        pk.TABLE_NAME AS PK_TableName,
        fk.CONSTRAINT_NAME AS FK_ConstraintName
        --fk.TABLE_SCHEMA AS FK_TableSchema,
        ,fk.TABLE_NAME AS FK_TableName
        --fk_col.COLUMN_NAME AS FK_ColumnName,
        --,pk_col.ORDINAL_POSITION AS OrdinalPosition
    FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS pk
    JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE pk_col ON
        pk_col.CONSTRAINT_SCHEMA = pk.CONSTRAINT_SCHEMA AND
        pk_col.CONSTRAINT_NAME = pk.CONSTRAINT_NAME
    JOIN INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS rc ON
        rc.UNIQUE_CONSTRAINT_SCHEMA = pk.CONSTRAINT_SCHEMA AND
        rc.UNIQUE_CONSTRAINT_NAME = pk.CONSTRAINT_NAME
    JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS fk ON
        fk.CONSTRAINT_SCHEMA = rc.CONSTRAINT_SCHEMA AND
        fk.CONSTRAINT_NAME = rc.CONSTRAINT_NAME
    JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE fk_col ON
        fk_col.CONSTRAINT_SCHEMA = rc.CONSTRAINT_SCHEMA AND
        fk_col.CONSTRAINT_NAME = rc.CONSTRAINT_NAME AND
        fk_col.ORDINAL_POSITION = pk_col.ORDINAL_POSITION
    WHERE
        pk.CONSTRAINT_TYPE = 'PRIMARY KEY' AND
        fk.CONSTRAINT_TYPE = 'FOREIGN KEY'
    	--AND PK_TableSchema = 'dbo'
    ORDER BY
        pk.TABLE_SCHEMA,
        pk.TABLE_NAME,
        fk.CONSTRAINT_NAME,
        fk.TABLE_SCHEMA,
        fk.TABLE_NAME,
        pk_col.ORDINAL_POSITION 
    OPEN cur;
    FETCH NEXT FROM cur INTO @schemaTable, @nameTable, @contraintName, @nameTable2
    WHILE @@FETCH_STATUS = 0
    BEGIN		
    	IF  EXISTS (SELECT * FROM sys.indexes WHERE object_id = OBJECT_ID(N'['+@schemaTable+'].['+@nameTable+']') AND name = N''+@contraintName+'')
    	--IF EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'['+@schemaTable+'].[' + @contraintName +']') AND parent_object_id = OBJECT_ID(N'['+@schemaTable+'].['+@nameTable+']'))
    		BEGIN
    			SET @ncvRequete = 'ALTER TABLE ['+ @schemaTable+'].['+@nameTable+'] DROP CONSTRAINT [' + @contraintName +']'
    			PRINT @ncvRequete + ' ... T1' +@nameTable;
    		END
    		ELSE
    		BEGIN
    			IF  EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'['+@schemaTable+'].[' + @contraintName +']') AND parent_object_id = OBJECT_ID(N'['+@schemaTable+'].['+@nameTable2+']'))
    			BEGIN
    				SET @ncvRequete = 'ALTER TABLE ['+ @schemaTable+'].['+@nameTable2+'] DROP CONSTRAINT [' + @contraintName +']'
    				PRINT @ncvRequete + ' ... T2' +@nameTable;
    			END
    		END	
     
    		EXECUTE sp_executeSql  @ncvRequete;
     
        FETCH NEXT FROM cur INTO @schemaTable, @nameTable, @contraintName, @nameTable2
    END;
    CLOSE cur;
    DEALLOCATE cur;
    Voyerz vous le probleme pour lequel ca ne marche pas toujours???
    Comment savoir l'ordre dans lequel on peut supprimer les index?
    Connaitriez vous un moyen de supprimer tous les index et contrainte de tous les tables d'une base?

    Merci d'avance de vos reponse.

    Shakta

  2. #2
    Expert confirmé
    Avatar de rudib
    Homme Profil pro
    Fakir SQL Server & NoSQL
    Inscrit en
    Mai 2006
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Fakir SQL Server & NoSQL

    Informations forums :
    Inscription : Mai 2006
    Messages : 2 573
    Points : 4 043
    Points
    4 043
    Par défaut
    Bonjour,

    Tu ne peux pas changer la collation au restore. Pour changer ta collation d'index, tu dois changer la collation des colonnes sur lesquelles ils sont basés, avec le même genre de code : ALTER TABLE ALTER COLUMN ... COLLATE ...

    Tu dois le faire pour chaque colonne ...
    Change la collation de la base change seulement la collation par défaut, pas celle des colonnes déjà existantes.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 73
    Points : 52
    Points
    52
    Par défaut
    Ca je sais .
    Mais pour changer les collation d'une colonne je dois prealablemet supprimer les index et contraintes de ces colonnes.
    En faite ce qui m'interesse est de savoir comment supprimer tous les index de tous les tables d'une base sans les faier a la main.

    Shakta

  4. #4
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2007
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 44
    Points : 55
    Points
    55
    Par défaut Solution magique
    Bonsoir,
    Contrairement à ce qu'on peut te dire, tu peux changer la collation de toute ta base de données en moins de 15 secondes. Bonne nouvelle je suppose
    Le principe est simple : sur la table syscolumns, il y a un champ contenant un numero qui identifie la collation et tout le reste est déduit à partir de ce champ. J'ai trouvé l'astuce en cherchant sur les tables système car j'ai eu le même problème et j'avais un centaine de table ayant chacune une trentaine de champs varchar. Tu imagine la punition ?

    Sans trop t'ennuyer, je veux juste dire que j'ai la solution qu'il te faut. Je n'arrive pas à la reconstruire et je ne suis pas devant mon PC. Je t'envoie le script qu'il te faut dans les 48 heures.

  5. #5
    Expert confirmé
    Avatar de rudib
    Homme Profil pro
    Fakir SQL Server & NoSQL
    Inscrit en
    Mai 2006
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Fakir SQL Server & NoSQL

    Informations forums :
    Inscription : Mai 2006
    Messages : 2 573
    Points : 4 043
    Points
    4 043
    Par défaut
    Bonjour,

    Si tu es sous SQL Server 2005 : la mise à jour dans les tables système n'est plus autorisée.

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 73
    Points : 52
    Points
    52
    Par défaut
    aie Rudib ton poste m'ennuie vu que je suis sous sql server 2005.

    Merci YoussefTS de me faire suivre ton script. Je quand meme l'essayer au cas ou ca marche.
    Car j'ai deja essayer mais je n'ai pas trouver le numero d'ordre des collation.

    Cordialement
    Shakta

  7. #7
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2007
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 44
    Points : 55
    Points
    55
    Par défaut Le script promis
    Bonjour,

    Je suis désolé pour ce retard dans ma réponse.
    Rudib a raison, sur 2005, les tables sont bien verouillées. Néanmoins, voici mon code ( La balise code ne fonctionne pas chez moi ) :

    /**** Début Code Pour Latin****/
    EXEC sp_configure 'allow updates', '1'
    GO

    -------- Exécuter une à une ----------
    RECONFIGURE WITH OVERRIDE
    GO

    --------------------------------------
    UPDATE SysColumns
    SET CollationId = 872468488
    FROM SysColumns INNER JOIN SysObjects O ON SysColumns.id = O.id
    WHERE SysColumns.Collation IS NOT NULL AND
    O.Name NOT LIKE 'sys%'

    --------------------------------------
    EXEC sp_configure 'allow updates', '0'
    GO

    --------------------------------------
    RECONFIGURE WITH OVERRIDE
    GO
    /**** Fin Code Pour Latin****/

    J'ai une proposition, essaye de générer le script de ta base de données sur 2005. Crée ta base via ce script sur 2000, applique ce script, sauvegarde ta base sur 2000 et restaure la sur 2005. Je crois que c'est plus rapide que de changer la collation par colone.

    Une autre manière cette fois sur 2005 :
    Si tu as la même collation qui se répète, génère le script de création de la base de données sous 2005. Sur le script généré, détécte la collation utilisée, utilise un Ctrl+H pour la remplacer avec la collation de ton choix. Réexécute ton script ce création de base ainsi modifié.

    J'espère qu'une de ces méthodes t'aidera. Si tu as besoin de plus d'aides n'hésite pas.

Discussions similaires

  1. TOS_DQ_5.0 index colonnes base oracle à 0
    Par joelle_mut dans le forum Développement de jobs
    Réponses: 1
    Dernier message: 13/01/2012, 11h00
  2. Création d'index sur base de prod
    Par korian dans le forum Administration
    Réponses: 2
    Dernier message: 21/10/2011, 16h53
  3. Réponses: 1
    Dernier message: 10/02/2007, 01h09
  4. Réorganisation indexs de bases répliquées
    Par usf70 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 03/07/2006, 14h29
  5. fichiers séquentiels indexés VS base de données relationnell
    Par Clotilde dans le forum Décisions SGBD
    Réponses: 3
    Dernier message: 22/08/2005, 06h31

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