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

更新 : 2008 年 11 月 17 日

ここでは、以前のバージョンの SQL Server ベースのアプリケーションに影響を及ぼす可能性がある、Microsoft SQL Server 2005 のデータベース エンジンの重大な変更について説明します。

クライアント/サーバー接続

機能 説明

Banyan VINES Sequenced Packet Protocol (SPP)、Multiprotocol、AppleTalk、または NWLink IPX/SPX ネットワーク プロトコル

SQL Server 2005 では、Banyan VINES Sequenced Packet Protocol (SPP)、Multiprotocol、AppleTalk、または NWLink IPX/SPX ネットワーク プロトコルはサポートされていません。SQL Server 2005 に接続するには、クライアント アプリケーションでサポートされているプロトコルを使用する必要があります。サポートされていないプロトコルのいずれかを使用するように別名がセットアップされている場合は、サポートされるプロトコルのいずれかを使用するように別名を変更する必要があります。

RPC に NETWORK=DBMSRPCN、Appletalk に NETWORK=DBMSADSN、または Banyan VINES property に NETWORK=DBMSVINN を指定するか、SPX に spx:server\instance、Banyan VINES に bv:server、AppleTalk に adsp:server、Multiprotocol に rpc:server などの明示的なプレフィックスを使用することによって、これらのサポートされていないプロトコルのいずれかを使用または読み込むようにアプリケーションの接続文字列を指定している場合は、サポートされるプロトコルのいずれかを使用するようにアプリケーションを変更する必要があります。

詳細については、「ネットワーク プロトコルの選択」を参照してください。

MDAC

MDAC 2.6 以前のバージョンの MDAC は、名前付きインスタンスをサポートしていません。アプリケーションから名前付きインスタンスに接続するには、現在のバージョンの MDAC にアップグレードする必要があります。

Winsock プロキシ

Winsock プロキシは、SQL Server のツールを使用して構成することはできません。Winsock プロキシの構成方法については、ご使用のプロキシ サーバーのマニュアルを参照してください。

構成オプション

機能

説明

AUTO_UPDATE_STATISTICS

データベースをアップグレードする前に、AUTO_UPDATE_STATISTICS をオンに設定します。設定しないと、データベースの統計は SQL Server 2005 へのアップグレードの一部として更新されません。以前のバージョンの SQL Server の統計に依存すると、クエリ プランが最適にならない場合があります。AUTO_UPDATE_STATISTICS をオンに設定することにより、すべての統計はそれらが初めて参照されたときに更新されます。統計を更新すると、クエリ実行時に、より最適なクエリ プランが選択される確率が高くなります。

ms143179.note(ja-jp,SQL.90).gifメモ :

場合によっては、統計を更新するプロセスによって、AUTO_UPDATE_STATISTICS をオンに設定してから初めて統計が参照されるときのクエリに際して、サーバーのパフォーマンスが影響を受けることがあります。

ALTER DATABASE ステートメントを使用して AUTO_UPDATE_STATISTICS データベースの SET オプションをオンに設定するか、または、sp_updatestats を実行して、データベースの統計を更新します。

max server memory オプション

SQL Server 2000 では、システムの物理メモリがあれば、SQL Server のバッファ プールが、max server memory オプションで指定されている制限を越えることができました。SQL Server 2005 では、バッファ プールが max server memory の値を超えることができません。この制限値に達すると、"システム メモリが不足しています" というエラーが発生し、クエリに失敗します。

エラーが発生し、max server memory オプションを設定している場合は、オプションの値を大きくするか、値を既定値 2147483647 にリセットします。詳細については、「サーバー メモリ オプション」を参照してください。

query governor cost limit オプション

sp_configure の SET GOVERNOR_QUERY_COST_LIMIT または query governor cost limit オプションを適用すると、以前のバージョンの SQL Server で実行されたクエリが SQL Server 2005 で実行されない可能性があります。この動作は、クエリ コスト モデリングの変更によるものです。

接続またはサーバー インスタンスの query governor cost limit の設定を適切な値に更新するか、クエリの実行可能時間に制限がないことを指定するためにその設定を 0 に設定してください。

データベース、データ、およびログのファイル

機能 説明

圧縮ドライブ

SQL Server 2005 では、圧縮ドライブ上にデータベースを作成できません。圧縮ドライブ上のデータベースをアップグレードすることもできません。SQL Server 2005 をインストールするとき、システム データベースの保存場所として圧縮されていないドライブを選択します。また、アップグレード対象のデータベースが、圧縮ドライブに格納されていないことを確認してください。ただし、データベースをアップグレードした後は、読み取り専用データベースと読み取り専用セカンダリ ファイル グループを NTFS 圧縮ファイル システムに配置できます。

