先日、Windows Server 2003 のサポートが終了しましたが、SQL Server 2005 のサポートについても 2016 年 4 月 12 日に終了します。
これに伴い、最新の SQL Server への移行を検討する機会も出てくるかと思いますが、アップグレードをする際には、SQL Server アップグレードアドバイザーを使用することで、移行時の問題個所を確認することができます。
今回の投稿では、互換性レベル 80 を使用している SQL Server 2005 に対して、アップグレードアドバイザーを実行するというシナリオについてまとめてみたいと思います。
現状、RTM している最新のバージョンである SQL Server 2014 に対しても SQL Server 2005 で取得したバックアップをリストアすることができますが、互換性レベルについては SQL Server 2014 で対応している最低限のレベルである、SQL Server 2008 (互換性レベル 100) に変更された状態となるため、SQL Server 2000 互換のクエリを実行することができなくなります。
SQL Server 2005 で使用しているデータベースですが、意外と SQL Server 2000 の互換性レベルで動作させていることがあるため、「互換性レベル 80 → 90」、「互換性レベル 90 → 100」に対しての変更に対しての影響を意識する必要が出てきます。
このような変更に対しての影響を確認するためのツールとして SQL Server アップグレードアドバイザーを使用することができます。
SQL Server 2016 CTP2 のアップグレード アドバイザーは SQL Server 2005 ~ SQL Server 2014 に対応をしているのですが、互換性レベル 80 のデータベースについては対応をしていません。
そのため、SQL Server 2005 上の互換性レベル 80 のデータベースに対して実行すると以下のようなエラーとなります。
これは、SQL Server 2012 ~ SQL Server 2014 のアップグレードアドバイザーでも同様で、互換性レベル 80 のデータベースに対して、実行するためには、SQL Server 2008 または SQL Server 2008 R2 のアップグレードアドバイザーを利用する必要があります。
SQL Server 2008 R2 のアップグレードアドバイザーについては、MicrosoftR SQL ServerR 2008 R2 SP1 Feature Pack の「SqlUA.msi」からインストールすることができます。
# SQL Server のインストールメディアからもインストールできたはずですが、今回はダウンロード可能なものを紹介しています。
互換性レベル 80 から変更した場合の影響としては、表の結合に「*=」演算子がが使用できないというようなもの等がありますが、このようなクエリが使用されている場合はアップグレードアドバイザーで確認することができます。
以下は、ストアドプロシージャで「*=」演算子を使用していたものを検出したレポートとなります。
アドホックなクエリとして実行されている場合は、単純にデータベースを選択して、アドバイザーを実行するだけではクエリの確認はできませんので Profiler やトレースででクエリの情報を取得し、それをアップグレードアドバイザーに読み込ませることで、実際に使用されているクエリを対象として実行することができます。
「TSQL_Reply」(ほかのでも大丈夫かもしれませんが)で取得したトレースをファイルに出力して、それをアップグレードアドバイザーに対して読み込ませることで、クエリの確認をすることができます。
互換性レベル 80 からの変更点については、ALTER DATABASE 互換性レベル (Transact-SQL) から確認することができますが、これらのクエリの互換性を一つずつ確認するのは現実的ではありませんので、アップグレードアドバイザーを有効使用すると、影響範囲の概要がわかるかと。
# このツールだけですべてが拾えると考えることは難しいですが、機械的に調べることで初期調査の手間を抑えられますので。