N'utilisez jamais l'interface graphique pour ce genre d'opérations.
Il est mieux d'utiliser un script, car vous pouvez le sauvegarder et le conserver pour voir ce que vous avez fait, et éventuellement le réutiliser plus tard.
Malheureusement la seule solution est du supprimer la clé primaire (qui va supprimer l'index sous-jacent), changer la collation, puis recréer la clé primaire.
Le problème c'est que si cette clé primaire est référencée par d'autres tables comme clé étrangère, il faudra désactiver les clés étrangères.
Il vous faut donc script la création de la clé primaire, ce qui est faisable depuis l'explorateur d'objets de SSMS (F8) : clic-droit sur la clé primaire > Générer un script de la clé primaire en tant que > CREATE TO > Nouvelle fenêtre de l'éditeur de requête.
Ensuite précéder le script généré par :
Pour trouver les contraintes de clé étrangère qui référencent votre table :Code:
1
2
3
4
5
6
7
8
9 ALTER TABLE maTable DROP CONSTRAINT maClePrimaire GO ALTER TABLE maTable ALTER COLUMN maColonneClePrimaireChaineDeCaractères COLLATE maCollation NOT NULL GO <le script généré>
C'est une petite modification de la requête que j'ai publié iciCode:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 SELECT PS.name + '.' + PT.name AS parent_table_name , PC.name AS parent_column_name , RS.name + '.' + RT.name AS referenced_table_name , RC.name AS referenced_column_name , FK.name AS foreign_key_name FROM sys.schemas AS PS INNER JOIN sys.foreign_keys AS FK ON PS.schema_id = FK.schema_id INNER JOIN sys.foreign_key_columns AS FKC ON FK.object_id = FKC.constraint_object_id INNER JOIN sys.tables AS PT ON FK.parent_object_id = PT.object_id INNER JOIN sys.columns AS PC ON FKC.parent_object_id = PC.object_id AND FKC.parent_column_id = PC.column_id INNER JOIN sys.tables AS RT ON FK.referenced_object_id = RT.object_id INNER JOIN sys.columns AS RC ON FKC.referenced_object_id = RC.object_id AND FKC.referenced_column_id = RC.column_id INNER JOIN sys.schemas AS RS ON RT.schema_id = RS.schema_id WHERE RT.name = 'maTable' ORDER BY foreign_key_name
Remplacer maTable par le nom de votre table.
Avant de supprimer la clé primaire, il vous faudra écrire le script suivant pour toutes les clés étrangères trouvées par le script ci-dessus :
Et une fois que vous aurez re-créé la clé primaire :Code:
1
2 ALTER TABLE uneTable NOCHECK CONSTRAINT uneContrainteDeCleEtrangere
@++ ;)Code:
1
2 ALTER TABLE uneTable WITH CHECK CHECK CONSTRAINT uneContrainteDeCleEtrangere