データ ファイル

次の変更に対処するために、データ ファイルに追加のディスク領域が必要です。

  • 追加のシステム メタデータが、データベース オブジェクトおよびユーザー権限の各ユーザー データベースの PRIMARY ファイル グループに作成および保持されます。たとえば、以前のバージョンの SQL Server では、権限を与えるユーザーまたは権限が与えられるユーザーに関連する権限は、ビットマップとして 1 つの行に格納されます。SQL Server 2005 では、そのビットマップが複数の行に拡張されます。
  • textntext、または image のデータ型として定義されるラージ オブジェクト (LOB) 列には、列ごとに 40 バイトのディスク領域を追加する必要があります。この 1 回限りの領域増加は、各 LOB 列の初回更新時に発生します。
  • フルテキストのドキュメント ID (DOCID) マップは、フルテキスト カタログではなく、データ ファイルに格納されます。

アップグレード中およびその後の作成操作時のリソースのサイズ増加に対応するには、SQL Server 2005 にアップグレードする前に、すべてのユーザー データ ファイルに対して自動拡張をオンに設定しておくことをお勧めします。アップグレードを完了し、作業負荷をテストした後、必要に応じて自動拡張をオフに設定するか、または FILEGROWTH 増分値を調整してください。詳細については、「ALTER DATABASE (Transact-SQL)」を参照してください。

データベース互換性モード

以前のバージョンの SQL Server から SQL Server 2005 にデータベースをアップグレードした場合、そのデータベースには既存の互換性レベルがそのまま設定されます。アップグレード後に互換性モードを 90 に変更すると、互換性モードの相違点がアプリケーションに影響することがあります。これらの相違点の詳細については、「sp_dbcmptlevel (Transact-SQL)」を参照してください。

データベース ID 32767

SQL Server 2005 では、このデータベース ID が予約されています。データベースをデタッチした後でアップグレードします。

ファイル グループ

SQL Server 2005 にアップグレードする前に、SQL Server のインスタンスのすべてのデータベースに含まれるファイル グループを READ_WRITE に設定する必要があります。ファイル グループを READ_WRITE に設定するには、ALTER DATABASE を使用します。

ログ ファイル

SQL Server 2005 では、トランザクション ログ ファイルには追加のディスク領域が必要です。クラッシュ復旧の元に戻すフェーズの間、SQL Server 2005 を使用してデータベースにアクセスできます。これは、クラッシュの発生時にコミットされなかったトランザクションに、クラッシュ前に保持されたロックが必要であるためです。トランザクションのロールバック中に、トランザクションのロックによってユーザーによる介入からトランザクションが保護されます。このロックに関する追加情報は、トランザクション ログに保持されます。

アップグレード中およびその後の作成操作時のリソースのサイズ増加に対応するには、SQL Server 2005 にアップグレードする前に、すべてのユーザー ログ ファイルに対して自動拡張をオンに設定しておくことをお勧めします。アップグレードを完了し、作業負荷をテストした後、必要に応じて自動拡張をオフに設定するか、または FILEGROWTH 増分値を調整してください。詳細については、「ALTER DATABASE (Transact-SQL)」を参照してください。

model データベース

SQL Server 2005 では、model データベースは次のように変更されています。

  • 最小サイズが拡大されました。
  • 互換性レベルが 90 に設定されています。
  • PAGE_VERIFY データベース オプションが CHECKSUM に設定されています。

tempdb データベース

SQL Server 2005 では、tempdb データとログ ファイルに追加のディスク領域が必要です。アップグレード中やその後の実際の運用時にリソースがサイズの増加に対応できるように、SQL Server 2005 にアップグレードする前に、すべての tempdb データ ファイルとログ ファイルの自動拡張をオンに設定しておくことをお勧めします。アップグレードを完了し、作業負荷をテストした後、必要に応じて自動拡張をオフに設定するか、または FILEGROWTH 増分値を調整してください。

詳細については、「tempdb のディスク領域の不足に関するトラブルシューティング」を参照してください。

機能

機能

説明

拡張ストアド プロシージャ

DLL 名の完全なパスを使用せずに登録されていた拡張ストアド プロシージャは、SQL Server 2005 にアップグレードした後に機能しない可能性があります。アップグレード プロセス中に古い BINN ディレクトリが新しいパスに追加されないためです。SQL Server によって拡張ストアド プロシージャを見つけることができなくなる可能性があります。

