私は Microsoft Parallel Data Warehouse アプライアンスを使用しており、その環境でフライウェイを使用してテーブルの移行を処理しようとしています。私が直面している問題は、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 Parallel Data Warehouse (現在は MS PDW または APS として知られています) は、既定の制約を持つ式をサポートしていません。
メッセージ 104338、レベル 16、状態 1、行 1 既定の制約では式を使用できません。デフォルトの制約には定数のみを指定します。
installed_on 列のデフォルトとして GETDATE() が使用されると、エラーが発生します。
環境内で PRIMARY KEY と INDICES が異なる方法で管理されているため、ALTER TABLE ステートメントも失敗します。
schema_version のデフォルトの初期化スクリプトをオーバーライドする方法はありますか?
アップデート
さらに調査すると、schema_version テーブルにレコードを挿入しようとすると、次のエラーが発生することがわかります。具体的には、現在の実装では、dbSupport.getCurrentUserFunction() への呼び出しに基づいて現在のユーザーを識別しようとします。SQL Server の場合、この関数は SUSER_SNAME() です。この関数は標準の SQL Server と Parallel Data Warehouse の両方で使用できますが、Parallel Data Warehouse の現在の実装では、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
SQL Server と SQL Server の並列データ ウェアハウスに接続しているかどうかを正しく識別する flyway-core のフォークができました。私が確認したもう 1 つの問題は、SQL Server PDW がトランザクション内で DDL を許可していないため、トランザクション テンプレート内から試行されたように見えるため、ベースラインの試行が失敗することです。最終的に、これは、初期化スクリプトを変更する方法を理解するという問題から、新しいデータベース プラットフォームのサポートの必要性へと発展しています。私はこれを github hereの flyway リポジトリの新しい問題として提出しました。