Управление таблицами FileTable

Применимо к:SQL Server

Описывает стандартные административные задачи по управлению таблицами FileTables.

Практическое руководство. Получение списка таблиц 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;  
GO  

Отключить и снова включить нетранзакционный доступ на уровне базы данных

Для монопольного доступа, необходимого для выполнения некоторых задач администрирования, может потребоваться временно отключить нетранзакционный доступ.

Поведение инструкции ALTER DATABASE при изменении уровня нетранзакционного доступа

  • В случае задания для нетранзакционного доступа значения READ_ONLY или OFF команда ALTER DATABASE не возвращает управление пользователю, пока имеются открытые дескрипторы файлов, конфликтующие с запрошенной операцией. Дескрипторы файлов, которые конфликтуют с этой операцией:

    • Если доступ установлен в режим NONE, то все открытые дескрипторы файлов.

    • Если доступ установлен в режим READ_ONLY, все дескрипторы файлов открыты для записи.

    Сведения об уничтожении открытых дескрипторов файлов см. в подразделе Уничтожение открытых дескрипторов файлов, связанных с таблицей FileTable этого раздела.

    Если команда ALTER DATABASE отменяется или истекает ее время ожидания, уровень транзакционного доступа изменен не будет.

  • При вызове инструкции ALTER DATABASE с предложением завершения> WITH <(ROLLBACK AFTER целое число [ СЕКУНД] | ОТКАТ НЕМЕДЛЕННО | NO_WAIT), то все открытые дескрипторы файлов без транзакций будут убиты.

Предупреждение

При уничтожении открытых дескрипторов файлов пользователи могут потерять несохраненные данные. Такое поведение согласуется с поведением самой файловой системы.

Последствия отключения нетранзакционного доступа

Изменение уровня нетранзакционного доступа на уровне базы данных оказывает следующее влияние на каталоги FileTable, вложенные в каталог уровня базы данных.

  • Если доступ установлен в режим NONE, все каталоги FileTable и их содержимое становятся недоступными и невидимыми.

  • Если доступ установлен в режим READ_ONLY, все каталоги FileTable и их содержимое доступны только для чтения.

Отключение FILESTREAM на уровне экземпляра оказывает следующее влияние на каталоги уровня базы данных этого экземпляра и вложенные в них каталоги FileTable.

  • Если FILESTREAM отключен на уровне экземпляра, невидимыми будут все каталоги уровня базы данных этого экземпляра.

Практическое руководство. Отключение и повторное включение нетранзакционного доступа на уровне базы данных

Дополнительные сведения см. в статье Параметры ALTER DATABASE SET (Transact-SQL).

Отключение полного нетранзакционного доступа
Вызовите инструкцию ALTER DATABASE и задайте параметру NON_TRANSACTED_ACCESS значение READ_ONLY или OFF.

-- 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  

Практическое руководство. Обеспечение видимости таблиц FileTables в базе данных

Каталог уровня базы данных и находящиеся в нем каталоги FileTable отображаются при соблюдении всех следующих условий.

  1. Функция FILESTREAM включена на уровне экземпляра.

  2. Нетранзакционный доступ включен на уровне базы данных.

  3. На уровне базы данных указан допустимый каталог.

Отключение и повторное включение пространства имен FileTable на уровне таблицы

При отключении пространства имен FileTable отключаются все системные ограничения и триггеры, созданные в таблице FileTable. Это полезно в случаях, когда файловый таблицы необходимо реорганизовать в большом масштабе с помощью операций Transact-SQL без применения семантики FileTable. Но это может привести к несогласованному состоянию таблицы FileTable, что может не позволить снова включить пространство имен FileTable.

Отключение пространства имен FileTable имеет следующие результаты.

  • Столбцы и данные FileTable не будут физически удалены из таблицы.

  • Каталог таблицы FileTable, а также содержащиеся в нем файлы и каталоги удаляются из файловой системы и становятся недоступными для файлового ввода-вывода.

  • Системные столбцы таблицы FileTable нельзя удалить и создать заново, в остальном же они ведут себя так же, как любые другие столбцы в операциях DML.

  • Открытые дескрипторы файлов не позволяют отключить ограничения FileTable, поскольку для выполнения этой операции требуется заблокировать схему в таблице.

  • Действие семантики FileTable, включая системные ограничения и триггеры, прекращается после отключения пространства имен FileTable.

Повторное включение пространства имен FileTable имеет следующие результаты.

  • Таблица FileTable проверяется на согласованность. При обнаружении несогласованности возникает ошибка, и таблица FileTable остается отключенной. В противном случае, таблица FileTable будет включена.

  • Действие семантики FileTable, включая системные ограничения и триггеры, будет восстановлено.

  • Каталог таблицы FileTable, а также содержащиеся в нем файлы и каталоги появляются в файловой системе и становятся доступными для файлового ввода-вывода.