SQL Server 2005 にアップグレードする前に、登録に完全なパス名を使用していない各拡張ストアド プロシージャに対して、次の手順を実行します。

  1. 拡張ストアド プロシージャを削除するには、sp_dropextendedproc を実行します。
  2. 完全なパス名で拡張ストアド プロシージャを登録するには、sp_addextendedproc を実行します。

ログ配布

SQL Server の以前のバージョンのログ配布は SQL Server 2005 のログ配布と互換性がなく、直接アップグレードできません。SQL Server 2005 にアップグレードした後、SQL Server Management Studio またはストアド プロシージャを使用してログ配布を再構成します。詳細については、「SQL Server 2000 のログ配布構成の SQL Server 2005 への移行」を参照してください。

osql ユーティリティ

osql ユーティリティは、ED コマンドと !! コマンドをサポートしていません。ED コマンドと !! コマンドの参照をスクリプトから削除してください。ED コマンドと !! コマンドを使用する場合は、sqlcmd ユーティリティを使用してください。

SQL-DMO WMI プロバイダ

SQL-DMO WMI プロバイダは廃止され、使用できなくなりました。

SQL Mail

SQL Server では、SQL Server 7.0 または SQL Server 2000 からの SQL Mail アップグレードをサポートしていますが、SQL Server 2005 では、メール クライアントとして Microsoft Outlook 2002 以降のバージョンが必要です。

ms143179.note(ja-jp,SQL.90).gifメモ :

この機能は、将来のバージョンの Microsoft SQL Server では削除される予定です。新規の開発作業ではこの機能を使用しないようにし、現在この機能を使用しているアプリケーションは修正することを検討してください。SQL Server 2005 からメールを送信するには、データベース メールを使用してください。

SQL Mail

SQL Server 認証を使用して接続しているクライアントが添付ファイルを含む SQL Mail を送信しようとすると、SQL Server では適切なセキュリティ コンテキストが設定されず、エラーが返されます。この問題を避けるには、Windows 認証を使用してください。

SQL 名前空間 API (SQL-NS)

SQL 名前空間 API (SQL-NS) は廃止され、使用できなくなりました。

トレース フラグ

SQL Server 2000 では、セッション A で設定されたトレース フラグは、既に存在するセッション B では自動的に有効になりません。代わりに、セッション B に初めてトレース フラグが設定された後にのみ有効になります。この動作は SQL Server 2000 では非決定的であり、SQL Server 2005 では決定的です。SQL Server 2005 では、セッション A で設定されたグローバル トレース フラグは、他の同時セッションに直ちに設定されます。

また、SQL Server 2005 の場合、DBCC TRACEON ステートメントに引数を追加することによって、ローカル、グローバルいずれでもトレース フラグを指定できます。2 番目の引数を指定しない場合の既定値は、SQL Server 2005 ではローカルです。既定値がグローバルである SQL Server 2000 とは異なります。

詳細については、「トレース フラグ (Transact-SQL)」を参照してください。

トレース フラグ

SQL Server 2000 のトレース フラグの一部は SQL Server 2005 にありません。また、SQL Server 2005 では機能が異なるトレース フラグもあります。すべてのトレース フラグを無効にした後、SQL Server 2005 にアップグレードしてください。アップグレード後に、トレース フラグの機能が変わっていないことを確認します。さらに、トレース フラグが必要であることを確認した上で、トレース フラグを再度有効にします。

トリガ

SQL Server 2005 では、DML トリガ内で inserted テーブルおよび deleted テーブルに対して CREATE INDEX などのデータ定義言語 (DDL) ステートメントを実行できません。SQL Server の以前のバージョンでは、一部の DDL ステートメントを inserted テーブルおよび deleted テーブルに対して実行できました。詳細については、「inserted テーブルと deleted テーブルの使用」を参照してください。

重複するインデックス名

