在Liquibase SQL Server脚本中使用BEGIN和BEGIN事务

时间:2018-11-28 15:25:08

标签: sql-server liquibase

我正在编写一个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

我怀疑数据迁移将花费一些时间,因此我真的想将其拆分为单独的事务。 Viz:

  1. 获取在一次提交的事务中要传输的行数。
  2. 在循环时,每批次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,但是直到解决语法错误之前,我什至无法正确测试。

有什么想法可以使其正常工作吗?

0 个答案:

没有答案