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

更新 : 2006 年 7 月 17 日

ここでは、以前のバージョンの SQL Server から変更された Microsoft SQL Server 2005 のデータベース エンジン機能の動作について説明します。

バックアップと復旧

既存のデータベースを復元する場合、SQL Server 2005 ではログの末尾をバックアップした後に完全復旧モデルまたは一括ログ復旧モデルでデータベースを復元します。ログの末尾をバックアップする前にデータベースの復元を試行すると、RESTORE ステートメントに WITH REPLACE 句または WITH STOPAT 句が含まれていない限り、エラーが発生します。詳細については、「ログ末尾のバックアップ」を参照してください。

カーソル

次の表は、SQL Server 2000 では発生するが、SQL Server 2005 では発生しない暗黙的カーソル変換を示しています。対処するには、暗黙的変換に依存するのではなく、特定の型のカーソルを要求してください。

条件 SQL Server 2000 でのカーソル変換元 変換先

クエリにインライン テーブル値関数が含まれています。

動的またはキーセット

静的

クエリがリモート オブジェクトを参照します。

高速順方向

キーセット

クエリにテーブルが含まれません。

高速順方向

静的

クエリにテーブル関数が含まれます。

高速順方向

静的

クエリに派生テーブルが含まれます。

高速順方向

静的

クエリに複数ステートメントのテーブル関数が含まれます。

動的

キーセット

キーセットから静的に

静的

クエリに仮想テーブルが含まれます。

動的またはキーセット

静的

クエリに TOP を含むビューが含まれます。

高速順方向

静的

クエリに更新可能なパーティション ビューが含まれます。

高速順方向

静的

API カーソル クエリに一意のアクセス パスを持つインデックス付きビューが含まれますが、ベース テーブル レベルではありません。

キーセット

静的

API カーソル クエリにクラスタ化インデックスと一意のキーのいずれも持たないテーブルが含まれます。

キーセット

静的

API カーソル結果セットに text 列、ntext 列、または image 列が含まれます。

高速順方向

動的

SQL Server 2005 では、キーセット ドリブンまたは静的な Transact-SQL カーソルの非同期的な生成がサポートされません。OPEN や FETCH などの Transact-SQL カーソルは、最初に一括処理されます。したがって、Transact-SQL カーソルを非同期に生成する必要がありません。SQL Server 2005 では、各カーソル操作に対するクライアントのラウンド トリップによる低待機時間の問題が OPEN にある場合、非同期のキーセット ドリブンまたは静的な API サーバー カーソルが引き続きサポートされます。

SQL Server 2005 では、一意のインデックスを含まないテーブルで動的カーソルが宣言され、カーソルの外側で行が削除された場合、その後のカーソル更新で、行のプレースホルダに NULL データが取得されます。以前のバージョンの SQL Server では、カーソルは影響を受ける行を返しません。

SQL Server 2005 では、バッチまたはストアド プロシージャ内の条件ロジックを通して異なるカーソルの宣言が可能である場合は、カーソルを使用して INSERT、UPDATE、および DELETE のステートメントを実行すると、再コンパイルが行われます。SQL Server 2000 では、これらのステートメントによって再コンパイルは行われません。

次の例では、UPDATE ステートメントによってモジュールが再コンパイルされます。

IF(@some_condition=1)
   DECLARE c CURSOR FOR 
      SELECT region FROM db.dbo.mytable ORDER BY lastname
ELSE
   DECLARE c CURSOR FOR 
      SELECT postalcode FROM db.dbo.mytable ORDER BY firstname
...
FETCH NEXT FROM c
...
UPDATE db.dbo.mytable 
   SET  firstname='a' WHERE CURRENT OF c

再コンパイルを避けるには、次の方法でコードを書き直します。

IF (@some_condition=1)
BEGIN
   DECLARE c CURSOR FOR 
     SELECT region FROM db.dbo.mytable ORDER BY lastname
   FETCH NEXT FROM c
   UPDATE db.dbo.mytable 
     SET  firstname='a' WHERE CURRENT OF c
END
ELSE
BEGIN
  DECLARE c CURSOR FOR 
    SELECT postalcode FROM db.dbo.mytable ORDER BY firstname
  FETCH NEXT FROM c
  UPDATE db.dbo.mytable 
    SET  firstname='a' WHERE CURRENT OF c
END

SQL Server 2005 では、より高いロック ヒントがクエリに指定されていない限り、カーソル スクロール ロックによりロックが S (共有) から U (更新) にアップグレードされます。SQL Server 2000 ではスクロール ロック カーソルの U ロックが透過的に追加されます。SQL Server 2005 のこのような動作により、同時実行性が向上しますが、同時実行カーソルがデッドロック (メッセージ 1205) する可能性も生じます。希望する動作を実現するには、UPDLOCK ヒントを使用します。詳細については、「テーブル ヒント (Transact-SQL)」を参照してください。