SQL Server 2005 では、テーブルまたはビューの重複するインデックス名は許可されません。インデックス名を変更して重複を解消した後、アップグレードしてください。

  1. 次のクエリを実行して重複したインデックスを探します。

    SELECT DISTINCT OBJECT_NAME(o.id), name
    FROM sysindexes as o
    WHERE EXISTS 
        (SELECT name FROM sysindexes  as i
          WHERE i.id = o.id
          AND i.name = o.name and i.indid < o.indid);
    
  2. sp_rename を使用して、インデックス名のいずれかを変更します。インデックス名が同じであるため、どのインデックスの名前が変更されるか判断できません。このステップによってインデックスを区別できます。

    EXEC sp_rename N'table_name.index_name', N'new_index_name, N'INDEX'
    
  3. 次のクエリを実行して名前が変更されたインデックスを確認します。このクエリは、指定されたテーブルまたはビューのすべてのインデックス (キー列名を含む) を返します。

    SELECT i.name AS IndexName, c.name AS ColumnName, ik.colid, ik.keyno
    FROM sysindexes i
    JOIN sysindexkeys ik ON i.id = ik.id and i.indid = ik.indid 
    JOIN syscolumns c ON c.id = ik.id and ik.colid = c.colid
    WHERE i.id = OBJECT_ID('table_or_view_name')
    
  4. 必要に応じて、sp_rename を再度使用してインデックス名を修正します。

オブジェクト名

SQL Server 2005 では、0xFFFF 文字をオブジェクト名に使用できません。オブジェクト名にこの Unicode 文字が含まれていると、データベースの互換性レベルが 90 のときにアクセスできません。この文字を含むオブジェクトの名前を変更してください。

テーブル変数と列の照合順序の一致

SQL Server 2000 では、テーブル変数で定義された列は、暗黙的に tempdb データベースの照合順序に変換されます。SQL Server 2005 では、テーブル変数で定義された列は、暗黙的に現在のデータベースの照合順序に変換されます。SQL Server 2000 の動作に依存するクエリは、返される行の数や順序が異なるなど、予期しない結果を返す場合があります。

たとえば、次の SELECT ステートメントの WHERE 句での列 c1c2 の等価比較では、tempdb の照合順序ではなく TestDB データベースの照合順序が使用された場合、返される行数が多くなったり少なくなったりする可能性があります。たとえば、値 'Name' と 'name' は、大文字と小文字が区別されない照合順序の場合は等価と評価されますが、大文字と小文字が区別される照合順序の場合は等価と評価されません。

