適用対象:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Microsoft Fabric の SQL Database
データベース コードを分析することで、設計と名前付けの潜在的な問題を排除し、パフォーマンスの落とし穴を回避できます。 概念は、マネージド コードの欠陥を検出して修正するために静的分析を実行するのと似ています。 データベース コードに適用する分析ルールを構成し、コードを分析してから、特定した問題を修正または無視します。 データベース コードを分析する前に、まずデータベース スキーマをデータベース プロジェクトにインポートする必要があります。 詳細については、「既存のデータベースから開始する」を参照してください。
provided rules を使用して静的分析を実行すると、次のTransact-SQL (T-SQL) カテゴリに分類される問題を特定できます。
T-SQL 設計の問題: 設計の問題には、予期したとおりに動作しない可能性があるコード、非推奨の構文、およびデータベースの設計が変更されたときに問題が発生する可能性がある問題が含まれます。
T-SQL の名前付けの問題: 名前付けの問題は、データベース オブジェクトの名前が予期しない問題を引き起こしたり、一般的に許容される規則に違反したりする可能性がある場合に発生します。
T-SQL のパフォーマンスの問題: パフォーマンスの問題には、データベース操作の速度が著しく低下する可能性があるコードが含まれます。 これらの問題の多くは、コードの実行時にテーブル スキャンの原因となるコードを特定します。
コード分析ルールは拡張可能です。 独自のルールを作成して、独自のコーディング標準を適用できます。 詳細については、「コード分析ルールの拡張情報の概要」を参照してください。
SQL プロジェクト ファイルのサンプルと構文
SQL プロジェクト ファイルには、RunSqlCodeAnalysis と SqlCodeAnalysisRules の 2 つのプロパティを含めることができます。
RunSqlCodeAnalysis要素は、プロジェクトのビルド時にコード分析を実行するかどうかを指定します。 既定では、ビルドでは含まれるすべてのルールが実行され、ルール パターン検出の結果としてビルド警告が表示されます。
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build">
<Sdk Name="Microsoft.Build.Sql" Version="1.0.0" />
<PropertyGroup>
<Name>AdventureWorks</Name>
<DSP>Microsoft.Data.Tools.Schema.Sql.Sql160DatabaseSchemaProvider</DSP>
<ModelCollation>1033, CI</ModelCollation>
<RunSqlCodeAnalysis>True</RunSqlCodeAnalysis>
</PropertyGroup>
...
SqlCodeAnalysisRules要素は、ルールとそのエラーまたは警告の動作を指定します。 次の例では、ルール Microsoft.Rules.Data.SR0006 と Microsoft.Rules.Data.SR0007 が無効になり、ルール Microsoft.Rules.Data.SR0008 の検出によってビルド エラーが発生します。
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build">
<Sdk Name="Microsoft.Build.Sql" Version="1.0.0" />
<PropertyGroup>
<Name>AdventureWorks</Name>
<DSP>Microsoft.Data.Tools.Schema.Sql.Sql160DatabaseSchemaProvider</DSP>
<ModelCollation>1033, CI</ModelCollation>
<RunSqlCodeAnalysis>True</RunSqlCodeAnalysis>
<SqlCodeAnalysisRules>-Microsoft.Rules.Data.SR0006;-Microsoft.Rules.Data.SR0007;+!Microsoft.Rules.Data.SR0008</SqlCodeAnalysisRules>
</PropertyGroup>
...
StaticCodeAnalysis.SuppressMessages.xml ファイルをプロジェクトに追加すると、特定のコード分析結果を抑制できます。 次の例では、ファイル SR0001 のストアド プロシージャの警告 StoredProcedures/uspGetEmployeeManagers.sql を抑制します。
<?xml version="1.0" encoding="utf-8" ?>
<StaticCodeAnalysis version="2" xmlns="urn:Microsoft.Data.Tools.Schema.StaticCodeAnalysis">
<SuppressedFile FilePath="StoredProcedures/uspGetEmployeeManagers.sql">
<SuppressedRule Category="Microsoft.Rules.Data" RuleId="SR0001" />
</SuppressedFile>
</StaticCodeAnalysis>
指定されたルール
T-SQL の設計に関する問題
データベース プロジェクトで T-SQL コードを分析すると、1 つ以上の警告がデザインの問題として分類される場合があります。 次の状況を回避するために、これらの問題に対処します。
- データベースに対する後続の変更により、データベースに依存するアプリケーションが中断される可能性があります。
- そのコードは期待した結果をもたらさない可能性があります。
- 今後のリリースのSQL Serverでコードを実行すると、コードが中断されます。
一般に、現在または将来、アプリケーションが中断される可能性があるため、設計上の問題を抑制しないでください。
指定された規則は、次の設計上の問題を特定します。
- SR0001: ストアド プロシージャ、ビュー、およびテーブル値関数では SELECT * を使用しないようにする
- SR0008: 代わりにSCOPE_IDENTITYを使用することを検討してください@@IDENTITY
- SR0009: サイズ 1 または 2 の可変長の型を使用しないようにする
- SR0010: テーブルまたはビューを結合するときに非推奨の構文を使用しないようにする
- SR0013: 出力パラメーター (パラメーター) がすべてのコード パスに設定されていない
- SR0014: {Type1} から {Type2} へのキャスト時にデータ損失が発生する可能性があります
T-SQL の名前付けの問題
データベース プロジェクトで T-SQL コードを分析すると、名前付けの問題として分類された 1 つ以上の警告が表示されることがあります。 次の状況を回避するために、これらの問題に対処します。
- オブジェクトに指定する名前は、システム オブジェクトの名前と競合します。
- 指定した名前は常にエスケープ文字で囲む必要があります (たとえば、SQL Server、
[、])。 - 指定した名前は、コードの読み取りと理解を試みる他のユーザーを混乱させるものになります。
- 今後のリリースのSQL Serverでコードを実行すると、コードが中断されます。
一般に、変更できない他のアプリケーションが現在の名前に依存する場合は、名前付けの問題を抑制します。
指定された規則は、次の設計上の問題を特定します。
- SR0011: オブジェクト名に特殊文字を使用しないようにする
- SR0012: 型名に予約語を使用しないようにする
- SR0016: ストアド プロシージャの名前の先頭に sp_ を使用しないようにする
T-SQL のパフォーマンスに関する問題
データベース プロジェクトで T-SQL コードを分析すると、パフォーマンスの問題として分類された 1 つ以上の警告が表示されることがあります。 パフォーマンスの問題に対処して、次の状況を回避します。
- コードを実行すると、テーブル スキャンが実行されます。
一般に、スキャンがパフォーマンスに大きな影響を与えないほどデータがテーブルに含まれていない場合は、パフォーマンスの問題を抑制できます。
指定された規則は、次の設計上の問題を特定します。
- SR0004: IN 述語のテスト式としてインデックスがない列を使用しないようにする
- SR0005: LIKE 述語において "%" で始まるパターンを使用しないようにする
- SR0006: 列参照を比較演算子の一方の側に移動して、列インデックスを使用する
- SR0007: 式の Null 許容列に ISNULL(column, default_value) を使用する
- SR0015: WHERE 述語から決定論的関数呼び出しを抽出する
コード分析を有効/無効にする
SQL Database Projects 拡張機能で SQL コード分析を有効または無効にするには、 .sqlproj ファイルを直接編集するか、コード分析設定ダイアログを使用します。
Visual Studio Codeの [Code Analysis設定] ダイアログを使用する
SQL Database Projects 拡張機能には、 .sqlproj ファイルを直接編集せずにコード分析ルールを構成するための設定ダイアログが用意されています。
Code Analysis設定ダイアログを開くには、Database Projects ビューでプロジェクトを右クリックし、Code Analysis Settings を選択します。
ダイアログでは、次のことができます。
- ビルド時にコード分析を有効または無効にするには、ダイアログの上部にある [ビルド時にコード分析を有効化する] トグルを使用します。
- カテゴリ名 (デザイン、名前付け、パフォーマンス) の横にあるチェック ボックスをオンまたはオフにして、ルールのカテゴリを有効または無効にします。
- ルールの 横にあるドロップダウン リストから重大度レベルを選択して、ルールの重大度を変更します。 使用可能なオプションは、 警告、 エラー、 およびなしです。
- ルールの 一覧の上部にある検索バーを使用して、ルールを検索します。
- [すべての重大度] ドロップダウン リストを使用して、重大度でルールをフィルター処理します。
[ OK] を 選択して変更を保存してダイアログを閉じるか、[ 適用] を選択して閉じずに保存します。 [ リセット ] を選択して既定の設定に戻します。
SQL プロジェクト ファイルを編集してコード分析の設定を変更する
テキスト エディターから、 <RunSqlCodeAnalysis>True</RunSqlCodeAnalysis> 要素を最初の <PropertyGroup> ブロックに追加して、コード分析を有効にします。 コード分析を無効にするには、 RunSqlCodeAnalysis 要素の値を False に変更するか、要素全体を削除します。
SQL Server Management Studio (SSMS) で SQL コード分析を有効または無効にするには、ソリューション エクスプローラー でプロジェクトを右クリックし、Properties を選択します。 プロパティ ウィンドウの Code Analysis タブで、目的のcode analysis設定を選択します。
特定のルールを無効にしたり、ルールの重大度を変更したりするには、ルール リストのそのルールのドロップダウン リストから対応するオプションを選択します。
Visual Studioで SQL コード分析を有効または無効にするには、ソリューション エクスプローラー でプロジェクトを右クリックし、 Properties を選択します。 プロパティ ウィンドウの Code Analysis タブで、目的のcode analysis設定を選択します。
特定のルールを無効にしたり、ルールの重大度を変更したりするには、ルール リストのそのルールのドロップダウン リストから対応するオプションを選択します。
Visual Studioで SQL コード分析を有効または無効にするには、ソリューション エクスプローラー でプロジェクトを右クリックし、 Properties を選択します。 プロパティ ウィンドウの Code Analysis タブで、目的のcode analysis設定を選択します。
特定のルールを無効にしたり、ルールの重大度を変更したりするには、ルール リストのそのルールのドロップダウン リストから対応するオプションを選択します。
プロジェクト ファイルのコード分析設定をオーバーライドするには、/p:RunSqlCodeAnalysis コマンドを使用して/p:SqlCodeAnalysisRulesプロパティとdotnet buildプロパティを使用します。 たとえば、コード分析を無効にしてビルドするには、次のようにします:
dotnet build /p:RunSqlCodeAnalysis=False
特定の SQL コード分析ルールの設定を使用してビルドするには:
dotnet build /p:RunSqlCodeAnalysis=True /p:SqlCodeAnalysisRules="+!Microsoft.Rules.Data.SR0001;+!Microsoft.Rules.Data.SR0008"