1

TFS、TFS データベース プロジェクト、および vsdbcmd による自動ビルド プロセスがあります。データベース プロジェクトをデータベース サーバーに展開すると、生成された SQL スクリプトは、特定のストアド プロシージャがターゲット データベースにまだ存在していなくても、それらのストアド プロシージャを 'ALTER' しようとします。代わりに、SQL スクリプトには、これらのストアド プロシージャの「CREATE」ステートメントを含める必要があります。存在しないストアド プロシージャを 'ALTER' する方法がないため、これにより明らかにデータベースの展開が失敗します。

これを引き起こしている可能性があるもの、またはそれを修正する方法について誰か考えがありますか?

4

3 に答える 3

2

VSDBCMD を使用してターゲット データベースにデプロイしていますか? VSDBCMD は、.dbschema ファイルと接続文字列を入力として受け取り、適切な SQL ファイルを生成します。別の DB を指しているときに SQL ファイルを生成した場合、別の状態にある DB サーバーでは機能しません。

于 2012-07-16T15:36:24.043 に答える
1

TFS ビルドでも同様のプロセスを使用しています。これにより、新しく挿入された要素 (テーブル、列、SP、インデックスなど) が正常に処理されると確信しています。

最初に、VSDBCMD を次のように呼び出して、古い DB の .dbschema を生成します。

/a:import /dsp:sql /model:C:\PATH\old.dbschema /cs:"Server=SQLSERVER;Integrated Security=False;Pooling=False;Initial Catalog=OLDDB;User=username;Password=password;

次に、DB の最新状態の .dbschema を生成します。これは、以前のステップで (MSBuild を介して) デプロイされています。

/a:import /dsp:sql /model:C:\PATH\new.dbschema /cs:"Server=SQLSERVER;Integrated Security=False;Pooling=False;Initial Catalog=NEWDB;User=username;Password=password;

最後に、VSDBCMD を 3 回目に呼び出して、ALTER を生成します。

/a:deploy /dsp:sql /model:C:\PATH\new.dbschema /targetmodelfile:C:\PATH\old.dbschema /DeploymentScriptFile:C:\PATH\DB_Alter.sql /p:Targetdatabase="DB" 

この生成された DB_Alter.sql は、DB の以前の状態を実行している実稼働 SQL に適用して、DB を最新の状態にすることができます。

あなたが暗示していることは、VSDBCMD引数を正しく形成していないか、ツールの直接的なバグにまでさかのぼる可能性があります。あなたの代わりに、ツールを手動で試して、2 つのうちどちらが当てはまるかを確認します。
私の知る限り、上記の手順は問題なく機能するため、実装に問題があると思われがちです。

于 2012-07-17T07:56:40.930 に答える
0

何が問題なのかを突き止めました: TFS では、テーブル定義にスキーマ プレフィックスがありませんでした。だから代わりに(例えば)

CREATE TABLE [dbo][TableName]

そうだった

CREATE TABLE [TableName]

スキーマが指定されていないということは、QA が vsdbcmd を実行したときに、テーブルに割り当てられたスキーマが、実行中の個々の vsdbcmd のデフォルト スキーマであったことを意味していました。したがって、実際に作成されたものは、指定したかのように効果的でした:

CREATE TABLE [QAUser_SCHEMA].[TableName]

これにより、vsdbcmd が、後でデフォルト スキーマが [dbo] である別の個人によって実行されたときに、私たちが確認したエラーを受け取り、別のスキーマの下ではあるものの、ストアド プロシージャが既に作成されているため、基本的に ALTER ステートメントが生成されました。

最初に誤ったスキーマが指定されていたとしても、プロシージャに [dbo] スキーマが指定されると、「異なる」プロシージャと見なされると思われるかもしれませんが、そうではありませんでした。元のバージョンの手順 ([QAUser_SCHEMA] を含むもの) を削除し、vsdbcmd を再実行すると問題が解決しました。

TLDR; データベース プロジェクト内のデータベース オブジェクトには、常にスキーマ名のプレフィックスを付けてください。

于 2012-07-17T21:03:24.997 に答える