CREATE DATABASE TestDB COLLATE Estonian_CS_AI;
GO
USE TestDB;
DECLARE @TempTable table (c1 varchar(10), c2 varchar(10);
SELECT * FROM @TempTable WHERE c1 = c2;

テーブル変数で現在のデータベースの照合順序以外の照合順序を使用するには、DECLARE ステートメントの列の定義か、列を参照するクエリで照合順序を指定します。次の例は、両方の方法を示します。

USE TestDB;
DECLARE @TempTable table (c1 varchar(10)COLLATE Latin1_General_CS_AS, c2 varchar(10)COLLATE Latin1_General_CS_AS);
SELECT * FROM @TempTable WHERE c1 = c2;
GO
-- or

DECLARE @TempTable table (c1 varchar(10), c2 varchar(10));
SELECT * FROM @TempTable WHERE c1 = c2 COLLATE Latin1_General_CS_AS;
GO

インデックス付きビュー

機能 説明

関数の決定性

SQL Server 2005 では、次の関数式は非決定的であると判断されるため、インデックス付きビューの作成に影響する可能性があります。

  • datetime および smalldatetime に暗黙的に変換される文字列リテラルへの参照
  • 照合順序間の非 Unicode 文字データの暗黙的な変換

SQL Server 2005 では、互換性レベルを 80 以下に設定しない限り、文字列の datetime または smalldatetime への暗黙的な変換を含む式は、非決定的であると判断されます。これは、式の結果がサーバー セッションの LANGUAGE および DATEFORMAT の設定に応じて異なるためです。たとえば、文字列 listopad はさまざまな月をさまざまな言語で表すので、CONVERT (datetime, '30 listopad 1996', 113) 式の結果は LANGUAGE 設定によって異なります。同様に、式 DATEADD(mm,3,'2000-12-01') の場合、SQL Server では DATEFORMAT の設定に基づいて、文字列 '2000-12-01' が解釈されます。

照合順序間で行われる Unicode 以外の文字データの暗黙的な変換も、互換性レベルが 80 以下の場合を除いて、非決定的であると見なされます。

互換性レベル 90 のデータベースでは、これらの式を含むビューにおけるインデックスの作成は許可されていません。アップグレードされたデータベースのそれらの式を含む既存のビューを保持することはできますが、クエリ オプティマイザでは、80 または 90 の互換性レベルのクエリ プランで既存のビューを考慮しません。互換性レベルの設定については、「sp_dbcmptlevel (Transact-SQL)」を参照してください。

SQL Server 2005 のインデックス付きビューの定義では、決定的な日付形式を使用することによって、リテラルを適切なデータ型へ明示的に変換する必要があります。決定的な日付形式の一覧については、「CAST および CONVERT (Transact-SQL)」を参照してください。

SQL Server 2005 にアップグレードされている既存のインデックス付きビューで、暗黙的な文字列から日付への変換を使用する場合は、インデックス付きビューが破損しないように、ご使用のデータベースおよびアプリケーションで LANGUAGE および DATEFORMAT の設定が確実に一貫性を保持する必要があります。

IGNORE_DUP_KEY

SQL Server 2005 でビューに一意のクラスタ化インデックスを作成する場合は、IGNORE_DUP_KEY オプションを OFF に設定する必要があります。これが既定の設定です。IGNORE_DUP_KEY をオンに設定すると、インデックス付きビューが破損する可能性があります。

ビューのクラスタ化インデックスを削除し、IGNORE_DUP_KEY オプションを指定せずに再作成します。

クエリ ヒント

インデックス付きビューの定義のクエリ ヒントは、互換性レベル 80 で無視されます。これにより、一部のアプリケーションの動作が 80 と 90 の互換性レベル間で異なる可能性があります。詳細については、「インデックス付きビューのデザイン」、「インデックス付きビューの作成」、および「クエリ ヒント (Transact-SQL)」を参照してください。

セキュリティ

機能 説明

ログイン名

次に示す固定サーバー ロール名は SQL Server 2005 で予約されているため、ユーザー定義ログイン名として使用できません。

  • sysadmin
  • serveradmin
  • setupadmin
  • securityadmin
  • processadmin
  • dbcreator
  • diskadmin
  • bulkadmin

SQL Server 2005 にアップグレードする前に、次の手順を行ってください。

  1. 次のステートメントを実行することによって、ログインのセキュリティ識別子 (SID) を記録します。

    SELECT name, sid 
    FROM master.dbo.syslogins 
    WHERE name IN('sysadmin', 'serveradmin','setupadmin',
     'securityadmin','processadmin', 'dbcreator','diskadmin',
     'bulkadmin')
  2. ログイン名を削除します。
  3. 新しいログイン名を作成するには、sp_addlogin システム プロシージャを使用します。対応する各ログイン名の @sid パラメータに、手順 1. で返された SID を指定します。

ログイン セキュリティ識別子 (SID)

SQL Server 2005 では、重複するセキュリティ識別子 (SID) は許可されません。ログインのいずれか、および関連付けられているユーザーを削除した後、アップグレードします。

リモート ログイン マッピング

以前のバージョンの SQL Server では、sp_remoteoption システム ストアド プロシージャを使用することによって、SQL Server のリモート インスタンスからのログインを trusted とマークできます。SQL Server 2005 では、リモート ログインをこのようにラベリングできません。したがって、SQL Server 2005 にアップグレードした後、リモート ログインは trusted とマークされません。

リモート ログインをセットアップおよび管理する場合は、リンク サーバーとリンク サーバー ストアド プロシージャを使用してください。詳細については、「サーバーのリンク」を参照してください。

SQL Server 6.5 ログイン

SQL Server 6.5 で、現在はサポートされていない形式でパスワードのハッシュが保存されました。古いパスワードは、SQL Server 2005 に直接アップグレードできません。

このログインを有効にするには、パスワードをリセットする必要があります。パスワードをリセットするには、ALTER LOGIN を使用します。

ALTER LOGIN <login name> WITH PASSWORD = '<new password>' MUST_CHANGE

新しいパスワードがシステムのパスワード複雑性ポリシーを満たしているか検証されます。ポリシーのチェックが無効になっている場合は検証が行われません。複雑なパスワードを使用し、ポリシーのチェックを無効にしないことをお勧めします。MUST_CHANGE オプションを使用すると、新しいパスワードの選択がユーザーに強制されます。これは必須ではありませんが、推奨されています。

次のクエリを使用すると、休止している SQL Server 6.5 ログインを特定できます。

SELECT * FROM sysxlogins WHERE (xstatus & 2048) = 2048;
GO

sys ユーザー名

sys という名前は SQL Server 2005 で予約されており、ユーザー名として使用できません。このユーザーの名前を変更した後、SQL Server 2005 にアップグレードしてください。ユーザーの名前が変更されていないと、アップグレード プロセス後にデータベースは問題のある状態になり、データベースがオンラインになるまで使用できません。

アップグレード前の手順

SQL Server 2005 にアップグレードする前に、ユーザー sys が含まれている各データベースで次の操作を行います。

  1. 新しいユーザーを作成します。
  2. 次のステートメントを使用して、ユーザー sys が付与している権限とユーザー sys に付与されている権限をすべて表示します。

    -- Return permissions granted by user sys.
    SELECT * FROM sysprotects WHERE grantor = USER_ID('sys')
    -- Return permissions granted to user sys.
    SELECT * FROM sysprotects WHERE uid = USER_ID('sys')
  3. sys が所有するすべてのオブジェクトの所有権を新しいユーザーに転送するには、sp_changeobjectowner を使用します。
  4. ユーザー sys を削除します。
  5. 手順 2. でキャプチャされた元の権限を復元するには、GRANT ステートメントの AS new_user 句を使用します。
  6. 新しいユーザーを参照するようにスクリプトを修正します。

アップグレード後の手順

アップグレード前にユーザー sys の名前が変更されていない場合は、次の操作を行います。

  1. ステートメント ALTER DATABASE db_name SET ONLINE を実行します。データベースは SINGLE_USER モードになります。
  2. 「アップグレード前の手順」のすべての手順を行います。
  3. ステートメント ALTER DATABASE db_name SET MULTI_USER を実行します。

システム オブジェクトとメタデータ

機能 説明

INFORMATION_SCHEMA.COLUMNS

SQL Server 2005 の場合、INFORMATION_SCHEMA.COLUMNS ビューの ORDINAL_POSITION 列には、COLUMNS_UPDATED 関数から返されるビット パターンとの互換性がありません。

COLUMNS_UPDATED と対応するビット パターンを取得するには、次の例に示すように、INFORMATION_SCHEMA.COLUMNS ビューをクエリするときに COLUMNPROPERTY システム関数の ColumnID プロパティを参照します。

SELECT TABLE_NAME, COLUMN_NAME,
    COLUMNPROPERTY(OBJECT_ID(TABLE_SCHEMA + '.' + TABLE_NAME),
    COLUMN_NAME, 'ColumnID') AS COLUMN_ID
FROM AdventureWorks.INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'Contact';

INFORMATION_SCHEMA.SCHEMATA

以前のバージョンの SQL Server では、INFORMATION_SCHEMA.SCHEMATA ビューは、SQL Server のインスタンスにあるすべてのデータベースを返しました。SQL Server 2005 では、このビューはデータベース内のすべてのスキーマを返します。この動作は SQL 標準に準拠しています。詳細については、「SCHEMATA (Transact-SQL)」を参照してください。

値 '%SCHEMA' に一致する INFORMATION_SCHEMA 列名

以前のバージョンの SQL Server では、値 '%SCHEMA' と一致する INFORMATION_SCHEMA 列名はユーザーの名前を返しました。SQL Server 2005 では、これらの列はスキーマ名を返します。データベースを SQL Server 2005 にアップグレードした場合、スキーマ名は常にユーザー名と同じになり、これらの列を参照するアプリケーションが失敗することはありません。ただし、データベースに SQL Server 2005 ユーザー スキーマ分離機能を実装した場合は、想定されるデータがスキーマ名ではなくユーザー名であると、アプリケーションが失敗する可能性があります。

詳細については、「ユーザーとスキーマの分離」を参照してください。

sp_helptrigger

SQL Server 2005 では、sp_helptrigger システム ストアド プロシージャが返す結果セットに、最後の列として trigger_schema が追加されます。アプリケーションで sp_helptrigger の使用を確認してください。また、追加列に対応するようにアプリケーションを変更しなければならない場合があります。代わりに、sys.triggers カタログ ビューを使用できます。

syslockinfo および sp_lock

SQL Server 2000 では、syslockinfo の rsc_objid 列および rsc_indid 列と、sp_lock の objid 列および indid 列は、常にオブジェクト ID およびインデックス ID を返しました。SQL Server 2005 では、値 0 が返される場合があります。

SQL Server 2000 では、syslockinfo と sp_lock が返す行数は、1 つのトランザクションで特定のロック リソースに対して最大 2 行でした。SQL Server 2005 では、ロックのパーティション分割が有効である場合、1 つのトランザクションで実行している同じリソースに対して複数行が返されることがあります。最大で N + 1 行まで返すことができます (N は CPU 数を表します)。SQL Server 2005 ではさらに、同じリソースに対する GRANTED 要求および WAITING 要求を表示できます。SQL Server 2000 では、同じリソースの場合は表示できませんでした。詳細については、「sp_lock (Transact-SQL)」および「sys.syslockinfo (Transact-SQL)」を参照してください。

システム オブジェクト名とシステム型名の照合順序

以前のバージョンの SQL Server では、システム オブジェクト名とシステム型名が、master データベースの照合順序と照合されていました。SQL Server 2005 では、システム オブジェクト名とシステム型名が現在のデータベースの照合順序に自動的にキャストされます。スクリプト内やアプリケーション内でこれらのオブジェクトへの参照がカタログの表示と異なり、現在のデータベースの照合順序で大文字と小文字が区別される場合、スクリプトやアプリケーションが失敗する可能性があります。たとえば、現在のデータベースが大文字と小文字を区別する照合順序の場合、ステートメント EXEC SP_heLP は失敗します。

システム オブジェクトの変更

SQL Server 2005 では、システム カタログの直接更新は許可されません。システム カタログを直接更新しようとすると、次のエラーが生成されます。

"サーバー: メッセージ 259、レベル 16、状態 1、行 1"

"システム カタログへのアドホック更新は許可されません。"

ドキュメントに記載されている公式の API を使用するように SQL スクリプトを変更してください。たとえば、sysdatabases システム テーブルで UPDATE ステートメントを実行するのではなく、ALTER DATABASE database_name SET EMERGENCY を使用してください。

システム オブジェクトの削除

DROP TABLE、DROP PROCEDURE、sp_dropextendedproc などのステートメントを使用してシステム オブジェクトを削除することはできません。これらのオブジェクトは読み取り専用の Resource Database データベースに配置されています。

アプリケーションからシステム オブジェクトの削除を試行するすべてのステートメントを削除します。システム オブジェクトに対する EXECUTE 権限を禁止または拒否するように、アプリケーションを変更します。または、SQL Server 2005 のセキュリティ構成ツールのいずれかを使用して、システム オブジェクトの一部を無効にすることもできます。たとえば、セキュリティ構成ツールを使用して xp_cmdshell 拡張ストアド プロシージャを無効または有効にできます。

sysperfinfo

SQL Server 2005 では、sysperfinfo は cntr_value 列の bigint 値を返します。アプリケーションで sysperfinfo を使用している場合は、cntr_value 列の bigint 値を確実に処理できるように修正してください。

SQL Server 2005 では、sysperfinfo は互換性ビューです。代わりに、sys.dm_os_performance_counters 動的管理ビューを使用する必要があります。

検索基準に 'dbo' を使用してクエリされるシステム テーブル

以前のバージョンの SQL Server では、システム オブジェクトは dbo が所有し、master データベースに存在していました。SQL Server 2005 では、システム オブジェクトは sys が所有し、論理的には各データベースに表示されます。システム テーブルをクエリし、検索基準にユーザー dbo を指定するステートメントは、失敗します。

Transact-SQL

機能 説明

@@VERSION

SQL Server 2005 では、SQL Server 2000 よりも詳細な情報が major.minor.build.incremental-build の形式で返されます。

CREATE STATISTICS

SQL Server 2005 では、CREATE STATISTICS ステートメントにおける WITH ROWS の指定はサポートされません。WITH と ROWS の間に SAMPLE number を指定するか、ドキュメントに記載されている構文に従っているその他のオプションを指定することによって、WITH ROWS を含む CREATE STATISTICS ステートメントを変更してください。

DISK INIT

DISK INIT ステートメントは、以前のバージョンの SQL Server でデータベースまたはトランザクション ログ デバイスを作成するために使用されていました。SQL Server 2005 では、このステートメントが削除されています。このステートメントが使用されているすべての箇所を、同等の CREATE DATABASE ステートメントまたは ALTER DATABASE ステートメントに置き換える必要があります。

INSERT INTO...SELECT ステートメント内の UNION

UNION 演算子が INSERT ステートメント内にある場合、SQL Server 2005 では各 UNION 演算のデータ型がデータ型変換ルールに基づいて個別にキャストされます。次に、UNION 演算の最終結果のデータ型が INSERT 演算の対象となるテーブルの対応する列にキャストされます。このように動作が変更されたため、アプリケーションでデータ型キャスト エラーが発生する可能性があります。

次の例は、データ型キャスト エラーを示しています。互換性レベル 80 以前では、最初の SELECT ステートメントの整数定数 1 が列 ReturnedValue のデータ型に直接キャストされます。これは varchar(255) です。互換性レベル 90 では、UNION 結果セットのデータ型が決定された後、列にキャストが行われます。最初の SELECT ステートメントの 2 番目の列の場合は、データ型が int に決定されます。2 番目の SELECT ステートメントの 2 番目の列では、データ型が varchar(4) に決定されます。int データ型の方が varchar(4) データ型よりも優先順位が高いため、UNION 結果セットのデータ型が決定されると、値 testint データ型にキャストされ、データ型変換エラーが発生します。

CREATE TABLE #test(ReturnedName varchar(255) NOT NULL,
  ReturnedValue varchar(255) NULL)
