介绍如何启用创建和使用 FileTable 的先决条件。
启用 FileTable 的必要条件
若要启用创建和使用 FileTable 的先决条件,请启用以下项:
在实例级别启用 FILESTREAM
FileTable 扩展 SQL Server FILESTREAM 功能的功能。 因此,必须先在 Windows 级别和 SQL Server 实例上启用 FILESTREAM 进行文件 I/O 访问,然后才能创建和使用 FileTable。
如何:在实例级别启用 FILESTREAM
有关如何启用 FILESTREAM 的信息,请参阅 “启用和配置 FILESTREAM”。
在实例级别调用 sp_configure
以启用 FILESTREAM 时,必须将filestream_access_level选项设置为 2。 有关详细信息,请参阅 文件流访问级别服务器配置选项。
如何:允许 FILESTREAM 通过防火墙
有关如何允许 FILESTREAM 通过防火墙的信息,请参阅 为 FILESTREAM 访问配置防火墙。
在数据库级别提供 FILESTREAM 文件组
在数据库中创建 FileTable 之前,数据库必须具有 FILESTREAM 文件组。 有关此先决条件的详细信息,请参阅 “创建 FILESTREAM-Enabled 数据库”。
在数据库级别启用非事务性访问
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 指定非事务性访问级别
- 创建新数据库时,请使用 NON_TRANSACTED_ACCESS FILESTREAM 选项调用 CREATE DATABASE (SQL Server 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 的父级。 有关详细信息,请参阅 使用 FileTable 中的目录和路径。
如何:在数据库级别指定 FileTable 的目录
指定的名称在数据库级目录的实例中必须是唯一的。
使用 Transact-SQL 为 FileTable 指定目录
- 创建新数据库时,请使用 DIRECTORY_NAME FILESTREAM 选项调用 CREATE DATABASE (SQL Server Transact-SQL) 语句。
```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 目录名称字段中指定目录名称。 有关此对话框的详细信息,请参阅数据库属性(选项页)。
如何:查看实例的现有目录名称
若要查看实例的现有目录名称列表,请查询目录视图 sys.database_filestream_options(Transact-SQL), 并检查 filestream_database_directory_name 列。
SELECT DB_NAME ( database_id ), directory_name
FROM sys.database_filestream_options;
GO
Database-Level 目录的要求和限制
调用 CREATE DATABASE 或 ALTER DATABASE 时,设置DIRECTORY_NAME是可选的。 如果未为 DIRECTORY_NAME指定值,则目录名称将保留为 null。 但是,在为 数据库级别DIRECTORY_NAME 指定值之前,无法在数据库中创建 FileTable。
提供的目录名称必须符合文件系统对有效目录名称的要求。
当数据库包含 FileTable 时,无法将 DIRECTORY_NAME 设置为 null 值。
附加或还原数据库时,如果新数据库具有目标实例中已存在的 DIRECTORY_NAME 值,则作将失败。 调用 CREATE DATABASE FOR ATTACH 或 RESTORE DATABASE 时,请为DIRECTORY_NAME指定唯一值。
将现有数据库升级到 SQL Server 2014 时, DIRECTORY_NAME 的值为 null。
在数据库级别启用或禁用非事务性访问时,该作不会检查是否已指定目录名称或目录名称是否唯一。
删除为 FileTable 启用的数据库时,将删除数据库级目录及其下所有 FileTable 的所有目录结构。