Совместимость FileTable с другими компонентами SQL Server
Область применения: SQL Server
Описывает работу таблиц FileTable совместно с другими компонентами SQL Server.
Группы доступности AlwaysOn и FileTables
Если база данных, содержащая данные FILESTREAM или FileTable, принадлежит группе доступности AlwaysOn:
Функции FileTable частично поддерживаются группами доступности AlwaysOn. После отработки отказа данные FileTable доступны на первичной реплике, но данные FileTable недоступны для доступных для чтения вторичных реплик.
Примечание.
После отработки отказа поддерживаются все функции FILESTREAM. Данные FILESTREAM доступны как в доступных для чтения вторичных репликах, так и в новой первичной реплике.
Функции FILESTREAM и FileTable принимают или возвращают имена виртуальной сети, а не имена компьютеров. Дополнительные сведения об этих функциях см. в разделе FILESTREAM и FileTable Functions (Transact-SQL).
При осуществлении любого доступа к данным FILESTREAM или FileTable посредством API-интерфейса файловой системы будут использоваться имена виртуальной сети, а не имена компьютеров. Дополнительные сведения см. в разделе "Использование FILESTREAM и FileTable" с группами доступности AlwaysOn.
Секционирование и таблицы FileTable
Секционирование не поддерживается в FileTables. При поддержке нескольких файловых групп FILESTREAM в большинстве случаев чистые проблемы масштабирования можно решать без использования секционирования (в отличие от файловых групп FILESTREAM в SQL 2008).
Репликация и таблицы FileTable
Репликация и связанные функции (включая репликацию транзакций, репликацию слиянием, запись измененных данных и отслеживание изменений) не поддерживаются в FileTables.
Семантика транзакций и таблицы FileTable
приложения Windows
Приложения Windows не понимают транзакции базы данных, поэтому операции записи Windows не предоставляют свойства ACID транзакции базы данных. Поэтому откат транзакций и восстановление невозможно с помощью операций обновления Windows.
Приложения Transact-SQL
Для приложений Transact-SQL, работающих с столбцом FILESTREAM (file_stream) в FileTable, семантика изоляции совпадает с типом данных FILESTREAM в обычной пользовательской таблице.
Уведомления о запросах и таблицы FileTable
Запрос не может содержать ссылку на столбец FILESTREAM в FileTable, в предложении WHERE или любой другой части запроса.
Инструкция SELECT INTO и таблицы FileTable
Инструкции SELECT INTO из FileTable не распространяют семантику FileTable в созданной целевой таблице (так же, как столбцы FILESTREAM в обычной таблице). Все столбцы целевой таблицы ведут себя так же, как обычные столбцы. У них нет семантики FileTable.
Триггеры и таблицы FileTable
Триггеры DDL (язык определения данных)
В работе триггеров DDL с таблицами FileTable нет никаких особенностей. Обычные операции DDL активируются для операций создания и изменения базы данных, а также операций CREATE/ALTER TABLE для FileTables. С помощью вызова функции EVENTDATA() триггеры могут получать фактические данные событий, включая текст команды DDL и другие сведения. Новых событий или изменений в существующей схеме Eventdata нет.
Триггеры DML (язык обработки данных)
Эти ограничения применяются во время операции DDL для создания триггеров.
FileTables не поддерживают триггеры INSTEAD OF для операций DML. Это существующее ограничение для всех таблиц, содержащих столбцы FILESTREAM.
FileTables поддерживает триггеры AFTER для операций DML.
Триггеры, определенные в FileTable, не могут обновлять файлы FileTable (включая родительскую таблицы FileTable). Это ограничение предназначено в первую очередь для предотвращения конфликтов блокировки триггера с блокировками файловой системы в одной транзакции.
Нетранзакционный доступ и его влияние на триггеры
Если в базе данных разрешен нетранзакционный доступ для обновления, можно выполнить обновление данных FILESTREAM на месте в любой таблице, в том числе в таблице FileTable в этой базе данных. В результате этого исходный образ содержимого FILESTREAM может оказаться недоступным для использования триггерами.
Для операций обновления без транзакций через файловую систему SQL Server создает внутреннюю транзакцию для записи операции CloseHandle, и все определенные триггеры DML могут быть запущены в рамках этой транзакции. Откат такой транзакции внутри тела триггера, хотя и не предотвращается, не откатывает изменения, выполненные в FILESTREAM. Этот откат также может предотвратить срабатывание триггеров UPDATE, даже если содержимое FILESTREAM будет изменено.
Наряду с такими особенностями, для триггеров в таблицах FileTable следует предусматривать две дополнительные возможности.
При операциях обновления без транзакций в FileTable через файловую систему возможно, что содержимое FILESTREAM может быть исключительно заблокировано другими операциями Win32 и может быть недоступно для чтения и записи через текст триггера. В таких случаях любая попытка доступа к содержимому FILESTREAM в тексте триггера может привести к ошибке "Нарушение правил общего доступа". Необходимо предусмотреть триггеры, которые будут соответствующим образом обрабатывать такие ошибки.
Образ FILESTREAM может быть не стабильным, так как в некоторых случаях он может активно записываться другими не транзакционными обновлениями одновременно (из-за режимов общего доступа, разрешенных в файловой системе).
Ненормальное завершение дескрипторов Win32, например явное убийство дескрипторов Win32 администратором или сбоем базы данных, не выполняйте триггеры пользователей во время операций восстановления, даже если содержимое FILESTREAM может быть изменено ненормально завершенным приложением Win32.
Представления и таблицы FileTable
Представления
Представления могут создаваться для таблицы FileTable так же, как для любой другой таблицы. Однако в отношении представления, созданного для таблицы FileTable, действуют следующие ограничения.
Представления не могут иметь семантику FileTable. То есть столбцы в представлении (включая столбцы атрибутов файла) ведут себя так же, как обычные столбцы представления без специальной семантики, и то же самое верно для строк, представляющих файлы и каталоги.
Представления могут быть обновлены на основе семантики "обновляемого представления", но базовые ограничения таблицы могут отклонять обновления так же, как и в таблице.
Путь к файлу можно визуализировать в представлении, добавив его в виде явного столбца в представлении. Например:
CREATE VIEW MP3FILES AS SELECT column1, column2, ..., GetFileNamespacePath() AS PATH, column3,... FROM Documents
Индексированные представления
В настоящее время индексированные представления не могут включать столбцы FILESTREAM или вычисляемые или сохраненные вычисляемые столбцы, зависящие от столбцов FILESTREAM. Это также верно в отношении представлений, определенных для таблиц FileTable.
Изоляция моментальных снимков и таблицы FileTable
Изоляция моментальных снимков чтения (RCSI) и изоляция моментальных снимков (SI) зависят от возможности создания моментального снимка данных, доступных для читателей, даже если операции обновления происходят на данных. Тем не менее таблицы FileTable позволяют осуществлять нетранзакционный доступ на запись к данным FILESTREAM. В результате следующие ограничения применяются к этим функциям в базах данных, содержащих FileTables:
В базе данных, содержащей таблицы FileTable, может быть включена изоляция RCSI/SI.
Если для базы данных установлен нетранзакционный доступ уровня FULL, то транзакция выполняется в режиме RCSI или SI. Последняя имеет следующие особенности.
Сбой всех операций чтения Transact-SQL столбца FileTable file_stream. INSERT и UPDATE в столбце по-прежнему выполняются успешно, если они не считываются из столбца file_stream.
Если инструкция Transact-SQL указывает указания таблицы READCOMMITTEDLOCK, операции чтения успешно и блокируют строки, а не используют управление версиями строк.
Транзакционная операция Win32 по открытию FILESTREAM также завершится ошибкой.
Нетранзакционный доступ Win32 к таблице FileTable будет выполнен успешно. Все внутренние запросы, выполненные FileTable, не затрагиваются.
Полнотекстовое индексирование всегда будет успешной независимо от параметров базы данных (READ_COMMITTED_SNAPSHOT или ALLOW_SNAPSHOT_ISOLATION).
Базы данных-получатели, доступные для чтения
Те же рекомендации, что и для моментальных снимков, применяются для баз данных-получателей только для чтения, в соответствии с описанием в предыдущем разделе Изоляция моментальных снимков и таблицы FileTable.
Автономные базы данных и таблицы FileTable
Для компонента FILESTREAM, от которого зависит функциональность FileTable, требуется выполнение определенной настройки вне базы данных. Поэтому база данных, использующая FILESTREAM или FileTable, не полностью содержится.
Для автономности базы данных можно установить значение PARTIAL при необходимости использовать некоторые функции автономных баз данных, например такие, как функция автономных пользователей. Однако в этом случае некоторые параметры базы данных не содержатся в базе данных и не перемещаются автоматически при перемещении базы данных.