SQL Server 2000 では、カーソル フェッチ バッファに複数回表示される列または行の値を更新すると、2 回目以降の表示に更新が反映されません。これは、フェッチ バッファのサイズまたはバッファ内の行の位置によるものです。SQL Server 2005 では、フェッチ バッファのサイズや行の位置に関係なくフェッチ バッファの行が更新され、値は常に一貫します。

SQL Server 2000 では、UNION ALL ステートメントを不適切に含むカーソルは UNION の 1 番目のセットに基づいて更新可能性情報を返します。したがって、カーソルが更新可能でない場合に更新可能と報告される場合があります。SQL Server 2005 では、UNION ALL の結果が計算どおりに報告されるため、更新可能とは報告されません。すべてのカーソル行が同じテーブルまたはビューにある場合は、UNION ではなく IN 句または OR 句を使用するようにクエリを変更すると、更新可能なカーソルを定義できます。

SQL Server 2000 では、CURSOR_CLOSE_ON_COMMIT オプションをオンに設定すると、トランザクションをコミットしたときに接続のすべてのカーソルが閉じます。SQL Server 2005 では、現在のトランザクションで開いているカーソルのみがトランザクション コミット時に閉じます。トランザクションの開始前に開いていたカーソルは開いたままになります。

SQL Server 2000 では、一部の無効なカーソル宣言が許可されます。無効なカーソル宣言は、別の型のカーソルに変換されます。SQL Server 2005 では、無効なカーソル宣言は許可されません。たとえば、更新機能と無反応性の両方を要求するカーソルは、SQL Server 2005 では無効となって失敗し、エラーが発生します。

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

SQL Server 2000 での動作 SQL Server 2005 での動作

AUTO_CLOSE データベース オプションは同期プロセスです。データベース エンジンとの接続や切断を繰り返すアプリケーションがデータベースにアクセスする場合、このオプションによりパフォーマンスが低下する可能性があります。

AUTO_CLOSE プロセスは非同期です。データベースを繰り返し開閉してもパフォーマンスが低下しません。

パーティション上のファイルは自動拡張されないので、os_file_name でパーティションを指定する場合に MAXSIZE および FILEGROWTH パラメータは不要です。

パーティション上のファイルを自動拡張できます。MAXSIZE および FILEGROWTH パラメータを指定できます。

各データベースのデータ ファイルとログ ファイルに権限が設定されません。

次の操作をデータベースに適用する場合は、データ ファイルとログ ファイルに必ず権限が設定されます。

作成新しいファイルを追加するように変更
アタッチバックアップ
デタッチ復元

この権限は、開く権限のあるディレクトリにファイルが存在する場合に、そのファイルが誤って書き換えられるのを防ぎます。詳細については、「データ ファイルとログ ファイルのセキュリティ保護」を参照してください。

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

Microsoft SQL Server 2005 Express Edition では、データ ファイルとログ ファイルの権限は設定されません。

リンク サーバーおよび分散クエリ

プロバイダ名として "SQLOLEDB" を使用して定義されていたリンク サーバーは、アップグレード後に "SQLNCLI" (SQL Native Client OLE DB プロバイダ) に変更されます。互換性ビュー sys.sysservers に、"SQLNCLI" を "SQLOLEDB" として使用するリンク サーバーが表示されます。SQL Server 2005 カタログ ビュー sys.servers に、"SQLNCLI" を "SQLNCLI" として使用するリンク サーバーが表示されます。

異種クエリと OLE DB プロバイダの使用は、SQL Server をファイバ モードで実行しているときはサポートされてません。簡易プーリング詳細構成オプションを 1 に設定すると、ファイバ モードが有効になります。

SQL Native Client OLE DB プロバイダをアウト プロセスでインスタンス化することはできません。

SQL Server 2005 のリンク サーバーからクライアントへの警告メッセージはサポートされません。警告メッセージのうち最も重要なものは次のとおりです。

  • 集計計算で NULL 値が削除されたことを示す ANSI と互換性がある警告
  • 算術オーバーフローの警告

たとえば、次の Transact-SQL ステートメントで col1 内に NULL 値がある場合は、警告メッセージが生成される可能性があります。

SELECT SUM(col1)
FROM <Table>
GROUP BY col2 

SQL Server 2000 以前は、リンク サーバーでクライアントへの警告メッセージが反映されました。SQL Server 2005 では、リンク サーバーで警告メッセージが反映されません。

SQL Server 2000 では、不適切なパラメータ バインドなどのコンパイル時エラーによりリモート ストアド プロシージャが正常に実行されないと、返される値または状態は 0 に設定されます。このシナリオが SQL Server 2005 で発生した場合、返される値または状態は NULL に設定されます。

クエリ プロセッサ アーキテクチャ

再コンパイル時にパラメータ値を使用すると、次の形式で送信されるバッチ数が SQL Server 2000 と SQL Server 2005 の間で異なります。

  • ストアド プロシージャ
  • sp_executesql の使用
  • 準備されたステートメント

