2009-10-28 10 views
6

J'écris un programme de mise à jour de données SQL pour convertir les anciennes colonnes de type text/ntext/image en varchar/nvarchar/varbinary. Les programmes de mise à jour sont exécutés dans les transactions lorsque le système démarre pour mettre à jour la base de données à partir d'une ancienne version. Je suis devenu le SQL pour travailler sur lui-même, mais une poignée de colonnes en cours de modification ont été indexées en texte intégral, ce qui signifie que je ne peux pas modifier leur type sans d'abord laisser tomber l'index, comme ceci:Modification d'une colonne indexée de texte intégral dans une transaction

ALTER FULLTEXT INDEX ON Table DROP (Column)
exec dbo.ConvertDataType 'Table', 'Column', 'nvarchar(max)'
ALTER FULLTEXT INDEX ON Table ADD (Column)

Le problème est que la première ligne ne fonctionne pas dans le programme de mise à jour de données en raison de l'erreur "L'instruction ALTER FULLTEXT INDEX ne peut pas être utilisée dans une transaction utilisateur". Y a-t-il un moyen d'y arriver dans le cadre de la transaction? Soit en faisant fonctionner ce code, soit en changeant l'index pour le nouveau type d'une autre manière?

Répondre

9

Nombre de modifications DDL ne fonctionnent pas dans un contexte de transaction car elles ne peuvent pas garantir l'annulation. Tant que l'instruction ne modifie que certaines métadonnées de base de données internes, il existe une possibilité de prise en charge dans une transaction, car une restauration est gérée par des mises à jour de tables de base de données ordinaires. Mais les instructions qui créent des fichiers, ouvrent des sockets, se connectent à des services externes (comme le service d'indexation de texte intégral) ne peuvent pas être annulées, elles ne sont donc pas prises en charge dans les transactions.

Questions connexes