データベース プロジェクト、ビルド、および配置に関する問題のトラブルシューティング

更新 : 2010 年 7 月

データベース プロジェクトを作成、ビルド、または配置するときに、次の問題が発生する場合があります。

  • データベース オブジェクトのエラー

  • Microsoft SQL Server 2005 の新しい予約語の使用

  • コマンド ライン ビルドの相違点

  • 依存関係と更新スクリプト

  • 引用符で囲まれた識別子が原因でプロジェクトの再読み込み時に問題が発生する

  • データベースの内部状態がその内容と矛盾している

  • 保留中の変更を元に戻す

  • Windows NT ユーザーまたはグループが見つからない

  • オブジェクト名の重複とファイルの除外

  • データベース名およびサーバー名で修飾された名前

  • データベース スキーマのインポートのパフォーマンス

  • ビルド エラーのナビゲーション

  • データベース間参照の使用時の構文エラー

  • SQLCLR プロジェクトおよびアセンブリの名前の変更

  • FULLTEXT STOPLIST でサポートされていない構文

  • SORT_IN_TEMPDB 句がサポートされていない

  • 引用符で囲まれた識別子の状態が、複数のステートメントを含むテーブル値関数のインポート時に失われる

  • 一部のプロジェクト エラーがプロジェクトの再ビルド後に解決しない

  • 配置後スクリプトの不正な構文

データベース オブジェクトのエラー

データベース オブジェクトに 1 つ以上の構文エラーがある場合、関連するエラー メッセージが [エラー一覧] ウィンドウに表示されます。

注意

[エラー一覧] ウィンドウに表示されるエラー メッセージは、エラーを解決するための情報を示しています。 エラーを解決し、データベース オブジェクトを保存すると、そのデータベース オブジェクトのアイコンは通常の状態に戻り、エラーが [エラー一覧] ウィンドウから消えます。

Microsoft SQL Server 2005 の新しい予約語の使用

以下は、SQL Server 2005 の新しい予約語です。EXTERNAL、PIVOT、REVERT、TABLESAMPLE、および UNPIVOT。 Microsoft SQL Server 2005 または SQL Server 2008 を対象としているデータベース プロジェクトでスキーマ オブジェクトの名前としてこれらの予約済みキーワードを使用すると、[出力] ウィンドウにエラーが表示されます。

注意

この制限を回避するには、スキーマ オブジェクトの名前を引用符で囲みます。 たとえば、"CREATE TABLE [External] (c1 INT)" とします。

コマンド ライン ビルドの相違点

Visual Studio でプロジェクトを開いた状態でコマンド ライン ビルドを実行すると、ユーザー インターフェイスでビルドした場合に表示されるビルド エラーの一部が表示されないことがあります。

注意

この問題を回避するには、コマンド ライン ビルドを実行する前に Visual Studio でデータベース プロジェクトを閉じてください。

依存関係と更新スクリプト

更新スクリプトにオブジェクトを正しい順序で生成するために、スキーマ比較はオブジェクトの依存関係を調べます。 たとえば、ビューがテーブルに依存する場合、テーブルを作成してからビューを作成する必要があります。 第 2 のオブジェクトに依存しているオブジェクトがスキーマで修飾された名前を使用していないと、その依存関係が識別されないため、更新スクリプトまたは作成スクリプトに正しい順序でステートメントが作成されない場合があります。 この順序が正しくないと、ソースと一致するようにターゲットを更新したり、変更をデータベースに配置したりするときに、エラーが発生する可能性があります。 この問題は、データベースのビルド スクリプトで発生することもあります。

注意

この問題の発生を防ぐには、依存関係に関与しているオブジェクトの名前がスキーマで修飾されていることを確認します。 Visual Studio Premium および Visual Studio Ultimate では、データベース リファクタリングを使用して、オブジェクト名を完全修飾できます。 詳細については、「データベース オブジェクトの名前の完全修飾」を参照してください。次の例に示すように、単に KeysTable を参照する代わりに [dbo].[KeysTable] を参照するようにステートメントの末尾を変更すると、依存関係を正しく識別できるようになります。

