Изменение полнотекстового индексированного столбца в транзакции - PullRequest
6 голосов
/ 28 октября 2009

Я пишу средство обновления данных SQL для преобразования старых столбцов типа text / ntext / image в varchar / nvarchar / varbinary. Средства обновления запускаются в транзакциях, когда система загружается для обновления базы данных из более старой версии. Я заставил SQL работать самостоятельно, но несколько измененных столбцов были полнотекстовыми, что означает, что я не могу изменить их тип без предварительного удаления индекса, например:

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

Проблема в том, что первая строка не работает в модуле обновления данных из-за ошибки «Оператор ALTER FULLTEXT INDEX нельзя использовать внутри транзакции пользователя» Есть ли способ сделать это в рамках транзакции? Либо заставив этот код работать, либо изменив индекс на новый тип другим способом?

Ответы [ 2 ]

9 голосов
/ 28 октября 2009

Нет. Многие изменения DDL не работают в контексте транзакции, потому что они не могут гарантировать откат. Пока оператор просто изменяет некоторые внутренние метаданные базы данных, существует вероятность, что внутри транзакции поддерживается возможность отката, поскольку откат обрабатывается откатом обновлений обычных таблиц базы данных. Но операторы, которые создают файлы, открывают сокеты, подключаются к внешним службам (таким как служба полнотекстового индексирования), не могут выполнить откат, поэтому они не поддерживаются внутри транзакций.

2 голосов
/ 04 апреля 2013

Полнотекстовые каталоги и индексы и некоторые другие операторы не могут быть изменены в транзакции. Смотрите список недопустимых заявлений на: http://msdn.microsoft.com/nl-nl/library/ms191544(v=sql.105).aspx
Я думаю, что нет работы вокруг.

...