Я пишу скрипт переноса данных SQL Server.Миграция данных работает нормально, когда я запускаю ее из SQL Server Management Studio (SSMS), но происходит сбой, когда я пытаюсь запустить ее из Liquibase.Я исследовал, и когда я пытаюсь использовать либо блок операторов BEGIN..END, либо любой ручной контроль транзакций с BEGIN TRANSACTION и COMMIT TRANSACTION, хотя скрипт работает в SSMS, он не работает в Liquibase.Вот пример кода, который работает в Liquibase, без каких-либо блоков операторов или управления транзакциями:
DECLARE @DOC_COUNT int
SELECT @DOC_COUNT = COUNT(*) FROM old_doc_table WHERE ITEM_TYPE = 'DOCUMENT'
SET IDENTITY_INSERT DOCUMENT ON
WHILE ((SELECT COUNT(*) FROM DOCUMENT) < @DOC_COUNT)
INSERT INTO DOCUMENT (
ID,
VERSION,
...
)
SELECT TOP 500
ID,
VERSION,
...
FROM old_doc_table odt
WHERE odt.ITEM_TYPE = 'DOCUMENT'
AND odt.ID NOT IN (SELECT ID FROM DOCUMENT);
SET IDENTITY_INSERT DOCUMENT OFF
Я подозреваю, что миграция данных займет некоторое время, поэтому я действительно хочу разделить это на отдельные транзакции.То есть:
- Получить количество строк, которые должны быть переданы в одной транзакции, которая фиксируется.
- Цикл while, с каждой партией из 500 строк, переданной в транзакции, которая затем фиксируется.
- Отключить вставку идентификатора в окончательной транзакции, а затем зафиксировать.
Я могу добавить соответствующие вызовы BEGIN TRANSACTION и COMMIT TRANSACTION и проверить, что SQL работает нормально в SSMS, но не удаетсяв Liquibase говорят, что скрипт имеет ошибку SQL.Я работаю в Liquibase следующим образом:
<changeSet id="migrateDocumentData" author="proctorh">
<sqlFile path="sql/migrateDocumentData.sql" relativeToChangelogFile="true"/>
</changeSet>
Я знаю, что набор изменений Liquibase имеет логический атрибут runInTransaction, который я планирую установить в false для этого набора изменений, но пока не получу синтаксическую ошибкурешено Я даже не могу проверить это должным образом.
Есть идеи, как заставить это работать должным образом?