INSERT INTO #test 
SELECT 'col1', 1
UNION ALL
SELECT 'test', 'test'
DROP TABLE #test

UPDATETEXT

SQL Server 2005 では、同じテキスト ポインタの使用による同じバイナリ ラージ オブジェクト (BLOB) の読み取りおよび書き込みを実行する UPDATETEXT ステートメントはサポートされません。BLOB を一時テーブルまたはテーブル変数にコピーしてから、その値を元の列に再度割り当ててください。

テーブル ヒント使用時の WITH キーワード

SQL Server 2005 では、例外がいくつかありますが、テーブル ヒントは WITH キーワードを使用して指定された場合のみクエリの FROM 句でサポートされます。

詳細については、「FROM (Transact-SQL)」および「テーブル ヒント (Transact-SQL)」を参照してください。

ビュー定義の ORDER BY

SQL Server 2005 では、ビュー定義の ORDER BY 句は、TOP 句によって返される行を特定する場合にのみ使用されます。クエリ自体にも ORDER BY を指定しない限り、ビューをクエリしたときに、ORDER BY 句で順序どおりの結果が得られるかどうかは保証されません。

ロック ヒントの UPDATE

SQL Server 2000 では、次の両方の条件が満たされる場合、UPDATE ステートメント内でロック ヒントの競合がチェックされませんでした。

  • FROM 句で使用されているテーブルが別名である。
  • 別名を使用せずに、UPDATE ステートメントの対象として同じテーブルが参照されている。

