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

Область применения:SQL Server

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

Группы доступности AlwaysOn и FileTables

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

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

    Примечание.

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

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

  • При любом доступе к данным FILESTREAM или FileTable через API файловой системы следует использовать имена виртуальной сети (VNN), а не имена компьютеров. Дополнительные сведения см. в разделе Использование FILESTREAM и FileTable с группами доступности Always On.

Секционирование и таблицы 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 и FileTables

Инструкции SELECT INTO из FileTable не распространяют семантику FileTable в созданной целевой таблице (так же, как столбцы FILESTREAM в обычной таблице). Все столбцы целевой таблицы ведут себя так же, как обычные столбцы. С ними не связана семантика FileTable.

Триггеры и FileTables

Триггеры 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 могло быть изменено.

  • Помимо этих последствий, триггеры в FileTables должны учитывать еще два дополнительных аспекта поведения.

    • При операциях нетранзакционного обновления 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.

Изоляция моментальных снимков и FileTables

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

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

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

    • Любые операции чтения столбца file_stream таблицы FileTable с помощью Transact-SQL завершаются сбоем. Операции INSERT и UPDATE со столбцом по-прежнему выполняются успешно, при условии, что они не читают данные из столбца file_stream.

    • Если инструкция Transact-SQL содержит табличные подсказки READCOMMITTEDLOCK, операции чтения выполняются успешно и устанавливают блокировки на строки вместо использования версионирования строк.

    • Транзакционные запросы Win32 на открытие FILESTREAM также завершаются ошибкой.

    • Нетранзакционный доступ Win32 к таблице FileTable будет выполнен успешно. Все внутренние запросы, выполненные FileTable, не затрагиваются.

    • Полнотекстовое индексирование всегда выполняется успешно, независимо от того, какие параметры заданы для базы данных (READ_COMMITTED_SNAPSHOT или ALLOW_SNAPSHOT_ISOLATION).

Вторичные базы данных, доступные для чтения

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

Автономные базы данных и таблицы FileTable

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

Если вы хотите использовать некоторые возможности автономных баз данных, например автономных пользователей, можно установить для параметра containment базы данных значение PARTIAL. Однако в этом случае некоторые параметры базы данных не содержатся в базе данных и не перемещаются автоматически при перемещении базы данных.