BT

最新技術を追い求めるデベロッパのための情報コミュニティ

寄稿

Topics

地域を選ぶ

InfoQ ホームページ ニュース T-SQLの静的コード分析

T-SQLの静的コード分析

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節を使用しないこと。

 

原文はこちらです:http://www.infoq.com/news/2008/11/TSQL-Analysis

この記事に星をつける

おすすめ度
スタイル

BT