Использование BEGIN и BEGIN TRANSACTION в скрипте Liquibase SQL Server - PullRequest
0 голосов
/ 28 ноября 2018

Я пишу скрипт переноса данных 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

Я подозреваю, что миграция данных займет некоторое время, поэтому я действительно хочу разделить это на отдельные транзакции.То есть:

  1. Получить количество строк, которые должны быть переданы в одной транзакции, которая фиксируется.
  2. Цикл while, с каждой партией из 500 строк, переданной в транзакции, которая затем фиксируется.
  3. Отключить вставку идентификатора в окончательной транзакции, а затем зафиксировать.

Я могу добавить соответствующие вызовы 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 для этого набора изменений, но пока не получу синтаксическую ошибкурешено Я даже не могу проверить это должным образом.

Есть идеи, как заставить это работать должным образом?

...