SQL Server 2000 でこれらのバッチを再コンパイルすると、パラメータ値を使用して再コンパイルの一部としてバッチが呼び出されます。SQL Server 2005 でこれらのクエリを再コンパイルする場合は、再コンパイルの原因となったステートメント前と同じパラメータ値が使用されます。これらの値は、最初のバッチに渡された値と異なる可能性があります。詳細については、「パラメータと実行プランの再利用」を参照してください。

セキュリティ

機能 SQL Server 2000 での動作 SQL Server 2005 での動作

GRANT ALL

適用可能なすべての権限を付与します。

オブジェクトとステートメントに対する ALL 権限の付与は、推奨されません。GRANT ALL を実行すると、次のような状況が発生します。

  • コマンドが正常に完了しますが、SQL Server 2000 で付与できる権限のみがユーザーに付与されます。
  • "ALL 権限は推奨されません。互換性のためだけに保持されています。ALL 権限は、エンティティで定義されたすべての権限を示すとは限りません。" というメッセージが表示されます。

SQL Server 2005 にはさまざまな目的の権限が追加されており、ユーザーの権限管理に使用できます。たとえば、オブジェクトに対する所有者のような権限の付与には、CONTROL 権限を使用できます。

パスワードの比較

SQL Server 2000 では、各 SQL Server ログイン パスワードの 2 つのバージョンが管理されます。1 つはユーザーが実際に入力するパスワードで、もう 1 つは SQL Server ですべて大文字に変換されたパスワードです。これにより、パスワードの大文字と小文字を区別しない検証が可能になります。この動作は多くのユーザーにとって便利ですが、使用可能なパスワード数が減少することによって、パスワード推測攻撃の危険性が高くなります。

実際に入力されるパスワードのみが格納されます。ユーザーが入力したパスワードは、サーバーに格納されたパスワードと一致する必要があります。パスワードが SQL Server に格納されたパスワードと一致しない場合は、ログインが失敗します。パスワード文字の正確な大文字と小文字を忘れた場合は、パスワードを再設定する必要があります。

sa アカウントの既定の言語の変更

SQL Server の sa アカウントの既定の言語は、セットアップまたはアップグレード中に選択します。

Microsoft SQL Server の以前のリリースでは、sp_configure を実行してサーバーの既定の言語を変更すると、sa アカウントの既定の言語も更新されました。

SQL Server 2005 で sa アカウントの既定の言語を変更するには、sp_defaultlanguage ストアド プロシージャを実行し、DBCC FREESYSTEMCACHE コマンドを実行した後、新しいセッションを開始する必要があります。sp_configure を実行してサーバーの既定の言語を変更しても、sa アカウントの既定の言語は更新されません。

システム ストアド プロシージャ

次の表は、データベース エンジン システム ストアド プロシージャのパラメータに対する変更を示します。

ストアド プロシージャ パラメータ 変更の説明

sp_bindefault

@objname

サイズが nvarchar(517) から nvarchar(776) に変更されています。

sp_bindrule

@objname

サイズが nvarchar(517) から nvarchar(776) に変更されています。

sp_changeobjectowner

@objname

サイズが nvarchar(517) から nvarchar(776) に変更されています。

sp_detach_db

@keepfulltextindexfile

サイズが nvarchar(517) から nvarchar(776) に変更されています。

sp_fulltext_service

@action

サイズが varchar(20) から nvarchar(100) に変更されています。

sp_fulltext_service

@value

データ型が int から sql_variant に変更されています。

sp_getapplock

@DbPrincipal

パラメータが追加されています。

sp_releaseapplock

@DbPrincipal

パラメータが追加されています。

sp_setapprole

@fCreateCookie

パラメータが追加されています。

sp_setapprole

@cookie

パラメータが追加されています。

sp_settriggerorder

@stmttype

サイズが varchar(10) から varchar(50) に変更されています。

sp_settriggerorder

@namespace

パラメータが追加されています。

sp_sproc_columns

@fUsePattern

パラメータが追加されています。

sp_stored_procedures

@fUsePattern

パラメータが追加されています。

sp_table_privileges

@fUsePattern

パラメータが追加されています。

sp_table_privileges_ex

@fUsePattern

パラメータが追加されています。

sp_tables

@fUsePattern

パラメータが追加されています。

sp_tables_ex

@fUsePattern

パラメータが追加されています。

システム テーブルおよびビュー

次の表は、システム テーブルおよびビューの列に対する変更を示します。

システムテーブルまたはビュー 変更の説明

COLUMNS

ORDINAL_POSITION

データ型が smallint から int に変更されています。

PARAMETERS

ORDINAL_POSITION

データ型が smallint から int に変更されています。

REFERENTIAL_CONSTRAINTS

MATCH_OPTION