以前のバージョンの SQL Server では、FROM 句で指定されたロック ヒントが無視され、ヒントが競合する場合もエラーが発行されませんでした。SQL Server 2005 では、同じ条件下でロック ヒントが競合する場合には、エラーが返されます。

XML

機能 説明

OPENXML

MSXML の変更により、OPENXML は非整数位置述語をサポートしなくなりました。SQL Server 2005 では、MSXML 3.0 が OPENXML クエリ内で使用される XPath 式の処理に使用する基本エンジンとなっています。MSXML 3.0 には適合性がより高い XPath 1.0 エンジンが備わっており、このエンジンでは、位置述語における非整数値のセマンティックが変更されています。

たとえば、XPath 式 a[5.1] は、5 番目の <a> 要素を返すのではなく、要素を何も返しません。これを修正するには、丸められた値を直接使用します。たとえば、前の例を a[5] に修正します。

OPENXML XPath 式

MSXML 3.0 には、より精密な XPath 1.0 エンジンがあります。これにより、以下の関数のサポートが削除されています。

  • format-number()
  • formatNumber()
  • current()
  • element-available()
  • function-available()
  • system-property()

format-number() および formatNumber() については Transact-SQL を使用できます。その他のサポートされていない関数については、直接的な対応策はありません。

ユーザー定義型 xml

SQL Server 2005 では、xml はシステム型として予約されています。アップグレードの前または後に、sp_rename を使用して型の名前を変更し、新しい型名を処理するようにアプリケーションを変更してください。

参照

関連項目

SQL Server 2005 におけるデータベース エンジン機能の動作の変更
SQL Server 2005 データベース エンジンの非推奨機能
SQL Server 2005 で廃止されたデータベース エンジンの機能

その他の技術情報

SQL Server 2005 データベース エンジンの旧バージョンとの互換性
sp_dbcmptlevel (Transact-SQL)

ヘルプおよび情報

SQL Server 2005 の参考資料の入手

変更履歴

リリース 履歴

2008 年 11 月 17 日

追加内容 :
  • 機能のセクションに、テーブル変数における列の照合順序の一致について項目を追加しました。

2006 年 4 月 14 日

追加内容 :
  • Transact-SQL のセクションに、ビュー定義で ORDER BY を使用する方法について項目を追加しました。
  • Transact-SQL のセクションに、UPDATE でロック ヒントを使用する方法について項目を追加しました。