Visual Studioで、SQL 2008データベースプロジェクトがあり、テーブルにnull許容でない列を追加するとします。ここでデータベースをデプロイしようとすると、そのテーブルにデータが含まれていると失敗するはずです。(そうですか?)更新中にこの列を「x」に設定したり、より高度なクエリまたはカーソルを使用してテーブル全体を更新して新しい列に入力したりできるように、カスタムロジックをどのように記述しますか?これは、1回だけ実行したいことです。同時に、列がデータベースに追加されました。これに対するサポートはありますか?
5 に答える
null許容列を追加し、UPDATEコマンドを実行してその列にデータを入力し、列をNOTNULLに変更します。Visual Studio 2010は使用していますが、展開には使用していません。代わりに、SQLCompareを使用してデプロイします。SQLスクリプトが生成されます。これは簡単に調整できます。
これが私のやり方です。
スキーマ ビューアでテーブル作成スクリプトを開き、次のように新しい列を追加します。
[first_name] varchar( 32 ) NOT NULL default ' ',
[last_name] varchar( 32 ) NOT NULL default ' ',
*デフォルト値 *があるため、正常にデプロイできます。
次に、インストール後のスクリプトで、テーブル内の値をチェックし、更新を実行して値を入力します。または、コードで修正できます。
これが私がやったことです。
- バージョン情報をデータベースに追加します (例: SystemSettings テーブル)。
- 次のバージョン用のスクリプトを作成します (例: 1.1.0.0.sql)。
- Scripts\Post-Deployment\Script.PostDeployment.sql ファイルで、次を追加します。
DECLARE @versionMajor INT;
DECLARE @versionMinor INT;
DECLARE @versionBuild INT;
DECLARE @versionRevision INT;
SELECT TOP 1
@versionMajor = VersionMajor、
@versionMinor = VersionMinor、 @versionBuild = VersionBuild
、
@versionRevision = VersionRevision
FROM SystemSettings;
IF (@versionMajor <= 1 AND @versionMinor < 1)
BEGIN
:r "..\Upgrade\1.1.0.0.sql"
END
データベースのバージョンが低い場合、これにより 1.1.0.0 スクリプトが実行されます。1.1.0.0 スクリプトは、最後のステップとしてデータベースのバージョン番号を更新します。今後の更新では、別の IF ブロックを追加するだけで済みます。
update mytable
set newcolumn = 'x'
where newcolumn is null;
私はこの種のトピックについて多くの調査を行ってきましたが、悲しいことに、VSDB プロジェクトが不足している分野のようです。Visual Studio ALM Rangersの VSDBプロジェクト ガイドを参照することをお勧めします。彼らは、あなたが求めていることを正確に行うための推奨されるベストプラクティスを詳述するハンズオンラボを持っています (これには、展開前および展開後のスクリプトを使用して、一時テーブルとの間でデータをコピーすることが含まれます)。さらに、Barclay Hill のブログには、あなたの質問に関連する記事があります (彼は Data Tools のシニア プログラム マネージャーです)。これはガイドと同じです。
この推奨される方法は、ターゲット データベースの複数の異なるバージョンを更新できるようにする必要がある場合、非常に高いメンテナンス コストがかかるように思えますが、更新するデータベースが 1 つ (またはスキーマの 1 つのバージョン) しかない場合は、かなりのコストがかかります。実行可能。