Совместимость FileTable с другими компонентами SQL Server

Описывает работу таблиц FileTable совместно с другими компонентами SQL Server.

Группы доступности AlwaysOn и таблицы FileTable

Если база данных, содержащая данные FILESTREAM или FileTable, принадлежит группе доступности:

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

    Примечание

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

  • Функции FILESTREAM и FileTable принимают или возвращают имена виртуальной сети, а не имена компьютеров. Дополнительные сведения об этих функциях см. в разделе Функции Filestream и FileTable (Transact-SQL).

  • При осуществлении любого доступа к данным FILESTREAM или FileTable посредством API-интерфейса файловой системы будут использоваться имена виртуальной сети, а не имена компьютеров. Дополнительные сведения см. в разделах FILESTREAM и FileTable с группами доступности AlwaysOn (SQL Server).

Секционирование и таблицы FileTable

Секционирование таблиц FileTable не поддерживается. Благодаря поддержке нескольких файловых групп FILESTREAM проблемы с увеличением масштаба можно решить без необходимости секционирования в большинстве сценариев (в отличие от SQL 2008 FILESTREAM).

Репликация и таблицы FileTable

Репликация и связанные с ней функции (включая репликацию транзакций, репликацию слиянием, отслеживание измененных данных и изменений) для таблиц FileTable не поддерживаются.

Семантика транзакций и таблицы FileTable

приложения Windows
Приложения Windows не распознают транзакции базы данных, поэтому операции записи в Windows не предоставляют свойства ACID транзакций базы данных. Поэтому операции обновления в Windows не позволяют выполнять откат транзакций и восстановление.

Приложения Transact-SQL
Для приложений TSQL, работающих со столбцом 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 DATABASE, а также для операций CREATE или ALTER TABLE для таблиц FileTable. С помощью вызова функции EVENTDATA() триггеры могут получать фактические данные событий, включая текст команды DDL и другие сведения. Новых событий или изменений в существующей схеме Eventdata нет.

Триггеры языка обработки данных (DML)
При выполнении операции DDL по созданию триггеров будут действовать следующие ограничения.

  • Таблицы FileTable НЕ поддерживают триггеры INSTEAD OF для операций DML. Это существующее ограничение для всех таблиц, содержащих столбцы FILESTREAM.

  • Таблицы FileTable будут поддерживать триггеры 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

Изоляция моментальных снимков READ COMMITTED (RCSI) и изоляция моментальных снимков (SI) зависят от возможности иметь моментальный снимок данных, доступный для модулей чтения, даже во время обновления данных. Тем не менее таблицы FileTable позволяют осуществлять нетранзакционный доступ на запись к данным FILESTREAM. В результате на использование этих функций в базах данных, содержащих таблицы FileTable, накладываются следующие ограничения.

  • В базе данных, содержащей таблицы FileTable, может быть включена изоляция RCSI/SI.

  • Если для базы данных установлен нетранзакционный доступ уровня FULL, то транзакция выполняется в режиме RCSI или SI. Последняя имеет следующие особенности.

    • Все операции чтения в Transact-SQL file_stream столбца FileTable завершаются ошибкой. Операции 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 при необходимости использовать некоторые функции автономных баз данных, например такие, как функция автономных пользователей. В этом случае следует иметь в виду, что некоторые параметры базы данных не хранятся в самой базе данных и не перемещаются автоматически при перемещении базы данных.

См. также:

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