サイズが varchar(4) から varchar(7) に変更されています。

既定値が "NONE" から "SIMPLE" に変更されています。

REFERENTIAL_CONSTRAINTS

UPDATE_RULE

サイズが varchar(9) から varchar(11) に変更されています。

REFERENTIAL_CONSTRAINTS

DELETE_RULE

サイズが varchar(9) から varchar(11) に変更されています。

ROUTINE_COLUMNS

ORDINAL_POSITION

データ型が smallint から int に変更されています。

sysaltfiles

name

データ型が nchar(128) から sysname に変更されています。

sysaltfiles

filename

データ型が nchar(260) から nvarchar(260) に変更されています。

sysconfigures

config

データ型が smallint から int に変更されています。

syscursorcolumns

data_type_sql

データ型が smallint から int に変更されています。

sysfiles

name

データ型が nchar(128) から sysname に変更されています。

sysfiles

filename

データ型が nchar(260) から nvarchar(260) に変更されています。

sysmessages

severity

データ型が smallint から tinyint に変更されています。

sysperfinfo

cntr_value

データ型が int から bigint に変更されています。

sysprocesses

waittime

データ型が int から bigint に変更されています。

sysprocesses

hostprocess

サイズが nchar(8) から nchar(10) に変更されています。

sysprocesses

request_id

列が追加されています。

sysprotects

columns

サイズが varbinary(4000) から varbinary(8000) に変更されています。

sysservers

srvcollation

データ型が int から sysname に変更されています。

sysservers

nonsqlsub

列が追加されています。

sysoledbusers

rmtpassword

NULL のみを返します。

sysindexes

keys

NULL のみを返します。

sysindexes

statblob

NULL のみを返します。

syscomments

compressed

0 のみを返します。

sysdevices

size

0 のみを返します。

sysobjects

schema_ver

0 のみを返します。

sysremotelogins

status

0 のみを返します。

sysservers

topologyx

0 のみを返します。

sysservers

topologyy

0 のみを返します。

Transact-SQL

機能 SQL Server 2000 での動作 SQL Server 2005 での動作

bcp ユーティリティ

テーブルに対する INSERT 権限と SELECT 権限を持つユーザーは、bcp ユーティリティで次のコマンドを使用して一括読み込みできます。

bcp <target table> in 
<datafile> -c -T

既定では、このコマンドはターゲット テーブルの CHECK 制約とトリガを無効化します。

bcp ユーティリティを実行するには、一括コピー プロセス時に CHECK 制約とトリガが無効化されている場合、ユーザーが ALTER 権限およびターゲット テーブルに対する INSERT 権限と SELECT 権限を持っている必要があります。SQL Server 2005 にアップグレードした後は、権限が不十分なためにアプリケーションでの bcp コマンドが失敗する可能性があります。この問題には、次のいずれかの方法で対処できます。

  • bcp プロセスの影響を受けるすべてのテーブルに対する ALTER TABLE 権限をユーザーに付与します。
  • bcp コマンドを次のコマンドのように修正し、CHECK 制約とトリガを明示的に設定します。

    bcp <target table> 
    in <datafile> -c -T -h 
    "CHECK_CONSTRAINTS, 
    FIRE_TRIGGERS"

組み込みシステム関数

NEWID や RAND などの組み込み関数への各参照は異なる結果を生成します。1 つ上のレベルのクエリを参照するごとに 1 回評価されるためです。

1 つ上のレベルのクエリを使用して、ビューまたは派生テーブルの列の複数の参照を作成できます。ただし、それらの列が NEWID および RAND などの関数を呼び出すことによって定義される場合、それらの複数の参照によって、ビューまたは派生テーブル内で実際に関数が呼び出されるたびに 1 回だけ関数が評価されます。

サブクエリのその列の複数の参照によって、関数が複数回評価されません。これにより、サブクエリのそれらの関数によって生成される値を再使用できます。

たとえば、SQL Server 2000 では、次のクエリによって 2 つの異なる値が返されます。SQL Server 2005 では、1 つの値が返されます。

SELECT Column1, Column1
      FROM (
            SELECT RAND() Column1
            FROM (
            SELECT 1 c
            UNION
            SELECT 2 c
                  ) s
            ) t

BULK INSERT

BULK INSERT は、科学的表記法を使用する数値を表す文字列に対して、文字列型から decimal 型への変換をサポートします。

BULK INSERT で使用される文字列型から decimal 型への変換は、Transact-SQL CONVERT 関数と同じルールに従います。この関数は、科学的表記法を使用する数値を表す文字列を拒否します。したがって、BULK INSERT はこのような文字列を無効な値として扱い、変換エラーを報告します。詳細については、「BULK INSERT (Transact-SQL)」を参照してください。

datetime 変換

文字列から datetime への変換は "決定的" とマークされます。ただし、これは次の表に示すスタイルに対しては当てはまりません。これらのスタイルの場合、変換は言語設定に応じて異なります。

