web-dev-qa-db-ja.com

スキーマの変更後に壊れたストアドプロシージャを検出するにはどうすればよいですか?

データベースの中央のテーブルを変更しました。sp_dependsは文字通り数百の結果を返します。変更後、これらのストアドプロシージャの一部がコンパイルされないのではないかと心配しています。

単一のストアドプロシージャのチェックは簡単です(変更スクリプトを再実行して、操作が成功するかどうかを確認するだけです)が、100以上のプロシージャでこれを行うのは少し面倒です。

this one のようなスクリプトを使用してデータベースのすべてのオブジェクトを再コンパイルできることはわかっていますが、実際の操作は、ストアドプロシージャが次に実行されたときではなく、すぐに実行されます。私の場合は適切です。

また、すべてのストアドプロシージャを完全に削除し、データベースをソース管理システムで再同期できると考えていましたが、このオプションは実行可能ではありますが、あまりエレガントではありません。これを行うより良い方法はありますか?

SQLServer 2008 R2を使用していますが、データベーススクリプトはVS 2008データベースプロジェクトに保存されています。


明確にするために、コードをテストするためにこのアプローチのみに依存するべきだと主張しているわけではありません。 C#とまったく同じように、コードを作成するときに他の依存ファイルの構文エラーを瞬時に検出します(その後、通常は数桁遅いユニットテストなどの他の戦略を使用してテストします)、SQLの依存関係を検出することは理にかなっていると思います完全な機能テストを実行する必要がなく、エラーが数秒で完了します。通常、完了までに数時間かかる可能性があります。

11
Brann

単体テスト、機能テスト、統合テスト、パフォーマンステストをどのように実行しますか?テストがない場合は、データベーススキーマをcodeと見なし始め、バージョン管理やテストなど、それをそのように扱うための真剣な時間です。 Alex Kuznetsovがこの主題に特化した本全体を持っています: SQL Serverを使用した防御的データベースプログラミング

7
Remus Rusanu

これは回避策ですが、データベースのCREATE PROCEDUREスクリプトを生成し(データベースを右クリック->タスク->スクリプトを生成)、CREATE PROCEDUREを検索してALTER PROCEDUREで置き換え、解析できます。

ここでより良い答えが得られることを願っています-私も興味があります! :)

4
JHFB

SO質問 T-SQLストアドプロシージャを検証するための信頼できる方法を探しています。誰かがそれを入手したのですか? これは本質的に同じことで、いくつかの答えがあります。

Alaa Awadが投稿したスクリプトに基づいて構築するには...参照オブジェクトと参照オブジェクトのスキーマとデータベースを表示する必要があります。エイリアス(sys.sql_expression_dependenciesを使用すると表示される場合があります)、UDTTパラメータ、またはその他の動的機能を介して多くの一時テーブルを使用している場合は、代わりに関数sys.dm_sql_referenced_entitiesまたはsys.dm_sql_referencing_entitiesを使用する必要があります/また。

SELECT
    DB_NAME() + '.' + OBJECT_SCHEMA_NAME(sed.referencing_id) + '.' + OBJECT_NAME(sed.referencing_id) AS [referencingObject],
    isnull(sed.referenced_server_name + '.', '') + isnull(sed.referenced_database_name + '.', DB_NAME() + '.') + isnull(sed.referenced_schema_name + '.', OBJECT_SCHEMA_NAME(sed.referencing_id) + '.') + sed.referenced_entity_name AS [missingReference]
FROM 
    sys.sql_expression_dependencies sed
WHERE 
    sed.is_ambiguous = 0
    AND OBJECT_ID(isnull(sed.referenced_database_name + '.', DB_NAME() + '.') + isnull(sed.referenced_schema_name + '.', OBJECT_SCHEMA_NAME(sed.referencing_id) + '.') + sed.referenced_entity_name) IS NULL
ORDER BY
    [referencingObject], [missingReference]
3
Arkaine55

Sql Server Data Tools(SSDT)を使用できます。 Microsoft Visual Studioでは、Sql Serverプロジェクトを作成できます。次に、データベースをプロジェクトにインポートして、プロジェクトをビルドします。壊れたストアドプロシージャまたはオブジェクトがあると、コンパイルエラーが発生します。

3
VenVig

sQL Server 2008で追加されたsys.sql_expression_dependenciesを使用する

CREATE PROCEDURE [dbo].[spMaintenance_Find_Broken_Dependencies]

AS
SELECT
    OBJECT_NAME(referencing_id) AS [referencingObject],
    referenced_entity_name AS [missingReference]
FROM 
    sys.sql_expression_dependencies
WHERE 
    is_ambiguous = 0
    AND OBJECT_ID(referenced_entity_name) IS NULL
ORDER BY 
    OBJECT_NAME(referencing_id), referenced_entity_name

GO
1
Alaa Awad