Share via


SQL Server 2008 におけるデータベース エンジン機能の重大な変更

このトピックでは、データベース エンジンにおける重大な変更について説明します。これらの変更によって、以前のバージョンの SQL Server に基づくアプリケーション、スクリプト、または機能が使用できなくなる場合があります。これらの問題は、アップグレードするときに発生することがあります。詳細については、「アップグレード アドバイザを使用したアップグレードの準備」を参照してください。

照合順序

機能

説明

新しい照合順序

SQL Server 2008 では、Windows Server 2008 が提供する照合順序に完全に対応する新しい照合順序が導入されています。この 80 個の新しい照合順序は、言語面での精度が向上しており、*_100 というバージョン参照で示されます。サーバーまたはデータベースに新しい照合順序を選択する場合は、古いクライアント ドライバを使用するクライアントではその照合順序が認識されない可能性があることに注意してください。照合順序が認識されないと、アプリケーションはエラーを返して失敗する場合があります。次の解決策を検討してください。

  • クライアント オペレーティング システムをアップグレードして、基になるシステムの照合順序を更新する。

  • クライアントにデータベース クライアント ソフトウェアがインストールされている場合、データベース クライアント ソフトウェアにサービスの更新プログラムを適用する。

  • クライアントのコード ページにマップする既存の照合順序を選択する。

詳細については、「照合順序の設定と変更」を参照してください。

共通言語ランタイム (CLR)

機能

説明

CLR アセンブリ

データベースを SQL Server 2008 にアップグレードすると、新しいデータ型をサポートする Microsoft.SqlServer.Types アセンブリが自動的にインストールされます。アップグレード アドバイザのルールにより、競合する名前を持つユーザー型またはアセンブリが検出されます。アップグレード アドバイザは、次のいずれかの方法によって、競合するアセンブリの名前の変更を推奨します。2 つの方法とは、競合する型の名前を変更するか、または 2 つの部分から構成される名前をコード内で使用して既存のユーザー型を参照するかのどちらかです。

データベースのアップグレード時に競合する名前を持つユーザー アセンブリが検出されると、このアセンブリの名前が自動的に変更され、データベースが問題のあるモードになります。

アップグレード時に競合する名前を持つユーザー型が検出された場合、特別な処理は実行されません。アップグレード後は、古いユーザー型と新しいシステム型の両方が存在することになります。ユーザー型は、2 つの部分から構成される名前を介してのみ使用できます。

CLR アセンブリ

SQL Server 2008 では .NET Framework 3.5 SP1 がインストールされ、グローバル アセンブリ キャッシュ (GAC) 内のライブラリが更新されます。SQL Server データベースにサポートされていないライブラリが登録されている場合、SQL Server 2008 にアップグレードすると、SQL Server アプリケーションの動作が停止する可能性があります。これは、GAC でライブラリを提供またはアップグレードしても SQL Server 内でアセンブリが更新されないためです。アセンブリが SQL Server データベースと GAC の両方に存在する場合、アセンブリの 2 つのコピーが完全に一致する必要があります。一致しない場合、SQL Server CLR 統合によってアセンブリが使用されたときにエラーが発生します。詳細については、「サポートされている .NET Framework ライブラリ」を参照してください。

データベースをアップグレードした後、ALTER ASSEMBLY ステートメントを使用して、SQL Server データベース内でアセンブリのコピーを提供またはアップグレードします。詳細については、サポート技術情報の記事 949080 を参照してください。

サポートされていない .NET Framework ライブラリをアプリケーションで使用しているかどうかを検出するには、データベースで次のクエリを実行します。

SELECT name FROM sys.assemblies WHERE clr_name LIKE '%publickeytoken=b03f5f7f11d50a3a,%';

CLR ルーチン

CLR のユーザー定義関数、ユーザー定義集計、またはユーザー定義型 (UDT) 内で権限借用を使用すると、SQL Server 2008 にアップグレードした後に、アプリケーションがエラー 6522 で失敗する可能性があります。

