Windowsプラットフォームで長期間ないがしろにされてきた静的コード分析が、ここ数年でますます重要になってきた。静的分析を新たに重視すること は、FX Copで始まった。それはMicrosoftの内部ツールであったのだが、非常に功を奏したため、一般向けにリリースした。Visual Studio 2005では、FX CopはVisual Studio Team Systemの一部としてIDEに統合された。
ある種のユニットテストの必要性を補完し、さらには無くす機能を装備した第2世代ツールが実現されようとしている。これらには、.NET 4のCode Contracts(参考記事)や独立ベンチャーNStatic(リンク)が含まれる。
管理コードは、注目を集めている唯一の分野ではない。UbitsoftはT-SQLに同様のテクノロジーを適用している。データベースが増大するにつれ て、T-SQLにカプセル化されるビジネスロジックの量は非常に大きくなり、 「通常の」コードさえも重要になる。これを管理するために、UbitsoftはSQL Enlight(リンク)を作成した。リードデベロッパであるIliyan Stoyanov氏は、以下のように話す。
これはかなり新しい製品ですが、SQL Enlightが誕生した背景はどのようなものだったのですか?
T-SQL管理およびリファクタリングツールとして、SQL Enlightを設計しましたが、頭にあるすべてのアイデアをすぐに実施するのに、認められた時間よりもかなり多くの時間が必要だったため、まずT- SQL再フォーマット機能のみをリリースし、それから新しい機能を次第に組み込んでいくことにしました。
どの時点で、Transact-SQL Script Analysisのサポート追加を決めたのですか?
分析機能は、プロジェクトの立ち上げ当初からわれわれの目標の1つでした。しかし、新たなSQL Sever 2005 T-SQL構文のサポートを追加し、T-SQLパーサーの機能拡張が完了するまで、そのリリースを遅らせることにしました。
分析に追加するルールは、どのように決めていますか?
原則として実装する分析ルールはインターネット上の助言や実践、またはSQL Enlightユーザが分析ルールについて提示した要求に基づいています。
技術サポートでは、全データベースの分析をするバージョンに取り組んでいたと言っていました。そのことについて、もう少し詳しく教えてもらえますか?
そのとおりです。1.6の新リリースを進めていました。それはSQL Enlightのバージョン1.xの節目になるでしょう。新リリースには、重要な2つの機能があります。カスタム分析ルールを作成する機能と、データベー スでの分析を実行するサポート機能です。また、コマンドラインツールおよびMsBuildタスクを組み込むことも予定しています。
SQL Enlightの現行バージョンは、以下の分析ルールをサポートする。
設計
- NULL定数を含む等価および非等価比較
- Non-ANSI外部結合構文
- Non-ANSI内部結合構文
- 減価構文string_alias = 式
- データ操作ステートメント (INSERT/UPDATE/DELETEのようなもの)を実行した後で、TRY..CATCHコンストラクターを使用するか、@@ERROR変数を確認する。
- ストアードプロシージャで * を選択する。ビューやtable-valued機能が表示される。
- @@IDENTITYの代わりにSCOPE_IDENTITY()を使用する。
- ORDER BY節の定数に対するサポートが軽視されている。
- ORDER BY節なしで、クエリーでTOP節が使用される。
- INSERTステートメントで、つねにコラムリストを使用する。
- WITHキーワードなしで、テーブルヒントを使うことが軽視されている。
- 索引タイプ(CLUSTEREDまたはNONCLUSTERED)が指定されていない。
- 読み取り可能性の向上のため、GOTOステートメントの使用を避ける。
- 読み取り可能性を向上させるために、括弧を使用することを検討し、論理演算子の優先順位が原因によるミスを避ける。
ネーミング
- 関数のネーミングの際、「fn_」接頭部を避ける。
- ストアードプロシージャのネーミングの際、「sp_」接頭部を避ける。
パフォーマンス
- 変数@variableは宣言されるが、決して使用されない。
- 変数@variableは使用されるが、以前に割り当てられていない。
- 変数@variableは割り当てられるが、決して使用されない。
- LINK述部において「%」で始まるパターン
- 一時テーブルの代わりに、テーブル変数の使用を検討する。
- トリガーで、結果を返すのを避ける。
- 非常に小さい変数長タイプ(サイズ1または2)の使用。
- ストアードプロシージャおよびトリガーでSET NOCOUNT ONオプションを選択。
- WHERE節で、非等価演算子(<>,!=)の使用を避ける。
- ローカルのカーソルがクローズされない。
- ローカルのカーソルの割り当てが明確に解除されない。
- ローカルのカーソル参照の割り当てが明確に解除されない。
- WHERE節で関数内のフィルタリングコラムの折り返しを避ける。
- deterministic関数の呼び出しはWHERE節から抽出することができ、不要なテーブルスキャンを回避することができる。
- 入力パラメータは使用されない。
- 出力パラメータは割り当てられない。
- WHERE節の述部にないものの使用は避ける。
- 集約関数なしに、GROUP BY節を使用しないこと。