CREATE VIEW [NewUser].[ViewReferencingScalarFunction] AS SELECT Column2, dbo.SimpleMultiplyParamByTwo(PK_Column) AS [Function] FROM KeysTable

引用符で囲まれた識別子が原因でプロジェクトの再読み込み時に問題が発生する

データベースのプロパティで [SET QUOTED_IDENTIFIER] チェック ボックスがオフになっているとき、引用符で囲まれた識別子を含むデータベースを読み込んだ場合、または、オブジェクトを保存した場合、エラーが表示されます。 この状況が発生するのは、引用符で囲まれている識別子を使用しているデータベースからデータベース スキーマをインポートする場合です。

注意

この問題を回避するための方法は 2 つあります。 1 つは、引用符の代わりに角かっこを使用するようにオブジェクトの定義を変更する方法です。 たとえば、"My Table" を [My Table] に変更します。 もう 1 つは、[プロジェクト] メニューの [データベース プロジェクト のプロパティ] をクリックし、[データベースのプロパティ] タブの [SET QUOTED_IDENTIFIER] チェック ボックスをオンにする方法です。

データベースの内部状態がその内容と矛盾している

Visual Studio Premium の使用時に、"データベース プロジェクトの内部状態が、その内容と矛盾しています。 この問題を解決するには、プロジェクトをアンロードしてからリロードします" というエラーが表示される場合があります。 プロジェクトは、そこに含まれているファイルのリストを内部的に管理しています。このエラーは、プロジェクトが把握しているファイルの状態と、実際のファイルの状態がなんらかの理由によって食い違っていることを意味します。 一般に、このエラーは、データベース プロジェクトが開いていないときにプロジェクトのいずれかのファイルがディスクから削除された場合に発生します。 データベース スキーマのインポート時に問題が発生した場合に、このエラーが発生することもあります。

注意

この問題を回避するには、スキーマ ビュー[同期] をクリックします。 問題が回避できない場合は、データベース プロジェクトをアンロードし、再度読み込むことができます。 これを実行するには、ソリューション エクスプローラーでクリックします。 [プロジェクト] メニューの [プロジェクトのアンロード] をクリックします。 プロジェクトをアンロードした後で、[プロジェクト] メニューの [プロジェクトの再読み込み] をクリックします。

保留中の変更を元に戻す

バージョン管理システムの [保留中の変更を元に戻す] を使用しても、スキーマ ビューは自動的には更新されません。 たとえば、テーブルまたは列の名前を変更した後、その変更を元に戻した場合、スキーマ ビューに、"外部ファイルが変更されているため、再同期化が必要です…" というメッセージが表示されます。

注意

この問題を回避するには、スキーマ ビューのツール バーの [同期] をクリックする必要があります。

Windows NT ユーザーまたはグループが見つからない

データベース プロジェクトで参照されているログインが使用できない場合、"Windows NT ユーザーまたはグループ 'DomainName\LoginName' が見つかりませんでした。 名前を再確認してください" というエラーが表示されます。 この問題は、スキーマのインポート元のデータベースとは異なるドメインにあるコンピューターで作業しているときに発生する場合があります。 通常、この状況は、別の場所で作成されたデータベース プロジェクトに対して自宅で作業する場合に発生します。 この状況では、データベース プロジェクトのビルドまたは配置は実行できません。

注意

FOR LOGIN 句を省略してユーザーを作成できます。 たとえば、CREATE USER [Domain\someLogin] を使用できます。 データベース プロジェクトを配置するとユーザーが作成され、[Domain\someLogin] ログインに関連付けられますが、データベース プロジェクト内のそのログインへの参照は必要ありません。

オブジェクト名の重複とファイルの除外

データベース プロジェクトに重複するオブジェクト名がある場合 (Orders という名前が 2 つのテーブルに付けられているなど)、[エラー一覧] ウィンドウにエラーが表示されます。 そのオブジェクトの一方の定義を含むファイルを除外して問題を回避しても、エラー メッセージはすぐには消えません。

注意

この問題を回避するには、[最新の情報に更新] をクリックするか、そのオブジェクト定義を含むファイルを変更してオブジェクト名を変更し、ファイルを保存します。

