SQL Server では 互換性レベル という概念があります。
新しいバージョンで廃止された機能については新しいバージョンで継続して利用することはできませんが、T-SQL の構文の差異であれば互換性レベルを調整することで、新しいバージョンの SQL Server でも古いバージョンの T-SQL の構文解析で動作させることが可能となります。
今回、互換性レベルの変更に伴う構文解析ツールを Codex で作成して、MSSQLCompatibilityLevelQueryChecker として公開しました。
SSMS のアップグレードの評価機能を使用しない理由
最新の SSMS では、SSMS の移行コンポーネントを使用してSQL Serverをアップグレードする で公開されているアップグレードの評価機能が含まれています。
このアップグレード評価は、以前公開されていた Data Migration Assistant の後継機能となり、SSMS の機能を使用することで「Compatibility Issues」「Feature Parity」の二つの観点でアップグレードの評価を行うことができます。
今回対象としたいのが「Compatibility Issues」となり、この観点は前述の互換性レベルが変更されたことによる影響の確認になります。
SSMS の評価機能も基本的には DMA と同様のチェックを実施してくれると思っていたのですが、「DMA では検知されるが SSMS では検知されない」ルールがいくつか存在しているようで、現時点では網羅性については DMA のほうが高い様に思えました。
また、DMA では DB に含まれていないアドホックなクエリを評価対象とする機能が含まれていたのですが、SSMS ではこのような機能は含まれておらず、現時点ではストアドプロシージャ以外のクエリを評価対象とすることができないようです。
DMA は既にダウンロードが停止されてしまっているため、今後ダウンロードができない環境でも広い範囲のクエリに対して互換性レベルごとの構文解析を汎用的に行うことができるようにすることを目的として、今回のツールを作成しました。
ツールで実装されている内容
ツールで実装されている機能は大きく分けて 2 つとなります。
- エクスポート
- 解析
エクスポート
エクスポート機能は、データベース内の各種クエリを .sql ファイルとして出力するものとなります。
.\mssql-compat-check.exe -m export -d "<DB Name>" -o D:\Work\query -M -Q -w
出力対象としては次の内容を対象としています。
- SQL モジュール (ストアドプロシージャ / 関数 / トリガー / ビュー)
- 実行時に指定した DB のオブジェクトを出力
- キャッシュされているクエリ (sys.dm_exec_query_stats)
- 全キャッシュされている
これらの内容をクエリ単位に指定したディレクトリに .sql ファイルとして出力を行っています。
解析
出力された.sql ファイルを使用して解析のレポートを作成します。
.\mssql-compat-check.exe -m analyze -c 100 -t 180 -s D:\Work\query\ -o d:\work\report -w -u
ここでは、現在の互換性レベルと、変更後の互換性レベルを指定することで、その間の互換性レベルのクエリ互換性のチェックが行われます。
解析は ScriptDOM の TSqlParser を使用しており、各互換性レベルで構文的な問題が無いかの確認を行っています。
互換性レベルが変わると予約語が増え、下位の互換性レベルではキーワードとして使用できていたものが、上位の互換性レベルでは使用できないといったものがありますので、そのようなものについては Parse で拾うことができます。(現在の SSMS の評価ではこの観点の機能が不足しているように思えました)
解析が行われると、このように互換性レベルごとの Parse の結果が表示され、どの互換性レベルで構文的な影響を受ける可能性があるかを確認することができます。
最新の ScriptDOM では、互換性レベル 180 という、v.Next のエンジンバージョンが 18.x 向けのパーサーもすでに含まれているため、180 のパースも使用されるようにしています。
このツールは構文解析のみで実際の実行や、機能的になくなったものの確認などはしていませんので、SSMS の評価機能と組み合わせることを前提としたものとなりますが、構文解析を広範囲に実施するための手法の一つとして活用できるのではないでしょうか。