次のシナリオは、SQL Server 2005 では成功しますが、SQL Server 2008 では失敗します。それぞれのシナリオに解決策があります。

  1. 権限借用を使用する CLR のユーザー定義関数、ユーザー定義集計、または UDT メソッドで、nvarchar(max)、varchar(max)、varbinary(max)、ntext、text、image のいずれかの型のパラメータまたは大きな UDT が使用されているが、メソッドに DataAccessKind.Read 属性が指定されていない。

    この問題を解決するには、DataAccessKind.Read 属性をメソッドに追加し、アセンブリを再コンパイルしたうえで、ルーチンとアセンブリを再配置します。

  2. CLR テーブル値関数で、権限借用を実行する Init メソッドが使用されている。

    この問題を解決するには、DataAccessKind.Read 属性をメソッドに追加し、アセンブリを再コンパイルしたうえで、ルーチンとアセンブリを再配置します。

  3. CLR テーブル値関数で、権限借用を実行する FillRow メソッドが使用されている。

    この問題を解決するには、FillRow メソッドから権限借用を削除します。外部リソースへのアクセスには FillRow メソッドを使用しないでください。代わりに Init メソッドから外部リソースにアクセスします。

動的管理ビュー

ビュー

説明

sys.dm_os_sys_info

cpu_ticks_in_ms 列と sqlserver_start_time_cpu_ticks 列を削除しました。

sys.dm_exec_query_resource_semaphores sys.dm_exec_query_memory_grants

SQL Server 2008 では、resource_semaphore_id 列は一意な ID ではありません。この変更は、クエリの実行のトラブルシューティングに影響する可能性があります。詳細については、「sys.dm_exec_query_resource_semaphores (Transact-SQL)」を参照してください。

エラーとイベント

機能

説明

ログイン エラー

SQL Server 2005 では、Windows 認証のみを使用するように構成されたサーバーに接続する際に SQL ログインを使用すると、エラー 18452 が返されます。SQL Server 2008 では、代わりに、エラー 18456 が返されます。

プラン表示

機能

説明

プラン表示の XML スキーマ

新しい SeekPredicateNew 要素はプラン表示の XML スキーマに追加され、囲み要素である xsd sequence (SqlPredicatesType) は <xsd:choice> アイテムに変換されます。プラン表示の XML には、1 つ以上の SeekPredicate 要素ではなく、1 つ以上の SeekPredicateNew 要素を表示することもできます。この 2 つの要素を同時に指定することはできません。旧バージョンとの互換性のために、SeekPredicate はプラン表示の XML スキーマに保持されていますが、SQL Server 2008 で作成されたクエリ プランには SeekPredicateNew 要素を含めることができます。ShowPlanXML/BatchSequence/Batch/Statements/StmtSimple/QueryPlan/RelOp/IndexScan/SeekPredicates ノードから SeekPredicate 子要素のみを取得するアプリケーションは、SeekPredicate 要素が存在しない場合、失敗する可能性があります。このノードの SeekPredicate 要素または SeekPredicateNew 要素のいずれかを取得するようにアプリケーションを書き直してください。詳細については、「パーティション テーブルとパーティション インデックスに対するクエリ処理の機能強化」を参照してください。

プラン表示の XML スキーマ

プラン表示の XML スキーマの ObjectType 複合型に、新しい IndexKind 属性が追加されます。SQL Server プランを SQL Server 2005 スキーマに対して厳密に検証するアプリケーションは失敗します。

Transact-SQL

機能

説明

ALTER_AUTHORIZATION_DATABASE DDL イベント

SQL Server 2005 では、DDL イベント ALTER_AUTHORIZATION_DATABASE が発生すると、データ定義言語 (DDL) 操作においてセキュリティ保護可能なエンティティの種類がオブジェクトの場合、このイベントの EVENTDATA xml の ObjectType 要素に値 'object' が返されます。SQL Server 2008 では、実際の種類 (たとえば 'table' や 'function') が返されます。

CONVERT

CONVERT 関数に無効なスタイルが渡されると、変換の種類がバイナリから文字、または文字からバイナリの場合にエラーが返されます。以前のバージョンの SQL Server では、バイナリから文字への変換および文字からバイナリへの変換の既定のスタイルに無効なスタイルが設定されます。

アセンブリに対する EXECUTE の GRANT/DENY/REVOKE

アセンブリに対する EXECUTE 権限の許可、拒否、および取り消しを行うことはできません。この権限を設定しても効果がなく、エラーが発生します。代わりに、アセンブリ メソッドを参照するストアド プロシージャまたは関数に対して EXECUTE 権限の許可、拒否、および取り消しを行ってください。