データベース名およびサーバー名で修飾された名前

Visual Studio Premium でオブジェクトを作成すると、[schema].[object].[child] という名前付け規則に従って、オブジェクトの名前が付けられます。 別のデータベースまたは別のサーバー上にあるオブジェクトを参照する場合は、[server].[database].[schema].[object].[child] のように指定して目的のデータベースやサーバー上の名前を含めることができます。 データベース名またはサーバー名で修飾されている名前を求めるオブジェクトを参照するストアド プロシージャやビューを作成すると、警告が表示されます。

注意

この警告を解決するには、データベース間参照を定義する必要があります。 データベース間参照の詳細については、「データベース プロジェクトでの参照の使用」および「方法: データベース プロジェクトに参照を追加する」を参照してください。

重要

プロジェクトでデータベース名またはサーバー名で修飾された名前に関する警告が解決されておらず、データベース プロジェクトのプロパティの [ビルド] タブにある [警告をエラーとして扱う] チェック ボックスがオンになっていると、配置が失敗します。 この失敗は、データベース名またはサーバー名で修飾された名前により警告が生成されるために発生します。 データベース名またはサーバー名で修飾された名前を使用する場合は、[警告をエラーとして扱う] チェック ボックスをオフにする必要があります。

データベース スキーマのインポートのパフォーマンス

[テスト リスト エディター] ウィンドウまたは [テスト ビュー] ウィンドウを開いたままデータベース スキーマをインポートした場合、インポート操作の完了までに多大な時間がかかります。 このようなパフォーマンスの低下は、新規データベース プロジェクト ウィザード (データベース スキーマをインポートするように選択した場合) と、データベース スキーマのインポート操作の両方で生じます。 データベース スキーマのインポート前に [テスト リスト エディター] ウィンドウと [テスト ビュー] ウィンドウを閉じたとしても問題は解消しません。

注意

この問題を回避するには、[テスト リスト エディター] ウィンドウと [テスト ビュー] ウィンドウを閉じ、さらに、Visual Studio を一度終了してから再起動した後、データベース スキーマをインポートする必要があります。 小規模なスキーマであれば、これらの手順を省略することもできます。サンプル データベースの AdventureWorks でスキーマのインポート操作に要する時間を計測したところ、[テスト リスト エディター] ウィンドウを開いていない状態で 27 秒、[テスト リスト エディター] ウィンドウを開いた状態では 48 秒かかりました。

ビルド エラーのナビゲーション

配置に失敗した場合、生成されたビルド スクリプトを更新してもエラーは修正できません。 ビルド スクリプトの生成に使用したソース ファイルを修正する必要があります。 [エラー一覧] ウィンドウで配置エラーをダブルクリックすると、エディターにビルド スクリプトが表示され、エラーの原因となった行が表示されます。

注意

この問題を回避するには、ビルド スクリプトを見てエラーの原因を特定し、そのうえでデータベース プロジェクト内の、エラーを含んだソース ファイルを修正する必要があります。 たとえば、配置後スクリプト Script.PostDeployment.sql にエラーが存在する場合は、ビルド スクリプトではなく、Script.PostDeployment.sql を修正する必要があります。

データベース間参照の使用時の構文エラー

他のデータベース内のオブジェクトへの参照を含むオブジェクト定義を保存するときに 1 つ以上の構文エラーが発生する場合があります。 たとえば、データベース プロジェクトへの参照を追加し、指定された RefServer および RefDatabase 変数を定義して、値を割り当てることができます。 次に、以下のようにビューを定義できます。

CREATE VIEW [dbo].[MyView]
AS
SELECT * FROM $(RefServer).$(RefDatabase).dbo.TableName

この定義を保存すると、構文エラーを示す 1 つ以上のエラー メッセージが表示される場合があります。 このエラー メッセージはデザイン時検証データベースの名前を参照する場合があり、混乱が生じる可能性があります。

注意

この問題を解決するには、変数名を角かっこで囲む必要があります。 この例の場合は次のように変更します。

CREATE VIEW [dbo].[MyView]
AS
SELECT * FROM [$(RefServer)].[$(RefDatabase)].dbo.TableName