次の表は、文字列から datetime への変換が非決定的であるスタイルを示します。

100 未満のすべてのスタイル1106
107109
113130

1 スタイル 20 と 21 を除く

SQL Server 2005 では、文字列から datetime への変換は非決定的とマークされます。

DBCC CHECKFILEGROUP

指定したファイル グループ内の非クラスタ化インデックスが、別のファイル グループ内のテーブルに関連付けられている場合、関連付けられているファイル グループ内のインデックスとベース テーブルもチェックされます。

指定したファイル グループ内の非クラスタ化インデックスが、別のファイル グループ内のテーブルに関連付けられている場合、ベース テーブルが検証できないので、インデックスはチェックされません。

DBCC SHOW_STATISTICS

DBCC SHOW_STATISTICS によって返される行セットに Name 列が含まれません。

DBCC SHOW_STATISTICS によって返される最初の行セットに Name というタイトルが付いた追加列が含まれます。この列は、結果セットの最初の列として表示されます。DBCC SHOW_STATISTICS によって返される列に序数でアクセスするアプリケーションがある場合、その列を名前でアクセスするようにアプリケーションを変更してください。

DROP LOGIN

DROP LOGIN を実行する場合、データベース ユーザーがログインにマップされている場合にログインが削除されません。

DROP LOGIN を実行する場合、データベース ユーザーがログインにマップされている場合でもログインが削除されます。

計算列、CHECK 制約、DEFAULT 制約の式

空白も含め式の元のテキストは、カタログ メタデータに保存されています。たとえば、c1 + c2 + 1 と入力した計算列の式は、syscomments システム テーブルの text 列に入力したとおりに表示されます。

式の元のテキストはデコードされて正規化され、この処理の出力がカタログ メタデータに保存されます。デコードされた式のセマンティクスは元のテキストと同じですが、構文も同じであるとは限りません。たとえば、c1 + c2 + 1 と入力した計算列の式は、sys.computed_columns システム カタログ ビューの定義列では (([c1]+[c2])+(1)) と表示されます。

クエリの式

クエリの安全でない式がランタイム例外を生成するとは限りません。

SQL Server 2005 では、SQL Server 2000 の場合よりも早いタイミングでクエリ式が評価されることがあります。これによって、次の重要なメリットがもたらされます。

  • 計算列のインデックスを計算列の式と同じであるクエリの式と適合させることができる。
  • 式の結果の冗長計算を防止する。

ただし、安全でない既存の式がクエリに含まれている場合、クエリおよびデータベース内のデータの性質によっては、SQL Server 2005 でランタイム例外が発生する可能性があります。ランタイム例外は以下のとおりです。

  • 算術例外。0 除算、オーバーフロー、アンダーフローなど。
  • 精度の低下、数値以外の文字列の数への変換などの変換エラー。
  • すべて NULL 以外であることが保証されない値セットに対する集計

SQL Server 2000 では、これらの例外は特定のデータを含む特定のアプリケーションで発生しない場合があります。ただし、統計の変更によって変更されるクエリ プランが原因で、SQL Server 2000 に例外が発生する可能性があります。これらのランタイム例外は、クエリを変更して NULLIF または CASE などの条件式を含めることによって回避できます。詳細については、「クエリ式に関するエラーと警告のトラブルシューティング」を参照してください。

fn_servershareddrives

システム関数 fn_servershareddrives によって返されるデータを、public ロールのメンバが表示できます。

権限の変更 : fn_servershareddrives の場合、ユーザーがサーバーの VIEW SERVER STATE 権限を持っている必要があります。

ms143359.note(ja-jp,SQL.90).gif重要 :

SQL Server 2000 のこのシステム関数は、旧バージョンとの互換性のために用意されています。代わりに sys.dm_io_cluster_shared_drives を使用することをお勧めします。

fn_virtualfilestats

システム関数 fn_virtualfilestats によって返されるデータを、public ロールのメンバが表示できます。

権限の変更 : fn_virtualfilestats の場合、ユーザーがサーバーの VIEW SERVER STATE 権限を持っている必要があります。

fn_virtualservernodes

システム関数 fn_virtualservernodes によって返されるデータを、public ロールのメンバが表示できます。

権限の変更 : fn_virtualservernodes の場合、ユーザーがサーバーの VIEW SERVER STATE 権限を持っている必要があります。

ms143359.note(ja-jp,SQL.90).gif重要 :

SQL Server 2000 のこのシステム関数は、旧バージョンとの互換性のために用意されています。代わりに sys.dm_os_cluster_nodes を使用することをお勧めします。

HOST_ID

HOST_ID は char(8) 値を返します。

HOST_IDchar(10) 値を返します。

インデックス

「SQL Server 2005 での動作」列に記載されたインデックスが許可されます。