Практическое руководство. Отключение и повторное включение пространства имен 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, могут помешать монопольному доступу, который требуется для выполнения определенных задач по администрированию. Для включения срочных задач может потребоваться уничтожить открытые дескрипторы файлов, связанные с одной или несколькими таблицами FileTable.

Предупреждение

При уничтожении открытых дескрипторов файлов пользователи могут потерять несохраненные данные. Такое поведение согласуется с поведением самой файловой системы.

Практическое руководство. Получение списка открытых дескрипторов файлов, связанных с таблицей FileTable

Запросите представление каталога sys.dm_filestream_non_transacted_handles (Transact-SQL).

SELECT * FROM sys.dm_filestream_non_transacted_handles;  
GO  

Практическое руководство. Уничтожение открытых дескрипторов файлов, связанных с таблицей FileTable

Вызовите хранимую процедуру sp_kill_filestream_non_transacted_handles (Transact-SQL) с соответствующими аргументами, чтобы убить все открытые дескрипторы файлов в базе данных или в FileTable или убить конкретный дескриптор.

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 связано с файлами, открытыми приложениями.

Определение открытых файлов и связанных с ними блокировок
Присоедините поле request_owner_id в динамическом представлении управления sys.dm_tran_locks (Transact-SQL) с полем fcb_id в sys.dm_filestream_non_transacted_handles (Transact-SQL). В некоторых случаях блокировка связана с несколькими открытыми файлами.

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. API-интерфейсы безопасности файловой системы Windows и параметры ACL не поддерживаются.

Права и разрешения на доступ, применимые к группам файлов и контейнерам FILESTREAM, также применяются и к таблице FileTable, поскольку данные файлов хранятся в столбце FILESTREAM таблицы FileTable.

Безопасность FileTable и доступ Transact-SQL
Доступ Transact-SQL к данным в FileTables обеспечивается так же, как и любая другая таблица. Соответствующие проверки безопасности на уровне таблицы и столбца выполняются для каждой операции, которая производит доступ или изменение данных.

Безопасность таблиц FileTable и доступ файловой системы
Api файловой системы требуют соответствующих разрешений SQL Server для всей строки в FileTable (то есть разрешения на уровне таблицы), чтобы открыть дескриптор файла или каталога, хранящегося в FileTable. Если у пользователя нет соответствующего разрешения SQL Server для любого столбца в FileTable, то доступ к файловой системе запрещен.

Резервное копирование и таблицы FileTable

При использовании SQL Server для резервного копирования таблицы FileTable данные FILESTREAM резервируются со структурированными данными в базе данных. Если резервное копирование данных FILESTREAM при помощи реляционных данных выполнять нежелательно, для исключения файловых групп FILESTREAM можно воспользоваться частичным резервным копированием.

Согласованность транзакций резервных копий таблиц FileTable

Многие средства и операции администрирования (включая резервное копирование, резервное копирование журналов и репликацию транзакций) осуществляют чтение транзакционно согласованных данных путем чтения журналов транзакций. В это время они считывают все данные FILESTREAM, обновленные в рамках транзакции. Если нетранзакционный доступ не включен на уровне базы данных, эти средства и операции работают в режиме полной транзакционной согласованности.

Однако, когда включен полный нетранзакционный доступ, таблица FileTable может содержать данные, которые были обновлены (с помощью нетранзакционного обновления) уже после выполнения транзакции, которую средство или процесс считывает из журнала транзакций. Это означает, что операция восстановления на момент времени для определенной транзакции может содержать данные FILESTREAM более свежие, чем транзакция. Это ожидаемое поведение при включенном нетранзакционном обновлении для таблиц FileTables.

Приложение SQL Server Profiler и таблицы FileTable

SQL Server Profiler может записывать операции открытия и закрытия файлов Windows в выходных данных трассировки для файлов, хранящихся в fileTable.

Аудит и таблицы FileTable

Аудит таблицы FileTable проводится так же, как и для любых других таблиц. Однако шаблоны доступа Win32 не являются операциями на основе множеств. Одно действие в файловой системе преобразуется в несколько DML-операций Transact-SQL. Например, открытие файла в Microsoft Word преобразуется в несколько операций открытия/закрытия/создания/переименования/удаления и соответствующие DML-операции Transact-SQL. Это приводит к записи подробных сведений аудита, где трудно сопоставить записи, относящиеся к действиям файловой системы, и соответствующие записи аудита DML в Transact-SQL.

DBCC и таблицы FileTable

С помощью инструкции DBCC CHECKCONSTRAINTS можно проверить ограничения для таблицы FileTable, включая системные ограничения.

См. также

Совместимость FileTable с другими компонентами SQL Server
Инструкции FileTable языка DDL, функции, хранимые процедуры и представления