次の方法で共有


FileTable の管理

FileTable を管理するための一般的な管理タスクについて説明します。

方法: FileTable と関連オブジェクトの一覧を取得する

FileTable の一覧を取得するには、次のいずれかのカタログ ビューに対してクエリを実行します。

SELECT * FROM sys.filetables;  
GO  
  
SELECT * FROM sys.tables WHERE is_filetable = 1;  
GO  

関連する FileTable の作成時に作成されたシステム定義オブジェクトの一覧を取得するには、カタログ ビュー sys.filetable_system_defined_objects (Transact-SQL) に対してクエリを実行します。

SELECT object_id, OBJECT_NAME(object_id) AS 'Object Name'  
    FROM sys.filetable_system_defined_objects  
    WHERE object_id = filetable_object_id;  
GO  

データベース レベルでの非トランザクション アクセスの無効化と再有効化

特定の管理タスクに必要な排他アクセスを取得するには、非トランザクション アクセスを一時的に無効にする必要がある場合があります。

非トランザクション アクセスのレベルを変更するときの ALTER DATABASE ステートメントの動作

  • 非トランザクション アクセスを READ_ONLY または OFF に設定した場合、ALTER DATABASE コマンドは、要求された操作と競合する開いているファイル ハンドルがある限り、ユーザーに制御を返しません。 この操作と競合するファイル ハンドルには、次のものがあります。

    • NONEへのアクセスを設定する際、すべての開いているファイルハンドルが対象となります。

    • READ_ONLYへのアクセスを設定すると、すべてのファイル ハンドルが書き込みアクセス用に開かれます。

    開いているファイル ハンドルを終了する方法については、このトピックの「FileTable に関連付けられた開いているファイル ハンドルの終了」を参照してください。

    ALTER DATABASE コマンドが取り消されるか、タイムアウトで終了した場合、トランザクション・アクセスのレベルは変更されません。

  • WITH <termination> 句を指定して ALTER DATABASE ステートメントを呼び出す場合 (ROLLBACK AFTER integer [ SECONDS ] |ROLLBACK IMMEDIATE |NO_WAIT)、開いているすべての非トランザクション ファイル ハンドルが強制終了されます。

警告

開いているファイル ハンドルを削除すると、ユーザーが保存されていないデータを失う可能性があります。 この動作は、ファイル システム自体の動作と一致します。

非トランザクション アクセスを無効にした場合の影響

データベース レベルで非トランザクション アクセスのレベルを変更すると、データベース レベルのディレクトリの下にある FileTable ディレクトリに次の影響があります。

  • NONE にアクセスを設定すると、すべての FileTable ディレクトリとその内容にアクセスしたり、表示したりできなくなります。

  • READ_ONLYへのアクセスを設定すると、すべての FileTable ディレクトリとその内容も読み取り専用になります。

インスタンス レベルで FILESTREAM を無効にすると、そのインスタンス上のデータベース レベルのディレクトリと、その下の FileTable ディレクトリに次の影響があります。

  • FILESTREAM がインスタンス レベルで無効になっている場合、インスタンス上のデータベース レベルのディレクトリは表示されません。

方法: データベース レベルで非トランザクション アクセスを無効にして再度有効にする

詳細については、「ALTER DATABASE SET オプション (Transact-SQL)」を参照してください。

完全な非トランザクション アクセスを無効にするには
ALTER DATABASE ステートメントを呼び出し、READ_ONLYまたは OFF にNON_TRANSACTED_ACCESSの値を設定します

-- Disable write access.  
ALTER DATABASE database_name  
    SET FILESTREAM ( NON_TRANSACTED_ACCESS = READ_ONLY );  
GO  
  
-- Disable non-transactional access.  
ALTER DATABASE database_name  
    SET FILESTREAM ( NON_TRANSACTED_ACCESS = OFF );  
GO  

完全な非トランザクション アクセスを再度有効にするには
ALTER DATABASE ステートメントを呼び出し、NON_TRANSACTED_ACCESSの値を FULL に設定します。

ALTER DATABASE database_name  
    SET FILESTREAM ( NON_TRANSACTED_ACCESS = FULL );  
GO  

方法: データベース内の FileTable の可視性を確保する

