我正在使用 Microsoft Parallel Data Warehouse 设备并尝试使用 flyway 来处理该环境中的表迁移。我遇到的问题是用于建立 schema_version 表的默认脚本失败。
据我所知,这是在调用基线()时执行的默认脚本。
CREATE TABLE [dbo].[dbresult_migration] (
[installed_rank] INT NOT NULL,
[version] NVARCHAR(50),
[description] NVARCHAR(200),
[type] NVARCHAR(20) NOT NULL,
[script] NVARCHAR(1000) NOT NULL,
[checksum] INT,
[installed_by] NVARCHAR(100) NOT NULL,
[installed_on] DATETIME NOT NULL DEFAULT GETDATE(),
[execution_time] INT NOT NULL,
[success] BIT NOT NULL
);
ALTER TABLE [dbo].[dbresult_migration] ADD CONSTRAINT [dbresult_migration_pk] PRIMARY KEY ([installed_rank]);
CREATE INDEX [dbresult_migration_s_idx] ON [dbo].[dbresult_migration] ([success]);
具体来说,Microsoft Parallel Data Warehouse(现在已知的 MS PDW 或 APS)不支持具有默认约束的表达式。
消息 104338,级别 16,状态 1,行 1 表达式不能与默认约束一起使用。仅指定默认约束的常量。
当 GETDATE() 用作 installed_on 列的默认值时,这会导致错误。
ALTER TABLE 语句也将失败,因为 PRIMARY KEY 和 INDICES 在环境中的管理方式不同。
有没有办法覆盖 schema_version 的默认初始化脚本?
更新
进一步调查显示,尝试将记录插入 schema_version 表时会发生下一次故障。具体来说,当前实现尝试基于对 dbSupport.getCurrentUserFunction() 的调用来识别当前用户。对于 SQL Server,此函数是 SUSER_SNAME()。虽然此函数在标准 SQL Server 和并行数据仓库上都可用,但并行数据仓库的当前实现不允许在插入语句的值部分中调用函数。因此,返回以下错误:
Insert values statement can contain only constant literal values or variable references.
当尝试的查询记录为:
INSERT INTO [dbo].[dbresult_migration] ([installed_rank],[version],[description],[type],[script],[checksum],[installed_by],[execution_time],[success]) VALUES (@P0, @P1, @P2, @P3, @P4, @P5, SUSER_SNAME(), @P6, @P7)
更新 2
我现在有一个 flyway-core 分支,可以正确识别您是否连接到 SQL Server 与 SQL Server 并行数据仓库。我发现的另一个问题是 SQL Server PDW 不允许在事务中进行 DDL,因此基线尝试失败,因为这似乎是从事务模板中尝试的。最终,这从理解如何修改初始化脚本的问题演变为需要支持新的数据库平台。我已将其作为新问题提交到 github 上的 flyway repo上。