启用 FileTable 的先决条件

介绍如何启用创建和使用 FileTable 的先决条件。

启用 FileTable 的先决条件

若要启用创建和使用 FileTable 的先决条件,请启用下列项目:

在实例级别启用 FILESTREAM

FileTable 扩展了 SQL Server 的 FILESTREAM 功能的功能。 因此,必须先在 Windows 级别和 SQL Server 实例上为文件 I/O 访问启用 FILESTREAM,然后才能创建和使用 FileTable。

如何在实例级别启用 FILESTREAM

有关如何启用 FILESTREAM 的信息,请参阅 启用和配置 FILESTREAM

当您调用 sp_configure 在实例级别启用 FILESTREAM 时,必须将 filestream_access_level 选项设置为 2。 有关详细信息,请参阅 文件流访问级别服务器配置选项

如何允许 FILESTREAM 通过防火墙

有关如何允许 FILESTREAM 通过防火墙的信息,请参阅 Configure a Firewall for FILESTREAM Access

在数据库级别提供 FILESTREAM 文件组

数据库必须首先具有 FILESTREAM 文件组,然后您才能在该数据库中创建 FileTable。 有关此先决条件的详细信息,请参阅 创建启用了 FILESTREAM 的数据库

在数据库级别启用非事务性访问

FileTable 使 Windows 应用程序可以获取 FILESTREAM 数据的 Windows 文件句柄而不需要事务。 若要允许对存储在 SQL Server 中的文件进行这种非事务性访问,必须在数据库级别为将包含 FileTable 的每个数据库指定所需的非事务性访问级别。

如何检查是否在数据库上启用了非事务性访问

sys.database_filestream_options (Transact-SQL) 查询目录视图,并检查non_transacted_access列和non_transacted_access_desc列。

SELECT DB_NAME(database_id), non_transacted_access, non_transacted_access_desc  
    FROM sys.database_filestream_options;  
GO  

如何在数据库级别启用非事务性访问

非事务性访问的可用级别为 FULL、READ_ONLY 和 OFF。

使用 Transact-SQL 指定非事务性访问的级别

```sql  
CREATE DATABASE database_name  
    WITH FILESTREAM ( NON_TRANSACTED_ACCESS = FULL, DIRECTORY_NAME = N'directory_name' )  
```  
  • 更改现有数据库时,请使用 NON_TRANSACTED_ACCESS FILESTREAM 选项调用 ALTER DATABASE (Transact-SQL) 语句。

    ALTER DATABASE database_name  
        SET FILESTREAM ( NON_TRANSACTED_ACCESS = FULL, DIRECTORY_NAME = N'directory_name' )  
    

使用 SQL Server Management Studio 指定非事务性访问的级别
可以在“数据库属性” 对话框的“选项” 页的“FILESTREAM 非事务性访问” 字段中指定非事务性访问的级别。 有关此对话框的详细信息,请参阅 数据库属性 (选项页)

在数据库级别指定 FileTable 的目录

在数据库级别启用对文件的非事务性访问时,可以选择使用 DIRECTORY_NAME 选项同时提供一个目录名称。 如果启用非事务性访问时没有提供目录名称,则在以后必须提供它,这样才能在数据库中创建 FileTable。

在 FileTable 文件夹层次结构中,此数据库级目录将成为在实例级别为 FILESTREAM 指定的共享名称的子级以及在数据库中创建的 FileTable 的父级。 有关详细信息,请参阅 Work with Directories and Paths in FileTables

如何在数据库级别指定 FileTable 的目录

您指定的名称必须在跨数据库级目录的实例中是唯一的。

使用 Transact-SQL 指定 FileTable 的目录

```sql  
CREATE DATABASE database_name  
    WITH FILESTREAM ( NON_TRANSACTED_ACCESS = FULL, DIRECTORY_NAME = N'directory_name' );  
GO  
```  
  • 更改现有数据库时,请使用 DIRECTORY_NAME FILESTREAM 选项调用 ALTER DATABASE (Transact-SQL) 语句。 使用这些选项更改目录名称时,数据库必须以独占方式锁定,没有打开的文件句柄。

    ALTER DATABASE database_name  
        SET FILESTREAM ( NON_TRANSACTED_ACCESS = FULL, DIRECTORY_NAME = N'directory_name' );  
    GO  
    
  • 附加数据库时,使用 FOR ATTACH 选项和 DIRECTORY_NAME FILESTREAM 选项调用 CREATE DATABASE (SQL Server Transact-SQL) 语句。

    CREATE DATABASE database_name  
        FOR ATTACH WITH FILESTREAM ( DIRECTORY_NAME = N'directory_name' );  
    GO  
    
  • 还原数据库时,使用 DIRECTORY_NAME FILESTREAM 选项调用 RESTORE (Transact-SQL) 语句。

    RESTORE DATABASE database_name  
        WITH FILESTREAM ( DIRECTORY_NAME = N'directory_name' );  
    GO  
    

使用 SQL Server Management Studio 指定 FileTable 的目录
可以在“数据库属性” 对话框的“选项” 页的“FILESTREAM 目录名称” 字段中指定目录名称。 有关此对话框的详细信息,请参阅 数据库属性 (选项页)

如何查看实例的现有目录名称

若要查看实例的现有目录名称列表,请查询 Transact-SQL) sys.database_filestream_options (目录视图,并检查filestream_database_directory_name列。

SELECT DB_NAME ( database_id ), directory_name  
    FROM sys.database_filestream_options;  
GO  

数据库级别目录的要求和限制

  • 在调用 CREATE DATABASEALTER DATABASE 时,设置 DIRECTORY_NAME是可选的。 如果未指定 DIRECTORY_NAME的值,则目录名称仍是 Null。 但不能在数据库中创建 FileTable,直到在数据库级别指定了 DIRECTORY_NAME 的值。

  • 您提供的目录名称必须符合文件系统对有效目录名称的要求。

  • 当数据库包含 FileTable 时,不能将 DIRECTORY_NAME 设置回为 Null 值。

  • 附加或还原数据库时,如果新数据库的 DIRECTORY_NAME 值在目标实例中已存在,则该操作失败。 调用 CREATE DATABASE FOR ATTACHRESTORE DATABASE 时,指定 DIRECTORY_NAME的唯一值。

  • 将现有数据库升级到 SQL Server 2014 时,DIRECTORY_NAME值为 null。

  • 在数据库级别启用或禁用非事务性访问时,该操作不检查是否已指定目录名称或该名称是否唯一。

  • 删除已为 FileTable 启用的数据库时,将删除数据库级目录和其下的所有 FileTable 的所有目录结构。