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


11

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

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

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

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

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


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

回答:


7

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


テストは常にコードの100%をカバーしているわけではありません。カバーすると、通常、実行に数時間かかります。c#では、コードがまだ数秒でコンパイルできるかどうかを検出できます(正しいかどうかは関係ありません)。これは、コードを適切にテストせずに(c#またはPLSQLのコードに関係なく)本番環境にプッシュする必要があるという意味ではありませんが、壊れた依存関係をすばやく検出する方法があるのは不合理ではないでしょうか。
ブラン2012

2
残念ながら、ストアドプロシージャでの依存関係の検出に対して、SQL Serverの最新技術は「深く破壊されています」。SQL依存関係の理解またはSQL Server 2008のsysdependsを最新の状態に保つを参照してください。この問題に対処しようとし
Remus Rusanu '10

2
これにより、ユニット/機能テストは、破壊的な変更を検出する唯一の信頼できる方法になります。
Remus Rusanu

1
簡単に確認するために、Visual Studio Database Projectsは、変更の検証に関してかなりまともな仕事をします。
Remus Rusanu 2012

4

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

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


私はまだより明確な解決策(できればスクリプト可能な解決策)を望んでいるので、あなたの回答を承認済みとしてマークしませんが、あなたは間違いなく私の+1を受け取ります!ありがとう。
ブラン2012

3
この方法では、存在しないテーブルを参照しているかどうかはわかりません。
Nick Chammas

この方法は、生成されたスクリプトが約30k行を超える場合にも機能しません。私は..私はこのことを知っていることを嫌い
Eonasdan

3

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


SSDTプロジェクトから新しいデータベース作成スクリプトを簡単に生成し、テスト環境で実行できることを付け加えます。これは、スキーマの変更によりprocs / triggers / etcが壊れていないことをかなり徹底的に検証します。
AaronLS 2018

3

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

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]

1
where句にこれらを追加する必要があります:/ *未既存のUserType / AND(sys.types中から選択し、[名前])NOT INをsed.referenced_entity_name /未エイリアス* / AND sed.referenced_schema_nameがNULLではありません
JasonBluefire

1

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

これは便利かもしれませんが、スキーマも考慮する必要があるため、それほど単純ではありません。また、sys.sql_expession_dependenciesが実際の従属テーブルではなく使用されたエイリアスを表示するという問題も発生しています。これは明らかにobject_id()テストに失敗します。最後に、ストアドプロシージャにパラメーターとして渡されるユーザー定義のテーブルが表示されますが、これはあまり役に立ちません。
Tabloo Quijico 2014年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.