5

たとえば、ユーザー ID 列を UUID データ型から Windows ドメイン ユーザー名に変換するなど、バージョン A から B にアップグレードするには「カスタム」作業が必要です。

これを自動的に展開できるようにするにはどうすればよいですか? つまり、開発者がプロ​​ジェクトを右クリックし、[デプロイ] をクリックして、十分に古いデータベースを使用している場合にこのロジックを実行できるようにしたいと考えています。

データベース プロジェクトにそのようなログインの場所は見当たりません。そのような「アップグレード スクリプト」の規定はないようです。これは本当に不可能ですか?明確にするために、ロジックを自動的に生成することはできませんが、必要に応じて自動的に実行したいと考えています。

もちろん、最初の論理的な障害は、そのようなロジックを更新する必要があるかどうかを展開ユーティリティが認識できないことです。これに対するロジックも提供できると思います (たとえば、バージョン テーブルを確認し、最新のバージョンが <5.0 の場合、このアップグレードを実行し、後で新しいバージョンの行を追加します)。

これは可能ですか?複雑なカスタム変更スクリプトを使用して、展開を完全に自動化できますか? もちろん、すべてのカスタム変更ロジックを(間もなく)巨大なビルド前またはビルド後のスクリプトに貼り付ける必要はありません...

4

2 に答える 2

1

展開時にデータベースをデータ層アプリケーションとして登録すると、インストールされているバージョンを実際に確認できます。これを行うには、発行プロファイルに次を含めます。

    <RegisterDataTierApplication>True</RegisterDataTierApplication>

このオプションは、展開中にスキーマとそのバージョン番号を msdb データベースに登録します。リリースごとに dacpac のバージョン番号を必ず変更してください。msbuild を使用して dacpac を作成します。これは、dacpac バージョンを設定するためのコード例です。

DacVersion=$(ProjectReleaseNumber).$(ProjectBuildNumber).$(ProjectRevisionNumber)

これを行うと、バージョン対応の事前展開スクリプトを作成できます。

-- Get installed version, e.g. 2.3.12309.0
DECLARE @InstalledVersion NVARCHAR(64) = (
    SELECT type_version
    FROM msdb.dbo.sysdac_instances
    WHERE instance_name = DB_NAME()
);
-- Get the major part of the version number, e.g. 2
DECLARE @InstalledVersionMajor TINYINT = CONVERT(TINYINT, SUBSTRING(@InstalledVersion, 0, PATINDEX('%.%', @InstalledVersion)));

IF (@InstalledVersionMajor < 5)
BEGIN;
    PRINT 'Do some nontrivial incremental change that only needs to be applied on version before 5';
END;

現在展開しているバージョン番号を確認するのは少し面倒ですが、実行することもできます。この手法については、Jamie Thomson の優れたブログをご覧ください: Editing sqlcmdvariable nodes in SSDT Publish Profile files using msbuild

于 2013-10-15T08:00:12.473 に答える
0

正直なところ、私が間違っていなければ、Ruby の世界に由来するデータベース移行の概念を使用するのが最善の選択肢です。私は自分のアプリケーションでMigrator.Netというフレームワークを使用しましたが、基本的に同じことを行う非常に優れた (さまざまなレベルのアクティビティを持つ) フレームワークがたくさんあります。Google で簡単に検索すると、かなりの数が見つかります。

于 2011-06-24T10:39:04.600 に答える