2009-10-28 12 views
6

Estoy escribiendo un actualizador de datos SQL para convertir columnas de texto/ntext/tipo de texto antiguo en varchar/nvarchar/varbinary. Los actualizadores se ejecutan dentro de las transacciones cuando el sistema arranca para actualizar la base de datos desde una versión anterior. He conseguido que SQL funcione por sí solo, pero un puñado de las columnas que se cambiaron se indexaron en texto completo, lo que significa que no puedo alterar su tipo sin soltar primero el índice, así:Cambiar una columna indexada de texto completo dentro de una transacción

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

El problema es que la primera línea no funciona en el actualizador de datos debido al error "La sentencia ALTER FULLTEXT INDEX no se puede usar dentro de una transacción de usuario". ¿Hay alguna manera de hacer que esto suceda dentro de la transacción? ¿Haciendo que este código funcione o cambiando el índice al nuevo tipo de alguna otra manera?

Respuesta

9

No. Muchos cambios de DDL no funcionan en un contexto de transacción porque no pueden garantizar la reversión. Siempre que la declaración simplemente modifique algunos metadatos internos de la base de datos, existe la posibilidad de que se respalde dentro de una transacción, ya que la reversión de las actualizaciones de las tablas de bases de datos ordinarias se lleva a cabo. Pero las declaraciones que crean archivos, conectores abiertos, se conectan a servicios externos (como el servicio de indexación de texto completo) no pueden deshacerse, por lo que no se admiten dentro de las transacciones.

Cuestiones relacionadas