次のインデックスは、アップグレード プロセス時に無効になる、または SQL Server 2005 で導入された変更によって再作成が必要となる場合があります。

  • CHECKSUM (some_timestamp_column) を使用する計算列のインデックス。このインデックスは、引数として timestamp を取得する場合、その動作が Transact-SQL CHECKSUM 関数に変更されるため、無効になります。
  • トルコ語ベースの照合順序を使用する nvarchar 列または nchar 列に文字値 0x3390、0x33ca、または 0x33cb が含まれるインデックス。トルコ語ベースの照合順序のソート動作が変更されたため、これらのインデックスは再作成する必要があります。
  • 文字列から datetime または smalldatetime への暗黙的な変換、あるいは文字列から datetime または smalldatetime への明示的で非決定的な変換が含まれるビューまたは計算列の式にある計算列またはビューのインデックス。これらのインデックスは無効になります。

上記に示した最初の 2 つの項目で説明された変更によってインデックスを再作成する必要がある場合は、次の手順に従ってください。

  1. 警告メッセージ 3801、3803、または 3804 に対して SQL Server エラー ログを実行します。

  2. 基になるテーブルで DBCC CHECKTABLE を実行して、問題の有無を確認します。

  3. DBCC ステートメントの結果で問題があると示した場合は、次のいずれか 1 つの方法を使用してインデックスを再作成します。

    • REBUILD 句を指定した ALTER INDEX ステートメント
    • DROP_EXISTING 句を指定した CREATE INDEX
    • DBCC DBREINDEX
  4. 次のステートメントを使用することによって、無効となった FOREIGN KEY 制約を識別します。

    SELECT * FROM sys.foreign_keys 
    WHERE is_disabled=1;
    
  5. ALTER TABLE CHECK CONSTRAINT ステートメントを使用することによって、FOREIGN KEY 制約を有効にします。
    PRIMARY KEY 制約および UNIQUE 制約は、関連するインデックスを再作成することによって有効になります。このインデックスを再作成してから、FOREIGN KEY 制約を有効にして、PRIMARY KEY 制約または UNIQUE 制約を参照する必要があります。

上記に示した 3 番目の項目で説明された変更によって無効となるインデックスの場合は、次の手順に従ってください。

  1. 次のステートメントを使用することによって、無効となっている計算列のインデックスを識別します。

    SELECT object_name(i.object_id) AS
     object_name, i.*
    FROM sys.indexes AS i
    JOIN sys.index_columns AS ic 
    ON i.index_id = ic.index_id 
      AND i.object_id = ic.object_id
    JOIN sys.computed_columns AS
     cc
    ON ic.object_id = cc.object_id 
      AND ic.column_id = cc.column_id
    WHERE i.is_disabled = 1
    
  2. 計算列のインデックスの場合、そのインデックスを削除してから、計算列の定義を変更して、決定的な日付形式を指定した明示的な CONVERT 関数を使用します。

  3. インデックス付きビューの場合、そのビューを削除してから、決定的な日付形式を指定した明示的な CONVERT 関数を使用することによって、そのビューを再作成します。

  4. 変更された列またはビューでインデックスを再作成します。

インデックス

並列インデックス操作は、SQL Server 2000 Developer, SQL Server 2000 Standard Edition および SQL Server 2000 Enterprise Edition でサポートされます。

インデックスの作成、削除、または再構築を行う並列インデックス操作は、SQL Server 2005 Developer Edition および SQL Server 2005 Enterprise Edition のみで有効です。

SQL Server 2000 Standard Edition から SQL Server 2005 Standard Edition にアップグレードする場合、SQL Server 2005 Standard Edition では、インデックスの作成、削除、または再構築を行う操作が直列に実行されます。したがって、操作にさらに時間がかかる可能性があります。

SELECT、INSERT、UPDATE、および DELETE の各ステートメントは影響を受けません。これらのステートメントは、SQL Server 2005 Standard Edition で並列に動作します。

SQL Server 2005 Standard Edition へのアップグレード後に、インデックスの作成、削除、または再構築を行う操作を監視してください。これらの操作に時間が余分にかかっても対応できるように、メンテナンス スクリプトまたは計画的なメンテナンス作業を調整しなければならない場合があります。

並列インデックス操作を実行するには、SQL Server 2005 Enterprise Edition をインストールしてください。

ORDER BY 句

ORDER BY 句の列名は、修飾されているかどうかに関係なく、Select リスト内の列として解決されます。

たとえば、次のクエリを実行するとエラーが発生しません。

USE pubs
SELECT au_fname AS 'FName',
  au_lname AS 'LName'
FROM authors a
ORDER BY a.LName

SQL Server では、ORDER BY 句の修飾子 a が無視され、Select リストの列名 LName が解決されます。

修飾された列名と別名は、FROM 句で一覧表示されるテーブルの列として解決されます。order_by_expression が修飾されていない場合、SELECT ステートメントに一覧表示されているすべての列で一意である必要があります。

