2016-08-08 16 views
0

私はデータベース変更のためにDACPACに切り替えることを検討していますが、より複雑なデータベース更新については何をすべきかについては少し迷っています。私が何を意味しているかを説明するために、同じ問題を抱える簡単な例を使ってみましょう。複雑な変更を加えたDACPACパッケージ

私は現在ライブのCustomerテーブルを持っており、CustomerからCustomerTypeへの外部キーを持つ新しいCustomerTypeテーブルを追加したいとします。 Customerの新しい列は必須(NULL可能ではありません)である必要がありますが、デフォルト値を持つべきではありません。

アップグレード時に既存の顧客の初期タイプを設定するために、任意の数式を使用したいと考えています。私はDACPACを使ってこれをどのように達成しますか?

DACPACは新しい列があることだけを認識し、Customerテーブルに追加しようとしますが、これは必須であるため失敗します。ヌル値を許可するので、デフォルト値を設定することは望ましくありません。

DACPACはすべての状態から最新の状態にアップグレードする必要があるため、この作業を行うために設定する必要のある設定やプレ/ポストスクリプトはありません。

様々な検索が有用な結果が期待はずれの欠如を生産している:(

私は助けることができ、ここで誰かがあります願っています。事前に感謝。

答えて

0

答えはあなたがしている方法に応じてビットを変更しますdacpacをデプロイする計画です.Dacpacを使用して、あるバージョンから次のバージョンへデータベーススキーマを順番に更新するT-SQL更新スクリプトのコレクションを置き換えることが一般的です。データベースのスキーマバージョンごとに1つのdacpacファイルを作成し、dacpacを順次公開してデータベースを最新のバージョンに更新するデータベースを更新します。

この場合、配備後スクリプトを使用して、必要に応じてスキーマを修正できます。あなたのシナリオ例では、NULLとして指定された新しい列と新しいテーブルとのFK関係なしでデータベースプロジェクトのデータベースをモデル化できます。次に、デプロイ後のスクリプトでは、UPDATE文を実行して新しい表と新しい列を埋めるために必要なT-SQL、列の型をNULLからNOT NULLに変更するALTER文を作成し、最後に外部キー関係。

次に、展開後のスクリプトを削除して、適切な列タイプとFK関係で新しい列とテーブルをモデル化することができます。

+0

さて、私はDACPACを意図したように「最終状態」として使用できるようにしたいと考えていますが、状態間の移行をある程度制御しています。列のNULL可能性を変更するポストデプロイメントスクリプトを使用すると、DACPACと完全に最新のデータベースとの間の比較によって変更内容が返されます(つまり、NULL可能ではありませんが、 DACPACにある状態です) – Robba

+0

合意しました、それは不完全です。私たち(SSDTチーム)は、これらのシナリオを改善したいが、それより先に優先順位を付けた他の改善(例えば、列順序を無視するなど)を行っている。 –

+0

私は、ポストデプロイメントスクリプトが実行されるまでfkが無効になると思ったので、ポストデプロイメントでデータをセットアップすることができました(new_col = nullのような再実行可能/冪等) post配備が実行され、列が更新され、最後に、アップグレードの最後に制約が有効になります。 –

関連する問題