描述如何建立新的 FileTable,或改變或卸除現有的 FileTable。
建立 FileTable
FileTable 是具有預先定義和固定架構的特殊用戶數據表。 此架構會儲存 FILESTREAM 資料、檔案和目錄資訊,以及檔案屬性。 如需 FileTable 架構的相關信息,請參閱 FileTable 架構。
您可以使用 Transact-SQL 或 SQL Server Management Studio 來建立新的 FileTable。 由於 FileTable 具有固定的架構,因此您不需要指定資料行清單。 建立 FileTable 的簡單語法可讓您指定:
目錄名稱。 在 FileTable 資料夾階層中,這個資料表層級目錄會成為資料庫層級所指定之資料庫目錄的子系,以及儲存在資料表中的檔案或目錄的父系。
要用於 FileTable 的 名稱 資料行中檔名的定序名稱。
要用於自動建立的 3 個主鍵和唯一約束的名稱。
如何建立檔案表格
使用 Transact-SQL 建立 FileTable
使用 AS FileTable 選項呼叫 CREATE TABLE (Transact-SQL) 語句,以建立 FileTable。 由於 FileTable 具有固定的架構,因此您不需要指定資料行清單。 您可以為新的 FileTable 指定下列設定:
FILETABLE_DIRECTORY。 指定目錄,做為 FileTable 中儲存之所有檔案和目錄的根目錄。 在資料庫的所有 FileTable 目錄名稱之間,此名稱必須是唯一的。 不論目前的定序設定為何,唯一性的比較不區分大小寫。
這個值具有 nvarchar(255) 的數據類型,並使用 固定的定序Latin1_General_CI_AS_KS_WS。
您所提供的目錄名稱必須符合有效目錄名稱的檔案系統需求。
在資料庫的所有 FileTable 目錄名稱之間,此名稱必須是唯一的。 唯一性比較不受大小寫影響,無論當前排序設定如何。
如果您在建立 FileTable 時未提供目錄名稱,則會使用 FileTable 本身的名稱作為目錄名稱。
FILETABLE_COLLATE_FILENAME。 指定要套用至 FileTable 中 Name 欄位的定序名稱。
指定的定序必須 不區分大小寫 ,才能符合 Windows 檔案命名語意。
如果您沒有提供 FILETABLE_COLLATE_FILENAME的值,或指定 database_default,數據行會繼承目前資料庫的定序。 如果目前的資料庫定序區分大小寫,就會引發錯誤, 而且 CREATE TABLE 作業會失敗。
您也可以指定要用於自動創建的 3 個主鍵和唯一約束的名稱。 如果您未提供名稱,則系統會產生名稱,如本主題稍後所述。
FILETABLE_PRIMARY_KEY_CONSTRAINT_NAME
FILETABLE_STREAMID_UNIQUE_CONSTRAINT_NAME
FILETABLE_FULLPATH_UNIQUE_CONSTRAINT_NAME 檔案表完整路徑唯一約束名稱
範例
下列範例會建立新的 FileTable,並指定 FILETABLE_DIRECTORY 和 FILETABLE_COLLATE_FILENAME的使用者定義值。
CREATE TABLE DocumentStore AS FileTable
WITH (
FileTable_Directory = 'DocumentTable',
FileTable_Collate_Filename = database_default
);
GO
下列範例也會建立新的 FileTable。 由於未指定使用者定義的值, FILETABLE_DIRECTORY 的值會變成 FileTable 的名稱、FILETABLE_COLLATE_FILENAME的值會變成 database_default ,而主鍵和唯一限制項會接收系統產生的名稱。
CREATE TABLE DocumentStore AS FileTable;
GO
使用 SQL Server Management Studio 建立 FileTable
在 [物件總管] 中,展開選取的資料庫底下的對象,然後以滑鼠右鍵按兩下 [ 數據表 ] 資料夾,然後選取 [ 新增 FileTable]。
此選項會開啟新的腳本視窗,其中包含您可以自定義並執行以建立 FileTable 的 Transact-SQL 腳本範本範本。 使用 [查詢] 功能表上的 [指定範本參數值] 選項,輕鬆地自定義腳本。
建立 FileTable 的需求和限制
您無法改變現有的數據表,將它轉換成 FileTable。
先前在資料庫層級指定的父目錄必須具有非 Null 值。 如需指定資料庫層級目錄的相關信息,請參閱 啟用 FileTable 的必要條件。
FileTable 需要有效的 FILESTREAM 檔案群組,因為 FileTable 包含 FILESTREAM 數據行。 您可以選擇性地將有效的 FILESTREAM 檔案群組指定為 CREATE TABLE 命令的一部分,以建立 FileTable。 如果您未指定檔案群組,則 FileTable 會使用資料庫的預設 FILESTREAM 檔案群組。 如果資料庫沒有 FILESTREAM 檔案群組,則會引發錯誤。
您無法在 CREATE TABLE...AS FILETABLE 語句中作為一部分來建立資料表約束。 不過,您稍後可以使用 ALTER TABLE 語句來新增條件約束。
您無法在 tempdb 資料庫或任何其他系統資料庫中建立 FileTable。
您無法建立 FileTable 做為臨時表。
修改 FileTable
由於 FileTable 具有預先定義的和固定架構,因此您無法新增或變更其數據行。 不過,您可以將自定義索引、觸發程式、條件約束和其他選項新增至 FileTable。
如需使用 ALTER TABLE 語句來啟用或停用 FileTable 命名空間的相關信息,包括系統定義的條件約束,請參閱管理 FileTable。
如何:變更 FileTable 的目錄
使用 Transact-SQL 變更 FileTable 的目錄
呼叫 ALTER TABLE 語句,並為 FILETABLE_DIRECTORY SET 選項提供有效的新值。
範例
ALTER TABLE filetable_name
SET ( FILETABLE_DIRECTORY = N'directory_name' );
GO
使用 SQL Server Management Studio 變更 FileTable 的目錄
在 [物件總管] 中,以滑鼠右鍵按兩下 [FileTable],然後選取 [ 屬性 ] 以開啟 [資料表屬性 ] 對話框。 在 [FileTable] 頁面上,輸入 FileTable 目錄名稱的新值。
變更 FileTable 的要求和限制
您無法改變 FILETABLE_COLLATE_FILENAME 的值。
您無法變更、卸除或停用 FileTable 的系統定義資料行。
您無法將新的使用者資料列、計算資料行或儲存的計算資料行加入 FileTable。
刪除 FileTable
您可以使用 DROP TABLE (Transact-SQL) 語句的一般語法來卸除 FileTable。
當您卸除 FileTable 時,也會卸除下列物件:
所有 FileTable 的列,以及與該表相關聯的所有物件,例如索引、約束和觸發程式,也會被刪除。
FileTable 目錄及其所包含的子目錄會從資料庫的 FILESTREAM 檔案和目錄階層中消失。
如果 FileTable 的檔案命名空間中有開啟的檔案句柄,DROP TABLE 命令就會失敗。 如需關閉開啟句柄的相關資訊,請參閱管理文件表。
當您建立 FileTable 時,會建立其他資料庫物件
當您建立新的 FileTable 時,也會建立一些系統定義的索引和條件約束。 您無法改變或卸除這些物件;它們只會在 FileTable 本身卸除時消失。 若要檢視這些物件的清單,請查詢目錄檢視 sys.filetable_system_defined_objects (Transact-SQL) 。
--View all objects for all filetables, unsorted
SELECT * FROM sys.filetable_system_defined_objects;
GO
--View sorted list with friendly names
SELECT OBJECT_NAME(parent_object_id) AS 'FileTable', OBJECT_NAME(object_id) AS 'System-defined Object'
FROM sys.filetable_system_defined_objects
ORDER BY FileTable, 'System-defined Object';
GO
建立新 FileTable 時所建立的索引
當您建立新的 FileTable 時,也會建立下列系統定義的索引:
| 欄位 | 索引類型 |
| [path_locator]ASC | 主鍵,非叢集 |
| [parent_path_locator]ASC、 [name]ASC |
Unique、nonclustered |
| [stream_id]ASC | 惟一非群集 |
當您建立新的 FileTable 時所建立的條件約束
當您建立新的 FileTable 時,也會建立下列系統定義的條件約束:
| 限制條件 | 強制執行 |
|---|---|
| 下列資料行的預設條件約束: creation_time is_archive is_directory is_hidden is_offline is_readonly is_system is_temporary 最後存取時間 last_write_time path_locator stream_id |
系統定義的預設條件約束會強制執行指定數據行的預設值。 |
| 檢查約束條件 | 系統定義的檢查條件約束會強制執行下列需求: 有效的檔名。 有效的檔案屬性。 父對象必須是目錄。 命名空間階層會在檔案操作期間鎖定。 |
系統定義條件約束的命名慣例
上述系統定義的條件是以格式<constraintType>_<tablename>[_<columnname>]_<uniquifier>命名,其中:
< >constraint_type為 CK (檢查條件約束)、DF (預設條件約束)、FK (外鍵)、PK(主鍵),或 UQ (唯一條件約束)。
<uniquifier> 是系統產生的字串,可讓名稱是唯一的。 此字串可能包含 FileTable 名稱和唯一識別碼。