Фильтрация опубликованных данных
Фильтрация статей таблиц позволяет создавать секции публикуемых данных. С помощью фильтрации опубликованных данных можно достичь следующих целей:
Минимизировать объем данных, передаваемых по сети.
Снизить необходимый подписчику объем для хранения.
Настраивать публикации и приложения на основе индивидуальных требований подписчиков.
Избежать конфликтов или уменьшить их количество, если подписчики обновляют данные, так как различным подписчикам можно отправить различные секции данных (то есть два подписчика не будут обновлять одни и те же значения данных).
Избежать передачи конфиденциальных данных. Фильтры строк и фильтры столбцов могут быть использованы для ограничения доступа подписчика к данным. При репликации слиянием может возникать проблема безопасности, если используется параметризованный фильтр, содержащий HOST_NAME(). Дополнительные сведения см. в подразделе «Фильтрация с использованием HOST_NAME()» раздела Параметризованные фильтры строк.
Репликация предлагает четыре типа фильтров:
Статические фильтры строк, которые доступны со всеми типами репликаций.
Используя статические фильтры строк, можно выбрать для публикации подмножество строк. Все подписчики на фильтрованную публикацию получают одно и то же подмножество строк фильтрованной таблицы. Дополнительные сведения см. в подразделе «Статические фильтры строк» данного раздела.
Фильтры столбцов, доступные со всеми типами репликаций.
Используя фильтры столбцов, можно выбрать для публикации подмножество столбцов. Дополнительные сведения см. в подразделе «Фильтры столбцов» данного раздела.
Параметризованные фильтры строк, доступные только с репликацией слиянием.
Используя параметризованные фильтры строк, можно выбрать для публикации подмножество строк. В отличие от статических фильтров, которые отправляют одно и то же подмножество строк всем подписчикам, параметризованные фильтры строк используют получаемые от подписчиков значения данных для отправки подписчикам разных подмножеств строк. Дополнительные сведения см. в разделе Параметризованные фильтры строк.
Фильтры соединения, доступные только с репликацией слиянием.
Используя фильтры соединения, можно расширить фильтр строк с одной публикуемой таблицы на другую. Дополнительные сведения см. в разделе Фильтры соединения.
Статические фильтры строк
На следующей иллюстрации показана опубликованная таблица, которая отфильтрована так, что в публикацию включаются только строки 2, 3 и 6.
Статический строковой фильтр использует предложение WHERE для отбора соответствующих данных для публикации; необходимо указать заключительную часть предложения WHERE. Рассмотрите таблицу Product в примере базы данных AdventureWorks, содержащую столбец ProductLine. Для публикации только строк с данными о продуктах, относящихся к горным велосипедам, укажите ProductLine = 'M'.
Применение статического фильтра строк приводит к выборке одного набора данных для каждой публикации. В предыдущем примере все подписчики получили бы только строки с данными о продуктах, относящихся к горным велосипедам. Если имеется другой подписчик, которому нужны только строки с данными о продуктах, относящихся к дорожным велосипедам,
с помощью репликации моментальных снимков или репликации транзакций можно создать другую публикацию и включить таблицу в обе публикации (в предложении фильтра для статьи в этой публикации укажите ProductLine = 'R').
Примечание Фильтры строк в публикациях транзакций могут существенно увеличить объем дополнительно выполняемых служебных операций, поскольку предложение фильтра статьи оценивается для каждой строки журнала, записанной для публикуемой таблицы, с целью определения необходимости репликации строки. Необходимо избегать фильтров строк в публикациях транзакций, если каждый узел репликации может поддерживать полную загрузку данных, а общий набор данных достаточно невелик.
Вместо создания нескольких публикаций со статическими фильтрами строк используйте с репликацией слиянием параметризованные фильтры строк. Дополнительные сведения см. в разделе Параметризованные фильтры строк.
Сведения об определении или изменении статического строкового фильтра см. в разделе Определение и изменение статического строкового фильтра.
Фильтры столбцов
На следующей иллюстрации показана публикация, которая отфильтровывает столбец «C».
Как показано здесь, можно также применять фильтр строк и фильтр столбцов совместно.
После создания публикации можно использовать фильтр столбцов, чтобы удалить столбец из существующей публикации, но сохранить его в таблице у издателя, а также, чтобы включить существующий столбец в публикацию. Для внесения других изменений, например, для добавления нового столбца в таблицу с последующим добавлением этой таблицы в опубликованную статью, используйте репликацию изменения схемы. Дополнительные сведения см. в подразделах «Добавление столбцов» и «Удаление столбцов» раздела Внесение изменений схем в базы данных публикации.
Типы столбцов, перечисленных в следующей таблице, не могут быть отфильтрованы из определенных типов публикаций.
Тип столбца |
Тип публикации и параметры |
---|---|
Первичный ключевой столбец |
Первичные ключевые столбцы требуются во всех таблицах публикации транзакций. Первичные ключи не требуются для таблиц в публикациях слиянием, но если первичный ключевой столбец имеется, то к нему не может быть применен фильтр. |
Внешний ключевой столбец |
Все публикации создаются с использованием мастера создания публикаций. Внешние ключевые столбцы могут фильтроваться с помощью хранимых процедур Transact-SQL. Дополнительные сведения см. в разделе Определение или изменение фильтра столбцов. |
Столбец rowguid |
Публикация слиянием 1 |
Столбец msrepl_tran_version |
Публикации моментальных снимков или публикации транзакций, разрешающие использование обновляемых подписок |
Столбцы, не допускающие значения NULL и не имеющие значений по умолчанию или набора свойств IDENTITY. |
Публикации моментальных снимков или публикации транзакций, разрешающие использование обновляемых подписок |
Столбцы с уникальными ограничениями или индексами |
Публикации моментальных снимков или публикации транзакций, разрешающие использование обновляемых подписок |
Все столбцы в публикации слиянием SQL Server 7.0 |
В публикациях слиянием SQL Server 7.0 к столбцам фильтр применен быть не может. |
Отметка времени |
Публикации моментальных снимков или публикации транзакций SQL Server 7.0, которые разрешают использование обновляемых подписок |
1. Если вы публикуете таблицу в публикации слиянием и эта таблица уже содержит столбец с данными типа uniqueidentifier и с набором свойств ROWGUIDCOL, то репликация может использовать этот столбец вместо создания дополнительного столбца с именем rowguid. В этом случае должен быть опубликован существующий столбец.
Сведения об определении или изменении фильтра столбцов см. в разделе Определение или изменение фильтра столбцов.
Вопросы применения фильтров
При фильтрации данных учитывайте следующие требования:
В публикацию должны быть включены все столбцы, на которые имеются ссылки в фильтрах строк. Иными словами, нельзя использовать фильтр столбцов для исключения столбца, который используется в фильтре строк.
Если добавление или изменение фильтра производится после инициализации подписок, то подписки должны быть инициализированы повторно.
Максимальное число байтов, разрешенное для столбца, используемого в фильтре, равно 1024 для статьи в публикации слиянием и 8000 для статьи в публикации транзакций.
В фильтрах строк или фильтрах соединения не допускаются ссылки на столбцы со следующими типами данных:
varchar(max) and nvarchar(max)
varbinary(max)
text and ntext
image
XML
UDT
Репликация транзакций позволяет реплицировать индексированное представление либо в виде представления, либо в виде таблицы. Если выполняется репликация представления в виде таблицы, отфильтровать столбцы из таблицы не удастся.
Фильтры строк не предназначены для работы в нескольких базах данных. В SQL Server выполнение sp_replcmds (в котором применяются фильтры) намеренно разрешается только владельцу базы данных (dbo). dbo не имеет межбазовых прав доступа. Благодаря добавлению CDC (системы отслеживания измененных данных) в SQL Server 2008 логика sp_replcmds вносит в таблицы отслеживания изменений данные, которые могут возвращаться и запрашиваться пользователем. Из соображений безопасности SQL Server ограничивает выполнение этой логики, чтобы злонамеренный dbo не мог перехватить и использовать в своих целях этот путь выполнения. Например, злонамеренный dbo может добавить в CDC-таблицы триггеры, которые впоследствии могут сработать в контексте пользователя, вызвавшего sp_replcmds, в данном случае агента чтения журнала. Если учетная запись, под которой запущен агент, имеет более высокие права доступа, злонамеренный dbo может повысить свой уровень прав.