チュートリアル: 既存のデータベースの Transact-SQL コードの分析
データベース スキーマ内の Transact-SQL コードをデータベース プロジェクトにインポートし、規則セットに基づいて分析することにより、そのコードの品質を改善できます。 たとえば、あるスキーマを使用する必要があるが、自分が開発したものではないためにその品質が不明な場合に、そのスキーマにエラーがないかどうかチェックできます。 詳細については、「データベース コードの分析によるコードの品質の向上」を参照してください。
データベース コードを分析する前に、まず既存のデータベースのスキーマをデータベース プロジェクトにインポートしておく必要があります。 このプロジェクトに含まれるコードがどの程度の品質なのかは不明です。 そこで、スタティック コード分析で使用できる規則をすべて適用して、Transact-SQL コードを分析します。 後からチーム開発を行うときに、一部の規則の適用を中止する可能性もありますが、これから行う最初の検査では、データベース コードに含まれるすべての問題を検出しようとしています。 そして、警告と、警告の原因となったコードを確認します。 その後、警告の原因となった問題を修正し、それ以上警告が表示されないようにして、データベース プロジェクトの分析を再度実行します。
必須コンポーネント
このチュートリアルを実行する前に、「チュートリアル: 既存のデータベース スキーマのバージョン管理」を実行する必要があります。 前のチュートリアルでは、MyAdvWorks という名前のデータベース プロジェクトを含むソリューションを作成します。
データベース プロジェクトを分析するための規則を構成するには
Visual Studio で、MyAdvWorks ソリューションを開きます。
スキーマ ビューでデータベース プロジェクトのノードが展開されていない場合は、展開します。
[データ] メニューの [スタティック コード分析] をポイントし、[構成] をクリックします。
データベース プロジェクトのコード分析のプロパティが表示されます。
[規則] ボックスで、Design、Naming、および Performance の各ノードを展開して、Transact-SQL コードの分析に使用できる規則をすべて表示します。
すべての規則のチェック ボックスがオンになっていることを確認します。
規則のカテゴリ (Design など) のチェック ボックスをオンまたはオフにすることで、そのカテゴリ内の各規則のチェック ボックスをオンまたはオフにできます。
注意
規則を警告ではなくエラーとして扱うには、規則の [警告をエラーとして扱う] チェック ボックスをオンにします。
[ファイル] メニューの [すべてを保存] をクリックします。
次は、データベース プロジェクトの Transact-SQL コードを分析します。 このチュートリアルでは、手動で分析を開始しますが、データベース プロジェクトのビルドが正常に完了した後に、毎回分析を開始するように構成することもできます。 詳細については、「方法: データベース コードのスタティック分析を有効/無効にする」を参照してください。
データベース プロジェクトを分析するには
[データ] メニューの [スタティック コード分析] をポイントし、[実行] をクリックします。
データベース プロジェクトの Transact-SQL コードが分析され、警告が [エラー一覧] に表示されます。 [エラー一覧] が表示されない場合は、[表示] メニューの [エラー一覧] をクリックします。
次に、警告を表示して、そのうちの 1 つを修正します。
警告を表示および修正するには
[エラー一覧] で、次の警告を探します。
SR0014 : Microsoft.Rules.Data: ASCII String(1) から SmallInt にキャストするとデータ損失が発生する可能性があります。
この警告の原因となったコードは、"ufnGetStock.function.sql" という名前のファイル内にあります。 コードの場所は、12 行目の 30 列目です。
[エラー一覧] の警告を右クリックして、[エラーのヘルプを表示] をクリックします。
規則 SR0014 に関するヘルプ トピックが表示されます。 ここでは、規則が呼び出された原因、警告の解除方法、およびこの警告を無視できる状況が表示されます。 また、この警告の原因となる Transact-SQL コードの例と、警告を解決するためのコードの更新方法も表示されます。
[エラー一覧] の警告をダブルクリックして強調表示し、Enter キーを押します。
Transact-SQL エディターが開き、警告の原因となったコードが表示されます。 警告の原因となったコードの先頭にカーソルが表示されます。 この例では、整数列 LocationID が単一文字定数 "6" と比較されているため、FROM 句にカーソルが表示されます。 次のコードが表示されます。
CREATE FUNCTION [dbo].[ufnGetStock](@ProductID [int]) RETURNS [int] AS -- Returns the stock level for the product. This function is used internally only BEGIN DECLARE @ret int; SELECT @ret = SUM(p.[Quantity]) FROM [Production].[ProductInventory] p WHERE p.[ProductID] = @ProductID AND p.[LocationID] = '6'; -- Only look at inventory in the misc storage IF (@ret IS NULL) SET @ret = 0 RETURN @ret END; GO EXECUTE sp_addextendedproperty @name = N'MS_Description', @value = N'Scalar function returning the quantity of inventory in LocationID 6 (Miscellaneous Storage)for a specified ProductID.', @level0type = N'SCHEMA', @level0name = N'dbo', @level1type = N'FUNCTION', @level1name = N'ufnGetStock'; GO EXECUTE sp_addextendedproperty @name = N'MS_Description', @value = N'Input parameter for the scalar function ufnGetStock. Enter a valid ProductID from the Production.ProductInventory table.', @level0type = N'SCHEMA', @level0name = N'dbo', @level1type = N'FUNCTION', @level1name = N'ufnGetStock', @level2type = N'PARAMETER', @level2name = N'@ProductID';
SELECT ステートメントのコードを、次の例のように更新します。
SELECT @ret = SUM(p.[Quantity]) FROM [Production].[ProductInventory] p WHERE p.[ProductID] = @ProductID AND p.[LocationID] = 6; -- Only look at inventory in the misc storage
[ファイル] メニューの [ufnGetStock.function.sql の保存] をクリックします。
次は、2 番目の警告を確認して表示されないようにします。
コード分析の警告を表示し、それ以降表示されないようにするには
[エラー一覧] で、次の警告を探します。
SR0011 : Microsoft.Rules.Data: Object name(Database Version) contains special characters.
この警告の原因となったコードは、"AWBuildVersion.table.sql" という名前のファイル内にあります。 コードの場所は、3 行目の 5 列目です。
ここでは、オブジェクト名から特殊文字を削除するかどうか決定する必要があります。 データベース リファクタリングを使用すると、このオブジェクトに対するすべての参照を自動的に更新して、新しい名前に変更できます。 ただし、前の名前を参照しているアプリケーションは機能しなくなります。 最適な方法を判断できるだけの情報がない場合は、変更による影響を特定できるまで、警告が表示されないようにすることができます。 また、Visual Studio Team Foundation Server で作業項目を作成すると、このタスクを追跡できるだけでなく、別の開発者に割り当てることもできます。
[エラー一覧] で、"説明" 列の見出しをクリックします。
[エラー一覧] の警告が説明ごとに並べ替えられ、SR0011 警告がすべて 1 つのグループにまとめられます。
[エラー一覧] をスクロールして、SR0011 警告を表示し、さらに強調表示します。
連続した複数の警告を無視するには、最初の警告をクリックし、Shift キーを押しながら最後の警告をクリックして、複数の警告を強調表示します。
注意
この一覧から作業項目を作成するには、強調表示された列を右クリックして、[作業項目の作成] をポイントし、作業項目の種類をクリックします。 名前を変更できるようになるまで警告が表示されないようにする場合は、名前の変更後に警告を表示するように、作業項目に指示を記載しておく必要があります。 このチュートリアルでは、複雑にならないように、作業項目の作成手順は割愛します。
強調表示された任意の行を右クリックし、[スタティック コード分析メッセージの抑制] をクリックします。
StaticCodeAnalysis.SuppressMessages.xml という名前のファイルがデータベース プロジェクトに追加されます。 MyAdvWorks.dbproj ファイルは、バージョン コントロールからチェックアウトされます。 表示しないよう設定した警告が [エラー一覧] から削除され、一覧に表示される警告が減ります。
注意
データベース プロジェクト内のファイルに対する警告を表示されないように設定すると、そのファイル内にあるその警告のインスタンスはすべて一覧から削除されます。
XML ファイルに、表示されないように設定した警告の一覧が格納されます。 表示されないように設定した警告がすべて表示されるようにするには、このファイルを削除します。 詳細については、「方法: データベース コード分析の警告の抑制を解除する」を参照してください。
最後に、データベース プロジェクトの分析を再度実行します。
データベース プロジェクトを再度分析するには
[データ] メニューの [スタティック コード分析] をポイントし、[実行] をクリックします。
データベース プロジェクト内の Transact-SQL コードが再度分析され、[エラー一覧] に残りの警告が表示されます。 修正した警告や、表示されないように設定した警告は表示されません。
次の手順
一般的な環境では、[エラー一覧] に表示される警告をすべて分析します。 その後、すぐに修正できる問題は修正し、無視できる問題は表示されないようにし、後で修正する必要のある問題については作業項目を作成します。 問題によっては、データベース リファクタリングを使用して警告を解除できることもあります。 データベース リファクタリングの詳細については、「データベースのコードとデータのリファクタリング」を参照してください。
各警告を解除または表示されないようにした後は、データベース単体テストとアプリケーション テストを実行して、変更によって問題が生じないことを確認します。 データベース単体テストの詳細については、「単体テストを使用したデータベース コードの検証」を参照してください。