SQLCLR プロジェクトおよびアセンブリの名前の変更

SQLCLR プロジェクトまたはアセンブリへの参照を含むデータベース プロジェクトは、名前を変更して参照を更新しない場合は配置できません。

注意

この問題を解決するには、既存の参照を削除し、名前が更新された SQLCLR プロジェクトまたはアセンブリへの参照を追加します。

FULLTEXT STOPLIST でサポートされていない構文

Visual Studio Premium では、CREATE FULLTEXT STOPLIST ステートメントに対し、オプションの FROM { [DatabaseName.] SourceStoplistName } | SYSTEM STOPLIST ] 構文がモデル化されません。 この構文は、これを使用するオブジェクトをインポートした場合は無視されます。

注意

この問題を解決するには、配置後スクリプトにストップ ワードを手動で追加する必要があります。 詳細については、「方法 : 配置前スクリプトまたは配置後スクリプトを指定する」を参照してください。

SORT_IN_TEMPDB 句がサポートされていない

Visual Studio Premium では、SORT_IN_TEMPDB 句をインデックスに対してインポートできません。 たとえば、次のようなコードがあるとします。

CREATE TABLE [dbo].[IndexTable]
{
[Column1] [INT] NOT NULL
}
GO
CREATE NONCLUSTERED INDEX [SortInTempDbOn] ON [dbo].[IndexTable]
{
[Column1] ASC
} 
WITH (SORT_IN_TEMPDB = ON)
GO

インデックスは、SORT_IN_TEMPDB 句なしでインポートされます。

注意

この問題を解決するには、変更をデータベースからプロジェクトにインポートする際は、常に手動でインデックス定義を修正する必要があります。

引用符で囲まれた識別子の状態が、複数のステートメントを含むテーブル値関数のインポート時に失われる

複数のステートメントを含むテーブル値関数をインポートできますが、引用符で囲まれた識別子文字列の状態は SQL Server に保存されません。 このような関数をインポートした場合、引用符で囲まれた識別子の既定の設定が ON のため、エラーが表示される可能性があります。

注意

この問題を解決するには、オブジェクトおよび設定のインポート後、またはデータベースからプロジェクトへの更新の書き込み後、複数のステートメントを含むテーブル値関数に対する引用符で囲まれた識別子の設定を変更する必要があります。

一部のプロジェクト エラーがプロジェクトの再ビルド後に解決しない

データベース プロジェクトに発生する可能性があるエラーには、エラーの原因の修正後、プロジェクトを再ビルドした場合にも解消されないものがあります。 たとえば、プロジェクトで参照されている .sqlpermissions ファイルを Windows エクスプローラーを使用して削除した場合、予期されるとおりにエラーが発生します。 ソリューション エクスプローラーを使用してプロジェクトからファイルを削除して再ビルドした場合、エラーの修正後であってもエラーが残ります。

注意

この問題を解決するには、ソリューション エクスプローラーのツール バーで [プロジェクトの再分析] をクリックする必要があります。

配置後スクリプトの不正な構文

既定では、Visual Studio 2010 の Transact-SQL エディターで SQLCMD モードは無効です。 SQLCMD モードが有効な場合 Intellisense がアクティブにならないため、この変更が行われました。 配置後スクリプトにステートメントが含まれている場合、配置時に次のエラーが表示される場合があります。

Incorrect syntax near ':'. C:\MySandbox\MySolution\MyProject\Scripts\Post-Deployment\Script.PostDeployment.sql

注意

この問題を修正するには、SQLCMD モードを有効にする必要があります。 SQLCMD モードを有効にするには、Transact-SQL エディターのツール バーで、[SQLCMD モード] をクリックします。

参照

処理手順

方法 : データベース オブジェクトを変更する

方法: 2 つのデータベースのデータを比較して同期させる

概念

データベース オブジェクトへのすべての参照の名前変更

データベース オブジェクトへのすべての参照の名前変更

履歴の変更

日付

履歴

理由

2010 年 7 月

配置後スクリプトで問題が発生する可能性のある、Visual Studio 2010 の既定の動作の変更についてユーザーに警告するエントリを追加しました。

カスタマー フィードバック