データベース プロジェクト、ビルド、および配置に関する問題のトラブルシューティング
データベース プロジェクトを作成、ビルド、または配置するときに、次の問題が発生する場合があります。
データベース オブジェクトのエラー
Microsoft SQL Server 2005 の新しい予約語の使用
コマンド ライン ビルドの相違点
依存関係と更新スクリプト
自分をユーザーとして追加する際のエラー
引用符で囲まれた識別子が原因でプロジェクトの再読み込み時に問題が発生する
データベースの内部状態がその内容と矛盾している
フルテキスト検索
SQLCLR オブジェクト
保留中の変更を元に戻す
Windows NT ユーザーまたはグループが見つからない
オブジェクト名の重複とファイルの除外
データベース名およびサーバー名で修飾された名前
データベース スキーマのインポートのパフォーマンス
ビルド エラーのナビゲーション
データベース プロジェクトと TRUSTWORTHY 設定
リンク サーバーおよびスクリプトのインポート
データベース間参照の使用時の構文エラー
拡張プロパティが設定された XML インデックス
SQLCLR プロジェクトおよびアセンブリの名前の変更
フルテキスト ストップリストではサポートされない構文
SORT_IN_TEMPDB 句はインポートされない
複数のステートメントを含むテーブル値関数をインポートすると、引用符で囲まれた識別子の状態が消失する
データベース オブジェクトのエラー
データベース オブジェクトに構文エラーがある場合、そのデータベースのアイコンに赤い感嘆符 (!) のエラー アイコンが表示され、関連するエラー メッセージが [エラー一覧] ウィンドウに表示されます。 SQL Server のローカル インスタンスにより、デザイン時検証中に返されたエラーの正しい行番号が報告されます。 ただし、列番号は常に列 1 として報告されます。 SQL 構文エラーの行と列は、どちらも適切です。
メモ : |
---|
[エラー一覧] ウィンドウに表示されるエラー メッセージは、エラーを解決するための情報を示しています。 エラーを解決し、データベース オブジェクトを保存すると、そのデータベース オブジェクトのアイコンは通常の状態に戻ります。 |
Microsoft SQL Server 2005 の新しい予約語の使用
以下は、SQL Server 2005 の新しい予約語です。EXTERNAL、PIVOT、REVERT、TABLESAMPLE、および UNPIVOT。 SQL Server 2000 を対象としているデータベース プロジェクトでスキーマ オブジェクトの名前としてこれらの予約済みキーワードを使用すると、[出力] ウィンドウにエラーが表示されます。
メモ : |
---|
この制限を回避するには、スキーマ オブジェクトの名前を引用符で囲みます。 たとえば、"CREATE TABLE [External] (c1 INT)" とします。 |
コマンド ライン ビルドの相違点
Visual Studio でプロジェクトを開いた状態でコマンド ライン ビルドを実行すると、ユーザー インターフェイスでビルドした場合に表示されるビルド エラーの一部が表示されないことがあります。
メモ : |
---|
この問題を回避するには、コマンド ライン ビルドを実行する前に Visual Studio でデータベース プロジェクトを閉じてください。 |
依存関係と更新スクリプト
更新スクリプトにオブジェクトを正しい順序で生成するために、スキーマ比較はオブジェクトの依存関係を調べます。 たとえば、ビューがテーブルに依存する場合、テーブルを作成してからビューを作成する必要があります。 第 2 のオブジェクトに依存しているオブジェクトがスキーマで修飾された名前を使用していないと、その依存関係が識別されないため、更新スクリプトまたは作成スクリプトに正しい順序でステートメントが作成されない場合があります。 この順序が正しくないと、ソースと一致するようにターゲットを更新したり、変更をデータベースに配置したりするときに、エラーが発生する可能性があります。 この問題は、データベースのビルド スクリプトで発生することもあります。
メモ : |
---|
この問題の発生を防ぐには、依存関係に関与しているオブジェクトの名前がスキーマで修飾されていることを確認します。 次の例に示すように、単に KeysTable を参照する代わりに [dbo].[KeysTable] を参照するようにステートメントの末尾を変更すると、依存関係を正しく識別できるようになります。 |
CREATE VIEW [NewUser].[ViewReferencingScalarFunction] AS SELECT Column2, dbo.SimpleMultiplyParamByTwo(PK_Column) AS [Function] FROM KeysTable
自分をユーザーとして追加する際のエラー
既に sysadmin ロールのメンバであるときに、自分自身をユーザーとして追加しようとすると、"ログインは別のユーザー名でアカウントがあります" というエラーが表示されます。 デザイン時検証データベースのデータベース所有者は、そのデータベースの dbo ユーザーでもあると見なされるためです。 したがって、自分をデータベース ユーザーとして再度追加することはできません。
引用符で囲まれた識別子が原因でプロジェクトの再読み込み時に問題が発生する
データベースのプロパティで [SET QUOTED_IDENTIFIER] チェック ボックスがオフになっているとき、引用符で囲まれた識別子を含むデータベースを読み込んだ場合、または、オブジェクトを保存した場合、エラーが表示されます。 この状況が発生するのは、引用符で囲まれている識別子を使用しているデータベースからデータベース スキーマをインポートする場合です。
メモ : |
---|
この問題を回避するための方法は 2 つあります。 1 つは、引用符の代わりに角かっこを使用するようにオブジェクトの定義を変更する方法です。 たとえば、"My Table" を [My Table] に変更します。 もう 1 つは、[プロジェクト] メニューの [データベース プロジェクト のプロパティ] をクリックし、[データベースのプロパティ] タブの [SET QUOTED_IDENTIFIER] チェック ボックスをオンにする方法です。 |
データベースの内部状態がその内容と矛盾している
Visual Studio Team System Database Edition の使用時に、"データベース プロジェクトの内部状態が、その内容と矛盾しています。 この問題を解決するには、プロジェクトをアンロードしてからリロードします" というエラーが表示される場合があります。 プロジェクトは、そこに含まれているファイルのリストを内部的に管理しています。このエラーは、プロジェクトが把握しているファイルの状態と、実際のファイルの状態がなんらかの理由によって食い違っていることを意味します。 一般に、このエラーは、データベース プロジェクトが開いていないときにプロジェクトのいずれかのファイルがディスクから削除された場合に発生します。 データベース スキーマのインポート時に問題が発生した場合に、このエラーが発生することもあります。
メモ : |
---|
この問題を回避するには、データベース プロジェクトをアンロードし、再度読み込む必要があります。 このためには、ソリューション エクスプローラでデータベース プロジェクトをクリックします。 [プロジェクト] メニューの [プロジェクトのアンロード] をクリックします。 プロジェクトをアンロードした後で、[プロジェクト] メニューの [プロジェクトの再読み込み] をクリックします。 |
フルテキスト検索
フルテキスト検索とデザイン時検証データベース
デザイン時検証データベースのフルテキスト検索を無効にし、フルテキスト インデックス付きオブジェクトが存在するデータベースからスキーマをインポートした場合、そのフルテキスト インデックス付きオブジェクトがインポートされます。 ただし、フルテキスト インデックスを使用するオブジェクトに関するエラーが [エラー一覧] ウィンドウに表示されます。 オブジェクトをインポート後に、デザイン時検証データベースのフルテキスト検索を無効にした場合も、同じエラーが表示されます。
メモ : |
---|
この問題を回避するには、デザイン時検証データベースのフルテキスト検索を有効にする必要があります。 詳細については、Microsoft Web サイトの「フルテキスト検索管理者向けの情報」を参照してください。 |
フルテキスト インデックスの定義での sp_fulltext_table のアクション
フルテキスト インデックスの定義には、CREATE アクションのみを使用できます。 ACTIVATE などのアクションを実行する場合は、データベースの配置後スクリプトで実行する必要があります。 他のアクションを追加した場合、メイン バッチに最上位のデータ操作言語 (DML) ステートメントを追加することはできないため、 ステートメントを削除してから操作をやり直すように求めるエラーが表示されます。
メモ : |
---|
この問題を回避するには、配置後スクリプト、または配置後スクリプトにインクルードされるスクリプトに sp_fulltext_table ステートメントを移動する必要があります。 配置後スクリプトの詳細については、「方法 : 配置前スクリプトまたは配置後スクリプトを指定する」を参照してください。 |
SQLCLR オブジェクト
既定では、SQL 共通言語ランタイム (SQLCLR: SQL common language run-time) 統合は SQL Server 2005 で無効になっています。 SQLCLR オブジェクトが存在するデータベースからスキーマをインポートする場合、デザイン時検証データベースで SQLCLR 統合が無効になっていても、[エラー一覧] ウィンドウにエラーは表示されません。 ただし、そのオブジェクトを実行しようとすると、エラーが発生します。
メモ : |
---|
この問題を回避するには、Database Edition や SQL Server Management Studio などのツールから Transact-SQL (T-SQL) エディタを実行し、システム管理者としてサーバーに接続します。 クエリ ウィンドウで、次のコマンドを実行します。 |
exec sp_configure 'clr enabled', 1
reconfigure
保留中の変更を元に戻す
バージョン管理システムの [保留中の変更を元に戻す] を使用しても、スキーマ ビューは自動的には更新されません。 たとえば、テーブルまたは列の名前を変更した後、その変更を元に戻した場合、スキーマ ビューに、"外部ファイルが変更されているため、再同期化が必要です…" というメッセージが表示されます。
メモ : |
---|
この問題を回避するには、スキーマ ビューのツール バーの [同期] をクリックする必要があります。 |
Windows NT ユーザーまたはグループが見つからない
データベース プロジェクトで参照されているログインが使用できない場合、"Windows NT ユーザーまたはグループ 'DomainName\LoginName' が見つかりませんでした。 名前を再確認してください" というエラーが表示されます。 この問題は、たとえば、スキーマのインポート元のデータベースとは異なるドメインにあるコンピュータで作業しているときに発生する場合があります。 通常、この状況は、別の場所で作成されたデータベースに対して自宅で作業する場合に発生します。 この状況では、データベース プロジェクトのビルドまたは配置は実行できません。
メモ : |
---|
この問題の対処方法はありません。 参照するログインが有効な場合にのみ、データベース プロジェクトをビルドおよび配置できます。 |
オブジェクト名の重複とファイルの除外
データベース プロジェクトに重複するオブジェクト名がある場合 (Orders という名前が 2 つのテーブルに付けられているなど)、[エラー一覧] ウィンドウにエラーが表示されます。 そのオブジェクトの一方の定義を含むファイルを除外して問題を回避しても、エラー メッセージはすぐには消えません。
メモ : |
---|
この問題を回避するには、[最新の情報に更新] をクリックするか、そのオブジェクト定義を含むファイルを編集してオブジェクト名を変更し、ファイルを保存します。 |
データベース名およびサーバー名で修飾された名前
Team Edition for Database Professionals でオブジェクトを作成すると、[schema].[object].[child] という名前付け規則に従って、オブジェクトの名前が付けられます。 別のデータベースまたは別のサーバー上にあるオブジェクトを参照する場合は、[server].[database].[schema].[object].[child] のように指定して目的のデータベースやサーバー上の名前を含めることができます。 データベース名またはサーバー名で修飾されている名前を求めるオブジェクトを参照するストアド プロシージャやビューを作成すると、警告が表示されます。
メモ : |
---|
この警告を解決するには、データベース間参照を定義する必要があります。データベース間参照の詳細については、「データベース プロジェクトでの参照の使用」および「方法 : データベース プロジェクトに参照を追加する」を参照してください。 |
重要 : |
---|
プロジェクトでデータベース名またはサーバー名で修飾された名前に関する警告が解決されておらず、データベース プロジェクトのプロパティの [ビルド] タブにある [警告をエラーとして扱う] チェック ボックスがオンになっていると、配置が失敗します。 この失敗は、データベース名またはサーバー名で修飾された名前により警告が生成されるために発生します。 データベース名またはサーバー名で修飾された名前を使用する場合は、[警告をエラーとして扱う] チェック ボックスをオフにする必要があります。 |
データベース スキーマのインポートのパフォーマンス
[テスト リスト エディタ] ウィンドウまたは [テスト ビュー] ウィンドウを開いたままデータベース スキーマをインポートした場合、インポート操作の完了までに多大な時間がかかります。 このようなパフォーマンスの低下は、新規データベース プロジェクト ウィザード (データベース スキーマをインポートするように選択した場合) と、データベース スキーマのインポート操作の両方で生じます。 データベース スキーマのインポート前に [テスト リスト エディタ] ウィンドウと [テスト ビュー] ウィンドウを閉じたとしても問題は解消しません。
メモ : |
---|
この問題を回避するには、[テスト リスト エディタ] ウィンドウと [テスト ビュー] ウィンドウを閉じ、さらに、Visual Studio を一度終了してから再起動した後、データベース スキーマをインポートする必要があります。 ごく小さなスキーマであれば、これらの手順を省略することもできます。 サンプル データベースの AdventureWorks でスキーマのインポート操作に要する時間を計測したところ、[テスト リスト エディタ] ウィンドウを開いていない状態で 27 秒、[テスト リスト エディタ] ウィンドウを開いた状態では 48 秒かかりました。 |
ビルド エラーのナビゲーション
配置に失敗した場合、生成されたビルド スクリプトを更新してもエラーは修正できません。 ビルド スクリプトの生成に使用したソース ファイルを修正する必要があります。 [エラー一覧] ウィンドウで配置エラーをダブルクリックすると、エディタにビルド スクリプトが表示され、エラーの原因となった行が表示されます。
メモ : |
---|
この問題を回避するには、ビルド スクリプトを見てエラーの原因を特定し、そのうえでデータベース プロジェクト内の、エラーを含んだソース ファイルを修正する必要があります。 たとえば、配置後スクリプト Permissions.sql にエラーが存在する場合は、ビルド スクリプトではなく、Permissions.sql を修正する必要があります。 |
データベース プロジェクトと TRUSTWORTHY 設定
データベース プロジェクトの TRUSTWORTHY 設定を有効にしたり、TRUSTWORTHY 設定が有効になったデータベース プロジェクトを開いたりするには、sysadmin 権限が必要です。
メモ : |
---|
TRUSTWORTHY 設定が有効になっている必要性がなければ、管理者に問い合わせて、データベース プロジェクトの TRUSTWORTHY 設定を無効にしてもらうことによって、この問題を回避できます。 TRUSTWORTHY 設定が有効になっている必要がある場合は、データベースに対する sysadmin 権限を、そのデータベース プロジェクトにかかわるすべての開発者に付与する必要があります。 それぞれの開発者が分離開発環境で作業している場合は、おのおのが自分専用のデータベースのコピーを利用することになるため、データベースに sysadmin ロールを追加してもセキュリティが損なわれることにはなりません。 |
リンク サーバーおよびスクリプトのインポート
複数のスクリプトをデータベース プロジェクトにインポートした場合、データベース プロジェクトを配置するときにエラーが表示される場合があります。 この状況は、これらのスクリプトで、同じリンク サーバーが複数回定義されていた場合に発生します。
メモ : |
---|
この問題を回避するには、配置前スクリプト LinkedServers.sql の各 sp_addlinkedserver 呼び出しの前に、次の T-SQL を追加します。 |
IF NOT EXISTS (SELECT * FROM master.dbo.sysservers WHERE srvname = N'<serverName>')
データベース間参照の使用時の構文エラー
他のデータベース内のオブジェクトへの参照を含むオブジェクト定義を保存するときに 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
拡張プロパティが設定された XML インデックス
1 つ以上の拡張プロパティが定義された XML インデックスのオブジェクト定義を保存するとき、構文エラーが表示されることがあります。 この種のエラーは、XML インデックスを削除して再作成するときに、SQL Server 2005 が拡張プロパティを削除しないことに起因して発生します。 この状況が発生すると、"TSD4001: プロパティを追加できません。 'XMLIndexName' のプロパティ 'ExtendedPropertyName' は既に存在します。 (SQL error = 15233)" というエラーが表示されることがあります。
メモ : |
---|
この問題を解決するには、配置後スクリプトに対する拡張プロパティ (1 つまたは複数) の定義を削除し、その定義の直前に次のステートメントを追加します。 |
IF NOT EXISTS (SELECT * FROM fn_listextendedproperty('ExtendedPropertyName', 'SCHEMA', N'SchemaName', 'TABLE', N'TableName', 'INDEX', N'XMLIndexName')
SQLCLR プロジェクトおよびアセンブリの名前の変更
SQLCLR プロジェクトまたはアセンブリへの参照を含むデータベース プロジェクトの名前を変更した場合、参照を更新しないとプロジェクトを配置できません。
メモ : |
---|
問題を修正するには、古い参照を削除し、更新した名前を使用して SQLCLR プロジェクトまたはアセンブリへの参照を追加します。 |
フルテキスト ストップリストではサポートされない構文
Database Edition は、CREATE FULLTEXT STOPLIST ステートメントの省略可能な FROM { [DatabaseName.] SourceStoplistName } | SYSTEM STOPLIST ] 構文をモデル化しません。 この構文を使用するオブジェクトをインポートした場合、この構文は無視されます。
メモ : |
---|
問題を修正するには、配置後スクリプトに手動でストップ ワードを追加する必要があります。 詳細については、「方法 : 配置前スクリプトまたは配置後スクリプトを指定する」を参照してください。 |
SORT_IN_TEMPDB 句はインポートされない
Database Edition はインデックスの 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 2000 および SQL Server 2005 では保存されません。 これらの関数をインポートすると、引用符に囲まれた識別子の既定の設定がオンになっているため、エラーが表示されることがあります
メモ : |
---|
問題を修正するには、オブジェクトと設定のインポートの後、またはデータベースからプロジェクトへの更新の書き込みの後で、複数のステートメントを含む、任意のテーブル値関数の引用符に囲まれた識別子の設定を変更する必要があります。 |