Suppression d'une contrainte (index) sur une colonne


12

Comment puis-je modifier le type sur une table qui a un index dessus? J'ai essayé de faire une alter colonne sur une table vide pour modifier le type de date heure à varchar (15) et j'ai eu des erreurs disant qu'il y avait des dépendances sur la colonne (qui s'est avérée être des index).

J'ai pu facilement contourner cela localement en cliquant avec le bouton droit sur l'index et en créant un script, mais je dois le déployer sur d'autres serveurs où je n'aurai pas accès au nom de l'index.

Existe-t-il un moyen de créer un script qui supprimera n'importe quel index, permettez-moi de modifier ce type de données dans la colonne, puis de lire l'index? Merci!

Réponses:


7

Vous pouvez utiliser la vue sys.indexes pour obtenir des index. Vous pouvez joindre ce tableau à sys.tables, sys.columns et sys.index_column pour obtenir des informations pour créer un index de dépôt dynamique. Vous pouvez utiliser cette sélection simple pour générer votre indice de chute. Vous pouvez utiliser la clause where pour filtrer les tables et les colonnes. Si vous souhaitez modifier Table1.Column1, vous devez utiliser ces noms pour filtrer la sélection afin d'obtenir la bonne instruction de suppression

use [testdb]
go
declare @sqlDropIndex NVARCHAR(1000)

select @sqlDropIndex = 'DROP INDEX ' + idx.name + ' ON ' + tbl.name
from sys.indexes idx inner join 
        sys.tables tbl on idx.object_id = tbl.object_id inner join
        sys.index_columns idxCol on idx.index_id = idxCol.index_id inner join
        sys.columns col on idxCol.column_id = col.column_id
where idx.type <> 0 and
        tbl.name = 'MyTableName' and
        col.name = 'MyColumnName'
group by idx.name, tbl.name
order by idx.name desc

print @sqlDropIndex
--exec sp_executeSql @sqlDropIndex
go

J'espère que cela vous aidera


3
lors de la jointure, vous devez enrichir les instructions de jointure avec idx.object_id = idxCol.object_id & idxCol.object_id = col.object_id et aucun regroupement n'est nécessaire.
Bax

2

Pour modifier une colonne, vous devez d'abord supprimer l'index ou toute autre contrainte qui contient cette colonne, puis créer à nouveau l'index / la contrainte. Mais cette tâche doit être effectuée par un administrateur de base de données, car toute baisse d'index ou de contrainte affectera d'une part les données interrogées - pendant que l'index est supprimé, et d'autre part, bloquera l'ensemble de la table pendant le temps où l'index est à nouveau créé. Vous devez vous assurer que les utilisateurs seront conscients de cette petite ou grande maintenance (dépend de la taille de la table). Bonne chance!

Cependant, la création d'index peut être effectuée avec l'option En ligne qui est moins bloquante.


0

Si vous supprimez d'abord l'index, vous ne pourrez plus le lire, sauf si l'index est recréé. Ce que vous pouvez faire pour désactiver l'application de la contrainte.

ALTER TABLE name_of_the_table NOCHECK CONSTRAINT name_of_the_constraint;

Une fois ce script exécuté, la contrainte n'est pas appliquée et vous pouvez entrer des données sans vous soucier des vérifications de contraintes. Vous pouvez à nouveau modifier la table pour réactiver les contraintes.

ALTER TABLE name_of_the_table CHECK CONSTRAINT name_of_the_constraint;

Les violations précédentes ne seront ni vérifiées ni corrigées, mais toutes les entrées après l'application de la contrainte seront vérifiées.


-2

Il y a 2 erreurs dans la réponse de Niko (2 conditions object_id manquantes). Et pas besoin de group by:

SELECT  @sql = 'DROP INDEX ' + idx.name + ' ON ' + tbl.name
FROM    sys.indexes             idx 
INNER JOIN sys.tables           tbl     ON idx.object_id = tbl.object_id 
INNER JOIN sys.index_columns    idxCol  ON idx.index_id = idxCol.index_id   AND idx.object_id = idxCol.object_id 
INNER JOIN sys.columns          col     ON idxCol.column_id = col.column_id AND  idxCol.object_id = col.object_id
WHERE   idx.type <> 0 
AND     tbl.name = 'file_transfer_log' 
AND     col.name = 'tender_id';

1
Veuillez consulter Pourquoi devrais-je enregistrer mon compte? dans la FAQ Stack Exchange.
Paul White 9
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.