たとえば、次の同等なクエリがエラーを返します。

USE AdventureWorks
SELECT FirstName AS 'FName',
    LastName AS 'LName'
FROM Person.Contact p
ORDER BY p.LName

SQL Server では、ORDER BY 句の修飾子 p が無視されず、FROM 句に一覧表示されるテーブルの列名 LName として解決されます。ただし、FROM 句は列 LName がテーブル p 列の別名であることを認識しません。

SERVERPROPERTY 関数

SERVERPROPERTY 関数の ProductVersion プロパティの戻り値の型は varchar です。

SERVERPROPERTY 関数の ProductVersion プロパティの戻り値の型は nvarchar です。

sp_addtype

任意のユーザーが sp_addtype を実行できます。

sp_addtype を実行するには、ユーザーが db_ddladmin データベース ロールまたは db_owner データベース ロールのメンバである必要があります。

ユーザーが別名データ型を作成できるようにするには、次のいずれかの変更を行う必要があります。

  • sp_addtype を使用するには、ユーザーを db_ddladmin データベース ロールまたは db_owner データベース ロールに追加します。
  • CREATE TYPE を使用して別名データ型を作成するには、CREATE TYPE 権限をユーザーに付与し、ターゲット スキーマのユーザーに ALTER 権限を付与します。

sp_altermessage

sp_altermessage を使用して、システム メッセージ (メッセージ ID < 50000 のメッセージ) を Windows アプリケーション ログに書き込むかどうかを指定できます。

sp_altermessage を使用してシステム メッセージ (メッセージ ID < 50000 のメッセージ) の記録動作を変更できません。システム メッセージを調整するには、SQL Trace および User Error Message イベント クラスを使用します。詳細については、「SQL トレースの概要」を参照してください。

sp_changedbowner

sysadmin 固定サーバー ロールのメンバまたは db_owner 固定データベース ロールのメンバ、あるいは db_ddladmin および db_securityadmin の両方の固定データベース ロールを持つメンバのみが、sp_changeobjectowner を実行できます。

db_ddladmin および db_securityadmin の固定データベース ロールのメンバシップでこのストアド プロシージャを実行できるユーザーに対して、セキュリティ保護可能な CONTROL 権限を与える必要もあります。対象オブジェクトの CONTROL 権限なしで sp_changeobjectowner を実行すると、その実行に失敗し、次のエラー メッセージが表示されます。

"メッセージ 15247、レベル 16、状態 1、プロシージャ sp_changeobjectowner、行 17

ユーザーにはこの操作を実行する権限がありません。"

sp_help

sp_help は関数の結果セットを 1 つ返します。

sp_help は関数の結果セットを 2 つ返します。追加の結果セットは、関数パラメータ用に設定されます。

sysindexes

 

sys.sysindexes が旧バージョンとの互換性を維持するために提供されています。ただし、SQL Server 2005 での変更により、ビューは以前のバージョンの SQL Server 製品と完全な互換性がありません。

システム メタデータ

public ロールのメンバが、システム テーブルをクエリし、カタログからメタデータを表示できます。

カタログをクエリするユーザーが実行できるのは、そのユーザーが一部の権限を持つ、またはロールのメンバとして表示する権限を持つオブジェクトのメタデータの行を表示することだけです。推奨される修正方法の詳細については、「メタデータ表示の構成」および「メタデータ表示のトラブルシューティング」を参照してください。

システム テーブル

システム テーブルの型は S です。

システム テーブルは互換性ビューとして使用でき、型は V になります。システム テーブルに対してクエリを実行し、検索基準 type = 'S' を含むステートメントは失敗します。

ステートメントの検索基準を type = 'V' に修正します。

または

新しいカタログ ビューまたは動的管理ビューに移行します。詳細については、「SQL Server 2000 システム テーブルから SQL Server 2005 システム ビューへのマッピング」を参照してください。

一括インポート時の TABLOCK (bcp、BULK INSERT、または OPENROWSET(BULK...) を使用)

空でないクラスタ化インデックスが設定されているテーブルに一括インポートする場合、TABLOCK ヒントは無視されます。

空でないクラスタ化インデックスが設定されているテーブルに一括インポートする場合、TABLOCK ヒントはテーブルの X ロックを取得します。この動作により、データを並列で一括インポートすることはできなくなります。このテーブルに対し、並列で一括インポートを実行する場合は、TABLOCK を使用しないでください。並列での一括読み込みの詳細については、「一括インポートを最適化するためのガイドライン」を参照してください。

トリガ

直接トリガ再帰は、トリガが起動され処理が行われるときに、処理内で同じトリガが再度起動される場合に発生します。

直接トリガ再帰は、次のいずれかの状況で発生します。

  • トリガが起動され処理が行われるときに、処理内で同じトリガが再度起動される場合
  • 処理内で、別の型のトリガ (AFTER または INSTEAD OF) が呼び出された後、最初のトリガと同じトリガが再度呼び出される場合

