web-dev-qa-db-ja.com

SSDTを使用して、別のデータベースのオブジェクトを参照するビューがある場合のSQL71561エラーを解決するにはどうすればよいですか?

SSDTにデータベースプロジェクトがあり、別のデータベースのオブジェクトを参照するビューをインポートすると、エラーSQL71561が表示され、次の行に説明が表示されます。

エラー4 SQL71561:ビュー:[スキーマ]。[ビュー名]には、オブジェクト[other_db]。[スキーマ]。[テーブル]。[列]への未解決の参照があります

私はこれを理解するためにしばらく時間を費やしたので、他の人がこれに遭遇するのを助けるために、私にとってうまくいった答えを投稿します。

26
Jeff Ogata

これを解決するために、他のデータベースへの参照を追加し、ダイアログの[データベース変数]フィールドをクリアしました。このフィールドをクリアしなかった場合、スキーマ比較を実行すると、SSDTはデータベース変数名を使用して更新スクリプトを生成し、失敗しました。

  1. データベース参照をプロジェクトに追加します。
  2. 私の場合、他のデータベースは同じソリューションの別のプロジェクトだったので、[データベース参照の追加]ダイアログの最初のドロップダウンでそれを選択することができました。
  3. 「データベース名」フィールドのテキストが正しいことを確認してください。
  4. 「データベース変数」フィールドをクリアします。

「使用例」のテキストを見て、期待どおりに見えることを確認します。 [OK]をクリックして参照を追加すると、「未解決の参照」エラーが処理されます。

これを実行した後、スキーマの比較を行うことができましたが、プロジェクトをビルドしようとすると、次のエラーが発生しました。

エラー408 SQL00208:無効なオブジェクト名 'db.schema.table'。

プロジェクトのプロパティに移動し、[共通オブジェクトの拡張Transact-SQL検証を有効にする]チェックボックスをオフにすると、プロジェクトを正常にビルドできました。

31
Jeff Ogata

私の問題は見方によるものでした。私が見た中で...

...FROM [MyDatabase].[dbo].[MyTable]

交換しました...

...FROM [MyTable]

その理由は、bacpac/dacpacを別のデータベース名にインポートする可能性があるため、[MyDatabase]への参照が無効になる可能性があるためです。

11
Jason Geiger

上記の4つの答えをすべて試した後も、2つのストアドプロシージャで同じエラーが発生していました(1000以上のエラーから2つまで)。

つまり、現在機能しているのは、テーブルエイリアス名をテーブル名自体に置き換えるだけで、ビルドが成功したことです。

--From
table1 t1 join table2 t2
t1.col1 = t2.col1
--To
table1 t1 join table2 t2
table1.col1 = t2.col1
0
Swanand Pangam

プロジェクトプロパティ>ターゲットプラットフォームをSQL Server 2016からSQL Server 2014に変更すると、これらのエラーが表示され始めました。

私のシナリオでは、1つのSSDTプロジェクト(A)の外部ツールによって作成されたデータベースと、別のプロジェクト(B)のSQLビューなどに、B-> Aからの参照が含まれています。

SQL 2016に対して開発したところ、テスト環境が2014を実行していることがわかりました。そのため、(B)でターゲットプラットフォームを変更し、展開できるようにしました。 (A)はデプロイされていません-外部データベースもインストールされ、同じデータベースを作成するように構成されています。

奇妙なことに、後で(B)でビューを変更して公開することができましたが、その後、列を削除したいと考えました。この時点で、これらの参照エラーのためにパブリッシュが失敗し続けました。プロジェクト(A)のターゲットプラットフォームを2014に変更すると、エラーがクリアされ、続行できるようになりました。

0
robaker

ビルド順序が正しくない場合、これに遭遇する可能性があります。

ソース管理からプロジェクトの新しいコピーをプルして「ビルドソリューション」を実行しているときに、この問題に遭遇しました。

参照が機能しない場合は、参照されるデータベース[other_db]を構築してください。 [other_db]を構築すると、参照が機能しました。

0
fhilton