FILESTREAM データはファイル システム内にあるため、このトピックでは、SQL Server の次の機能で FILESTREAM を使用するための考慮事項、ガイドライン、および制限事項について説明します。
SQL Server Integration Services (SSIS)
SQL Server Integration Services (SSIS) は、DT_IMAGE SSIS データ型を使用して、他の BLOB データと同様にデータ フロー内の FILESTREAM データを処理します。
列のインポート変換を使用して、ファイル システムから FILESTREAM 列にファイルを読み込むことができます。 列のエクスポート変換を使用して、FILESTREAM 列からファイル システム内の別の場所にファイルを抽出することもできます。
分散クエリとリンク サーバー
FILESTREAM データは、分散クエリとリンク サーバーを使用して、 varbinary(max)
データとして扱うことができます。 名前がローカル サーバーを参照している場合でも、4 部構成の名前を使用する分散クエリでは FILESTREAM PathName() 関数を使用できません。 ただし、OPENQUERY() を使用するパススルー クエリの内部クエリでは PathName() を使用できます。
暗号化
透過的なデータ暗号化が有効になっている場合でも、FILESTREAM データは暗号化されません。
データベース スナップショット
SQL Server では、FILESTREAM ファイル グループ のデータベース スナップショット はサポートされていません。 FILESTREAM ファイル グループが CREATE DATABASE ON 句に含まれている場合、ステートメントは失敗し、エラーが発生します。
FILESTREAM を使用している場合は、標準 (非 FILESTREAM) ファイル グループのデータベース スナップショットを作成できます。 FILESTREAM ファイル グループは、これらのデータベース スナップショットではオフラインとしてマークされます。
データベース スナップショット内の FILESTREAM テーブルで実行される SELECT ステートメントには、FILESTREAM 列を含めてはなりません。それ以外の場合は、次のエラー メッセージが返されます。
Could not continue scan with NOLOCK due to data movement.
レプリケーション
パブリッシャーで FILESTREAM 属性が有効になっている varbinary(max)
列は、FILESTREAM 属性の有無にかかわらずサブスクライバーにレプリケートできます。 列のレプリケート方法を指定するには、[アーティクルのプロパティ - <Article>] ダイアログ ボックスまたはsp_addarticleまたはsp_addmergearticleの@schema_option パラメーターを使用します。 FILESTREAM 属性を持たない varbinary(max)
列にレプリケートされるデータは、そのデータ型の 2 GB の制限を超えないようにする必要があります。それ以外の場合は、実行時エラーが生成されます。 SQL Server 2000 サブスクライバーにデータをレプリケートする場合はサポートされていないため、指定されたスキーマ オプションに関係なく、FILESTREAM 属性をレプリケートすることをお勧めします。
注
SQL Server 2014 から SQL Server 2005 (9.x) サブスクライバーへの大きなデータ値のレプリケートは、最大 256 MB のデータ値に制限されます。 詳細については、「 最大容量仕様」を参照してください。
トランザクション レプリケーションに関する考慮事項
トランザクション レプリケーション用にパブリッシュされるテーブルで FILESTREAM 列を使用する場合は、次の考慮事項に注意してください。
FILESTREAM 属性を持つ列がテーブルに含まれている場合、sp_addpublicationの @sync_method プロパティにデータベース スナップショット文字またはデータベース スナップショット文字の値を使用することはできません。
max text repl size オプションは、レプリケーション用にパブリッシュされる列に挿入できるデータの最大量を指定します。 このオプションを使用して、レプリケートされる FILESTREAM データのサイズを制御できます。
FILESTREAM 属性をレプリケートするスキーマ オプションを指定したが、FILESTREAM で必要な
uniqueidentifier
列を除外する場合、または列の UNIQUE 制約をレプリケートしないように指定した場合、レプリケーションでは FILESTREAM 属性はレプリケートされません。 列は、varbinary(max)
列としてのみレプリケートされます。
マージ レプリケーションに関する考慮事項
マージ レプリケーション用にパブリッシュされるテーブルで FILESTREAM 列を使用する場合は、次の考慮事項に注意してください。
マージ レプリケーションと FILESTREAM の両方で、テーブル内の各行を識別するために
uniqueidentifier
データ型の列が必要です。 テーブルに列がない場合は、マージ レプリケーションによって列が自動的に追加されます。 マージ レプリケーションでは、列に ROWGUIDCOL プロパティを設定し、既定値として NEWID() または NEWSEQUENTIALID() を指定する必要があります。 FILESTREAM では、これらの要件に加えて、列に UNIQUE 制約を定義する必要があります。 これらの要件には、次の結果があります。マージ レプリケーション用に既にパブリッシュされているテーブルに FILESTREAM 列を追加する場合は、
uniqueidentifier
列に UNIQUE 制約があることを確認します。 UNIQUE 制約がない場合は、パブリケーション データベースのテーブルに名前付き制約を追加します。 既定では、マージ レプリケーションはこのスキーマ変更を発行し、各サブスクリプション データベースに適用されます。説明に従って UNIQUE 制約を手動で追加し、マージ レプリケーションを削除する場合は、まず UNIQUE 制約を削除する必要があります。そうしないと、レプリケーションの削除は失敗します。
既定では、マージ レプリケーションでは NEWSEQUENTIALID() が使用されます。これは、NEWID() よりも優れたパフォーマンスを提供できるためです。 マージ レプリケーション用にパブリッシュされるテーブルに
uniqueidentifier
列を追加する場合は、既定値として NEWSEQUENTIALID() を指定します。
マージ レプリケーションには、ラージ オブジェクトの種類をレプリケートするための最適化が含まれています。 この最適化は、sp_addmergearticleの @stream_blob_columns パラメーターによって制御 されます。 FILESTREAM 属性をレプリケートするスキーマ オプションを設定した場合、 @stream_blob_columns パラメーター値は
true
に設定されます。 この最適化は、 sp_changemergearticleを使用してオーバーライドできます。 このストアド プロシージャを使用すると、 @stream_blob_columns をfalse
に設定できます。 マージ レプリケーション用に既に発行されているテーブルに FILESTREAM 列を追加する場合は、sp_changemergearticleを使用してtrue
オプションを設定することをお勧めします。アーティクルの作成後に FILESTREAM のスキーマ オプションを有効にすると、FILESTREAM 列のデータが 2 GB を超え、レプリケーション中に競合が発生した場合、レプリケーションが失敗する可能性があります。 このような状況が発生することが予想される場合は、作成時に適切な FILESTREAM スキーマ オプションを有効にして、テーブルアーティクルを削除して再作成することをお勧めします。
マージ レプリケーションでは、 Web 同期を使用して HTTPS 接続経由で FILESTREAM データを同期できます。 このデータは、Web 同期の 50 MB の制限を超えることはできません。それ以外の場合は、実行時エラーが生成されます。
ログ配布
ログ配布では FILESTREAM がサポートされます。 プライマリ サーバーとセカンダリ サーバーの両方が SQL Server 2008 以降のバージョンを実行しており、FILESTREAM が有効になっている必要があります。
データベース ミラーリング
データベース ミラーリングは FILESTREAM をサポートしていません。 FILESTREAM ファイル グループをプリンシパル サーバーに作成することはできません。 FILESTREAM ファイル グループを含むデータベースに対してデータベース ミラーリングを構成することはできません。
Full-Text インデックス作成
フルテキスト インデックス作成 は、 varbinary(max)
列の場合と同じ方法で FILESTREAM 列で動作します。 FILESTREAM テーブルには、各 FILESTREAM BLOB のファイル名拡張子を含む列が必要です。 詳細については、「 Full-Text 検索を使用したクエリ、 検索のフィルターの構成と管理、 およびsys.fulltext_document_types (Transact-SQL)」を参照してください。
フルテキスト エンジンは、FILESTREAM BLOB の内容にインデックスを付けます。 画像などのファイルのインデックス作成は役に立たない場合があります。 FILESTREAM BLOB が更新されると、インデックスが再作成されます。
フェールオーバー クラスタリング
フェールオーバー クラスタリングでは、FILESTREAM ファイル グループを共有ディスクに配置する必要があります。 FILESTREAM インスタンスをホストするクラスター内の各ノードで FILESTREAM を有効にする必要があります。 詳細については、「 フェールオーバー クラスターでの FILESTREAM の設定」を参照してください。
SQL Server Express
SQL Server Express では FILESTREAM がサポートされています。 10 GB のデータベース サイズ制限には、FILESTREAM データ コンテナーは含まれません。
包含データベース
FILESTREAM 機能には、データベースの外部にある程度の構成が必要です。 そのため、FILESTREAM または FileTable を使用するデータベースは完全には含まれません。
包含データベースの特定の機能 (包含ユーザーなど) を使用する場合は、データベース包含を PARTIAL に設定できます。 ただし、この場合、データベース設定の一部はデータベースに含まれていないので、データベースの移動時に自動的に移動されないことに注意する必要があります。