間接トリガ再帰は、トリガが起動され処理が行われるときに、処理内で同じ型の別のトリガ (AFTER または INSTEAD OF) が起動され、その 2 番目のトリガによって、最初のトリガが再度起動される場合に発生します。

詳細については、「入れ子になったトリガの使用」の「再帰トリガ」を参照してください。

トリガ

UPDATE または DELETE ステートメントが、ローカル パーティション ビューまたは分散パーティション ビューに対して実行されると、ビューのベース テーブルに対して定義されているすべての UPDATE トリガまたは DELETE トリガが起動されます。起動されるトリガには、更新操作または削除操作の影響を受けないテーブルのトリガも含まれます。

UPDATE または DELETE ステートメントが、パーティション ビューに対して実行されると、トリガが定義されているベース テーブルが更新操作または削除操作の影響を受ける場合のみ、UPDATE トリガまたは DELETE トリガが起動します。詳細については、「DML トリガの実行」を参照してください。

UPDATE() 関数

UPDATE() 関数で timestamp 列への変更は検出されません。これらの列の場合、トリガ内部の IF UPDATE() 句は、列の更新に関係なく FALSE を返します。

UPDATE() 関数で timestamp 列への変更が検出されます。これらの列の場合、DML トリガ内部の IF UPDATE() 句は、列が更新された場合 TRUE を返します。

ユーザー定義関数

ユーザー定義関数には、非決定的な組み込みシステム関数を含めることができません。

Transact-SQL ユーザー定義関数に、非決定的な組み込みシステム関数のほとんどを含めることができます。許可されている組み込み関数の完全な一覧については、「ユーザー定義関数の作成 (データベース エンジン)」を参照してください。

varcharnvarchar、および varbinary のデータ型

テーブルの計算列の定義に使用されている、長さが 0 の文字列またはバイナリ値から、varchar(0)nvarchar(0)、または varbinary(0) 型の列が作成されます。

テーブルの計算列の定義に使用されている、長さが 0 の文字列またはバイナリ値から、varchar(1)nvarchar(1)、または varbinary(1) 型の列が作成されます。この動作の変更によって影響を受けるのは、計算列のデータ型のみです。計算値には影響しません。

計算列のデータ型の長さを調べるアプリケーションがある場合は、varchar および varbinary 列の最小長に 1 バイト、nvarchar 列の最小長に 2 バイトを想定するよう修正してください。

仮想テーブル アクセス

仮想テーブルには、guest または public ロールのメンバがアクセスできます。

sysprocesses などの仮想テーブルにアクセスするには、VIEW SERVER STATE 権限と SELECT 権限が必要です。

ビューの WITH CHECK OPTION

INSERT 操作および UPDATE 操作がビューの SELECT ステートメントの範囲外で失敗した場合でも、WITH CHECK OPTION 句が指定されたビューおよびリモート テーブルで作成されたビューに対しては、これらの操作を実行できます。

リモート データ ソースのテーブルを基に作成されたビューに対して挿入操作および更新操作を実行するとき、SQL Server 2005 では WITH CHECK OPTION 句が認識されます。

リモート テーブルを基に作成されたビューに対して挿入操作または更新操作を実行し、WITH CHECK OPTION 句が原因で操作に失敗した場合は、ビューを変更して、WITH CHECK OPTION 句を指定しないようにしてください。

詳細については、「CREATE VIEW (Transact-SQL)」、「ALTER VIEW (Transact-SQL)」、および「ビューを使用したデータ変更」を参照してください。

xp_cmdshell

xp_cmdshell の実行でエラーが発生した場合、エラー メッセージが発行されますが、実行は停止されません。

xp_cmdshell の実行でエラーが発生した場合、エラー メッセージが発行され、実行が停止されます。

参照

関連項目

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

その他の技術情報

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

ヘルプおよび情報

SQL Server 2005 の参考資料の入手

変更履歴

リリース 履歴

2006 年 7 月 17 日

追加内容 :
  • Transact-SQL の動作変更を一覧にした表に、「計算列、CHECK 制約、DEFAULT 制約の式」という項目を追加しました。
  • Transact-SQL の動作変更を一覧表で「SQL Server 2005 の動作」の列の「varcharnvarchar、および varbinary データ型」の項目のステートメントを変更しました。テーブルの計算列のデータ型が nvarchar(2) から nvarchar(1) に変更されました。

2005 年 12 月 5 日

追加内容 :
  • 無効なカーソル宣言に関する情報を追加。
  • sa アカウントの既定の言語の変更」に内容を追加。
  • 「DBCC CHECKFILEGROUP」に内容を追加。
  • 「一括挿入時の TABLOCK」に内容を追加。
  • 「トリガ」に内容を追加。
変更内容 :
  • varcharnvarchar、および varbinary データ型」の内容を修正。