Modifier le classement de la base de données SQL Server

Un moment peut arriver où vous devrez modifier votre base de données pour utiliser un classement différent.

Vous pouvez le faire en utilisant l’extrait de code suivant:

USE master;GOALTER DATABASE COLLATE SQL_Latin1_General_CP1_CI_AS ;GO--Verify the collation setting.SELECT name, collation_nameFROM sys.databasesWHERE name = N'';GO

Lorsque vous exécutez l’extrait de code ci-dessus, vous pouvez rencontrer l’erreur suivante :

La base de données n’a pas pu être verrouillée exclusivement pour effectuer l’opération

Cette erreur se produit lorsque votre base de données est en mode multi-utilisateurs ou lorsqu’il y a des objets faisant référence à votre base de données.

Pour surmonter cette erreur, vous devez effectuer les étapes suivantes:

  1. Définissez la base de données en mode mono-utilisateur;
  2. Effectuez les modifications nécessaires à votre base de données, dans ce cas modifiez le classement;
  3. Rétablissez la base de données en mode multi-utilisateurs.

Ainsi, l’extrait ci-dessus peut être mis à jour vers le suivant:

USE master;GO-- Set to single-user modeALTER DATABASE SET SINGLE_USER WITH ROLLBACK IMMEDIATEGO -- change collationALTER DATABASE COLLATE SQL_Latin1_General_CP1_CI_AS; GO -- Set to multi-user modeALTER DATABASE SET MULTI_USER WITH ROLLBACK IMMEDIATE;GO --Verify the collation setting. SELECT name, collation_name FROM sys.databases WHERE name = N'MyOptionsTest'; GO

Le processus ci-dessus peut être utilisé si vous venez de créer une nouvelle base de données, sans données à l’intérieur, sans définir le classement de base de données souhaité.

Remplacez le classement par des colonnes de table

Dans votre base de données, il peut y avoir des colonnes de table avec un classement différent, à savoir des colonnes de table de types char, varchar, text, nchar, nvarchar et ntext. Pour lister toutes les colonnes de table avec leurs classements actuels, vous pouvez exécuter la requête suivante:

SELECT t.name, c.name, c.collation_nameFROM sys.columns c INNER JOIN sys.tables t ON t.object_id = c.object_idWHERE c.object_id IN (SELECT object_id FROM sys.objects WHERE type = 'U') AND c.collation_name != 'NULL'ORDER BY t.name, c.name

Avant d’apporter des modifications aux classements de ces colonnes, vous devez vérifier si les modifications vont générer des problèmes pour les applications.

Pour modifier le classement d’une colonne en un nouveau, vous pouvez exécuter la requête suivante:

ALTER TABLE ALTER COLUMN <ColumnType> COLLATE <NewCollation>

En cas d’erreur, assurez-vous que les contraintes de référencement et les index sont supprimés ; vous pouvez les recréer après la modification du classement.

Modifier le classement et les données existantes

Qu’en est-il de vos données existantes? Pour être sûr que les données existantes peuvent être récupérées après la modification du classement, vous devez suivre les étapes ci-dessous:

  1. exportez les anciennes données de chaque table, à l’aide de l’assistant d’importation et d’exportation de données SQL Server ou de bcp ;
  2. supprimez et recréez les tables ; et
  3. importez des données précédemment exportées.

Dans l’exemple suivant, nous allons créer une base de données avec le classement LATIN1_GENERAL_CI_AI, ajouter une table de produits avec un nom de colonne (nvarchar(50)) et insérer des données en grec.

CREATE DATABASE COLLATE LATIN1_GENERAL_CI_AI;-- -- Create Products table and add some dataUSE GOCREATE TABLE .( (50) NULL) ON GOinsert into dbo.Products (name) values (N'Προϊόν 1');insert into dbo.Products (name) values (N'Προϊόν 2');insert into dbo.Products (name) values (N'Προϊόν 3');insert into dbo.Products (name) values (N'Προϊόν 4');insert into dbo.Products (name) values (N'Προϊόν 5');

En recherchant tous les produits commençant par « ΠροϊΌν » (mot grec pour Produit), nous obtenons 5 résultats:

SELECT *FROM dbo.ProductsWHERE Name LIKE N'Προϊόν%';-- Results:Name--------------------------------------------------Προϊόν 1Προϊόν 2Προϊόν 3Προϊόν 4Προϊόν 5

Étape 1. Export Data

Exportons les données dans la table des produits à l’aide de bcp, qui signifie bulk copy program utility (bcp) et copie en bloc les données entre une instance de Microsoft SQL Server et un fichier de données dans un format spécifié par l’utilisateur. Cet utilitaire peut être utilisé pour importer un grand nombre de nouvelles lignes dans des tables SQL Server ou pour exporter des données hors des tables dans un fichier adata. Pour ce faire, nous avons besoin de la commande suivante:

bcp CollationTest.dbo.Products out Products.txt -c -T

-ceffectue l’opération à l’aide d’un type de données de caractères et-Tspécifie que l’utilitaire bcp se connecte à SQL Server avec une connexion de confiance à l’aide de la sécurité intégrée.

Étape 2. Changer le classement de base de données

À l’étape suivante, nous changerons le classement de base de données en GREEK_CI_AI, avec l’instruction suivante:

-- Alter database collationALTER DATABASE COLLATE GREEK_CI_AI;

Étape 3. Déposez et recréez la table des produits

USE GODROP TABLE .;GOCREATE TABLE .( (50) NULL) ON GO

Étape 4. Importer des données précédemment exportées

Pour ce faire, nous utiliserons à nouveau l’utilitaire bcp mais au lieu du paramètre out, nous utiliserons le paramètre in:

bcp CollationTest.dbo.Products in Products.txt -c -T

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.