システム型に対する GRANT/DENY/REVOKE 権限

システム型に対する権限の許可、拒否、および取り消しを行うことはできません。以前のバージョンの SQL Server では、このステートメントは正常に実行されますが、効果はありません。SQL Server 2008 では、エラーが返されます。

OUTPUT 句

非決定的な動作を防ぐために、ビューまたはインライン テーブル値関数から返される列が次のいずれかの方法で定義されている場合、OUTPUT 句ではその列を参照できません。

  • サブクエリ

  • ユーザー データやシステム データにアクセスするユーザー定義関数、またはそのようなアクセスを行うと想定されるユーザー定義関数

  • ユーザー データまたはシステム データにアクセスするユーザー定義関数を定義に含む計算列

SQL Server が OUTPUT 句でそのような列を検出すると、エラー 4186 が発生します。詳細については、「MSSQLSERVER_4186」を参照してください。

OUTPUT INTO 句

OUTPUT INTO 句の対象のテーブルに有効なトリガを指定することはできません。

precompute rank サーバー レベル オプション

このオプションは、SQL Server 2008 ではサポートされていません。この機能を現在使用しているアプリケーションはできるだけ早く変更してください。

READPAST テーブル ヒント

READ_COMMITTED_SNAPSHOT データベース オプションが ON に設定され、次のいずれかの条件に該当する場合、READPAST テーブル ヒントは指定できません。

  • セッションのトランザクション分離レベルが READ COMMITTED の場合

  • READCOMMITTED テーブル ヒントもクエリで指定されている場合

このような場合に READPAST ヒントを指定するには、READCOMMITTED テーブル ヒントがある場合は削除し、クエリに READCOMMITTEDLOCK テーブル ヒントを含めます。

sp_helpuser

sp_helpuser ストアド プロシージャの結果セットに返される次の列名が変更されました。

以前の列名新しい列名
GroupNameRoleName
Group_nameRole_name
Group_idRole_id
Users_in_groupUsers_in_role

透過的なデータ暗号化

透過的なデータ暗号化 (TDE) は I/O レベルで実行されます。そのため、ページ構造は、メモリ内では暗号化されず、ページがディスクに書き込まれるときだけ暗号化されます。データベース ファイルとログ ファイルの両方が暗号化されます。通常の SQL Server メカニズムを使用せずに (たとえば、データ ファイルやログ ファイルを直接スキャンして) ページにアクセスするサードパーティのアプリケーションは、ファイル内のデータが暗号化されているため、データベースで TDE を使用すると失敗します。このようなアプリケーションでは、Window Cryptographic API を使用すると、SQL Server 以外のデータの暗号化を解除するためのソリューションを開発できます。

XQuery

機能

説明

Datetime のサポート

SQL Server 2005 では、xs:time、xs:date、および xs:dateTime の各データ型がタイム ゾーンをサポートしていません。タイム ゾーン データは UTC タイム ゾーンにマップされます。SQL Server 2008 では、標準に準拠した動作を提供するため、次のように変更されました。

  • タイム ゾーンを使用しない値の検証

  • タイム ゾーン指定の有無の保持

  • 内部ストレージ表現の変更

  • 格納された値の解決を増加

  • 負の年の使用禁止

アプリケーションと XQuery 式を変更して、新しい型の値を反映してください。詳細については、「time、date、datetime2、および datetimeoffset データ型での XML の使用」を参照してください。

XQuery 式と Xpath 式

SQL Server 2005 の XQuery 式または XPath 式では、コロン (:) で始まるステップが許可されます。たとえば、次のステートメントのパス式には、コロンで始まる名前テスト (CTR02) が含まれています。

SELECT FileContext.query('for n$ in //CTR return <C>{data )(n$/:CTR02)} </C>) AS Files FROM dbo.MyTable;

この使用法は XML 標準に準拠していないため、SQL Server 2008 では許可されません。エラー 9341 が返されます。先頭のコロンを削除するか、名前テストにプレフィックスを指定してください (n$/CTR02 や n$/p1:CTR02 など)。

変更履歴

変更内容

XQuery 式と Xpath 式に関する重大な変更を追加しました。