我正在使用Microsoft Parallel Data Warehouse设备并尝试使用flyway来处理该环境中的表迁移。我遇到的问题是用于建立schema_version表的默认脚本失败。
这是默认脚本,据我所知,在调用baseline()时正在执行。
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并行数据仓库(现在已知的MS PDW或APS)不支持具有默认约束的表达式。
Msg 104338,Level 16,State 1,Line 1 表达式不能与默认约束一起使用。仅指定默认约束的常量。
当GETDATE()用作installed_on列的默认值时,会导致错误。
ALTER TABLE语句也将失败,因为PRIMARY KEY和INDICES在环境中的管理方式不同。
有没有办法覆盖schema_version的默认初始化脚本?
更新
进一步调查显示,在尝试将记录插入schema_version表时会发生下一次失败。具体而言,当前实现尝试基于对dbSupport.getCurrentUserFunction()的调用来标识当前用户。对于SQL Server,此函数为SUSER_SNAME()。虽然此功能在标准SQL Server和并行数据仓库上都可用,但并行数据仓库的当前实现不允许在insert语句的值部分内进行函数调用。因此,返回以下错误:
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 here上的flyway repo上提交了这个新问题。