データベース レベルのディレクトリとその下の FileTable ディレクトリは、次の条件がすべて満たされている場合に表示されます。

  1. FILESTREAM はインスタンス レベルで有効になっています。

  2. 非トランザクション アクセスは、データベース レベルで有効になります。

  3. データベース レベルで有効なディレクトリが指定されています。

テーブル レベルでの FileTable 名前空間の無効化と再有効化

FileTable 名前空間を無効にすると、FileTable で作成されたすべてのシステム定義の制約とトリガーが無効になります。 これは、FileTable セマンティクスを適用する費用を発生させることなく、Transact-SQL 操作を使用して FileTable を大規模に再構成する必要がある場合に便利です。 ただし、これらの操作により、FileTable が不整合な状態のままになり、FileTable 名前空間の再有効化を妨げる可能性があります。

FileTable 名前空間を無効にすると、次の結果が得られます。

  • FileTable 列とデータは、テーブルから物理的に削除されません。

  • FileTable ディレクトリと、それに含まれているファイルとディレクトリはファイル システムから消え、ファイル i/o アクセスでは使用できません。

  • システム定義の FileTable 列を削除して再作成することはできません。それ以外の場合は、DML 操作の通常の列のように動作します。

  • この操作ではテーブルにスキーマ ロックが必要なため、ファイル ハンドルを開いて FileTable 制約を無効にできません。

  • システム定義の制約やトリガーを含むすべての FileTable セマンティクスの適用は、FileTable 名前空間が無効になった後に停止します。

FileTable 名前空間を再度有効にすると、次の結果が得られます。

  • FileTable の整合性がチェックされます。 不整合が見つかった場合、エラーが発生し、FileTable は無効のままです。それ以外の場合、FileTable は再び有効になります。

  • システム定義の制約やトリガーなど、FileTable セマンティクスの適用が復元されます。

  • FileTable ディレクトリと、それに含まれるファイルとディレクトリがファイル システムに表示され、ファイル i/o アクセスに使用できるようになります。

方法: テーブル レベルで FileTable 名前空間を無効にして再度有効にする

ALTER TABLE ステートメントを { ENABLE | DISABLE } FILETABLE_NAMESPACE オプションを使用して呼び出します。

FileTable 名前空間を無効にするには

ALTER TABLE filetable_name  
   DISABLE FILETABLE_NAMESPACE;  
GO  

FileTable 名前空間を再度有効にするには

ALTER TABLE filetable_name  
   ENABLE FILETABLE_NAMESPACE;  
GO  

FileTable に関連付けられた開いているファイル ハンドルの終了

FileTable に格納されているファイルのハンドルを開く場合、特定の管理タスクに必要な排他アクセスを防ぐことができます。 緊急タスクを有効にするには、1 つ以上の FileTable に関連付けられている開いているファイル ハンドルを強制終了する必要がある場合があります。

警告

開いているファイル ハンドルを削除すると、ユーザーが保存されていないデータを失う可能性があります。 この動作は、ファイル システム自体の動作と一致します。

方法: FileTable に関連付けられている開いているファイル ハンドルの一覧を取得する

カタログ ビュー sys.dm_filestream_non_transacted_handles (Transact-SQL) に対してクエリを実行します。

SELECT * FROM sys.dm_filestream_non_transacted_handles;  
GO  

方法: FileTable に関連付けられている開いているファイル ハンドルを強制終了する

データベースまたは FileTable 内のすべての開いているファイル ハンドルを強制終了したり、特定のハンドルを強制終了したりするには、適切な引数を指定してストアド プロシージャ sp_kill_filestream_non_transacted_handles (Transact-SQL) を呼び出します。

USE database_name;  
  
-- Kill all open handles in all the filetables in the database.  
EXEC sp_kill_filestream_non_transacted_handles;  
GO  
  
-- Kill all open handles in a single filetable.  
EXEC sp_kill_filestream_non_transacted_handles @table_name = 'filetable_name';  
GO  
  
-- Kill a single handle.  
EXEC sp_kill_filestream_non_transacted_handles @handle_id = integer_handle_id;  
GO  

方法: FileTable によって保持されているロックを識別する

FileTable によって取得されるほとんどのロックは、アプリケーションによって開かれたファイルに対応します。

開いているファイルと関連するロックを識別するには
動的管理ビュー sys.dm_tran_locks (Transact-SQL)request_owner_id フィールドを、sys.dm_filestream_non_transacted_handles (Transact-SQL) のfcb_idフィールドと結合します。 場合によっては、ロックが 1 つの開いているファイル ハンドルに対応していません。

SELECT opened_file_name  
    FROM sys.dm_filestream_non_transacted_handles  
    WHERE fcb_id IN  
        ( SELECT request_owner_id FROM sys.dm_tran_locks );  
GO  

FileTable のセキュリティ

FileTable に格納されているファイルとディレクトリは、SQL Server のセキュリティによってのみ保護されます。 テーブルと列ベースのセキュリティは、ファイル システムアクセスと Transact-SQL アクセスに適用されます。 Windows ファイル システムのセキュリティ API と ACL の設定はサポートされていません。

ファイル データは FileTable の FILESTREAM 列として格納されるため、FILESTREAM ファイル グループとコンテナーに適用されるセキュリティとアクセスのアクセス許可も FileTable に適用されます。

FileTable のセキュリティと Transact-SQL アクセス
FileTable のデータへの Transact-SQL アクセスは、他のテーブルと同じ方法でセキュリティで保護されます。 データにアクセスまたは変更するすべての操作に対して、適切なテーブルレベルと列レベルのセキュリティ チェックが行われます。

FileTable のセキュリティとファイル システム のアクセス
ファイル システム API では、FileTable に格納されているファイルまたはディレクトリへのハンドルを開くために、FileTable の行全体に対する適切な SQL Server アクセス許可 (つまり、テーブル レベルのアクセス許可) が必要です。 ユーザーが FileTable 内の列に対する適切な SQL Server アクセス許可を持っていない場合、ファイル システムへのアクセスは拒否されます。

Backup と FileTable

SQL Server を使用して FileTable をバックアップすると、FILESTREAM データはデータベース内の構造化データでバックアップされます。 リレーショナル データを使用して FILESTREAM データをバックアップしない場合は、部分バックアップを使用して FILESTREAM ファイル グループを除外できます。

FileTable バックアップのトランザクション整合性

多くの管理ツールと操作 (バックアップ、ログ バックアップ、トランザクション レプリケーションを含む) は、トランザクション ログを読み取ることでトランザクション整合性データを読み取ります。 現時点では、トランザクションの一部として更新されたすべての FILESTREAM データを読み取る。 非トランザクション アクセスがデータベース レベルで有効になっていない場合、これらのツールと操作は完全なトランザクション整合性で動作します。

ただし、完全な非トランザクション アクセスが有効になっている場合、FileTable には、ツールまたはプロセスがトランザクション ログから読み取っているトランザクションよりも最近 (非トランザクション更新を使用して) 更新されたデータが含まれる可能性があります。 つまり、特定のトランザクションに対する "特定の時点" の復元操作には、そのトランザクションよりも新しい FILESTREAM データが含まれている可能性があります。 これは、FileTable で非トランザクション更新が許可されている場合に想定される動作です。

SQL Server Profiler と FileTable

SQL Server Profiler では、FileTable に格納されているファイルのトレース出力で、Windows ファイルの開く操作とファイルを閉じる操作をキャプチャできます。

監査とファイルテーブル

FileTable は、他のテーブルと同様に監査できます。 Howerver、Win32 アクセス パターンは、設定ベースの操作ではありません。 ファイル システム内の 1 つのアクションは、複数の Transact-SQL DML 操作に変換されます。 たとえば、Microsoft Word でファイルを開くと、複数の開く/閉じる/作成/名前変更/削除する操作と、対応する Transact-SQL DML アクティビティに変換されます。 これにより、詳細監査レコードが生成され、ファイル システム アクションと対応する Transact-SQL DML 監査レコードの間でレコードを関連付けるのが困難になります。

DBCC と FileTable

DBCC CHECKCONSTRAINTS を使用して、システム定義制約を含む FileTable の制約を検証できます。

こちらもご覧ください

FileTable と他の SQL Server 機能との互換性
FileTable DDL、関数、ストアド プロシージャ、およびビュー