Определение и изменение параметризованного фильтра строк для статьи публикации слиянием
В этом разделе описывается определение и изменение параметризованного фильтра строк в SQL Server 2012 при помощи среды Среда SQL Server Management Studio или Transact-SQL.
При создании статей таблицы можно применять параметризованные фильтры строк. Эти фильтры используют предложение WHERE, чтобы выбрать необходимые данные для публикации. Вместо того чтобы задавать буквенное значение в предложении (так, как в случае статического фильтра строк), вы указываете одну или обе следующие системные функции: SUSER_SNAME или HOST_NAME. Дополнительные сведения см. в разделе Параметризованные фильтры строк.
В этом разделе
Перед началом работы выполните следующие действия.
Ограничения
Безопасность
Для определения и изменения параметризованного фильтра строк используется:
Среда SQL Server Management Studio
Transact-SQL
Перед началом
Ограничения
- Если добавление, изменение или удаление параметризованного фильтра строк выполняется после инициализации подписок на публикацию, следует создать новый моментальный снимок и повторно инициализировать все подписки после внесения изменений. Дополнительные сведения о требованиях к изменениям свойств см. в разделе Изменение свойств публикации и статьи.
Рекомендации
- Для обеспечения высокой производительности не рекомендуется применять функции к именам столбцов в выражениях параметризованных фильтров строк, таких как LEFT([MyColumn]) = SUSER_SNAME(). Если в предложении фильтра используется HOST_NAME и переопределяется значение HOST_NAME, может быть, необходимо выполнить преобразование типов данных при помощи инструкции CONVERT. Дополнительные сведения см. в подразделе «Переопределение значения HOST_NAME()» раздела Параметризованные фильтры строк.
[Top]
Использование среды SQL Server Management Studio
Определение, изменение и удаление параметризованных фильтров строк выполняется на странице Фильтрация строк таблицы мастера создания публикаций или на странице Фильтрация строк диалогового окна Свойства публикации — <публикация>. Дополнительные сведения об использовании этого мастера и о доступе к этому диалоговому окну см. в разделах Создание публикации и Просмотр и изменение свойств публикации.
Определение параметризованного фильтра строк
На странице Фильтрация строк таблицы мастера создания публикаций или на странице Фильтрация строк диалогового окна Свойства публикации — <публикация> нажмите кнопку Добавить, а затем щелкните Добавить фильтр.
В окне Добавление фильтра выберите в раскрывающемся списке таблицу для фильтрации.
Создайте инструкцию фильтра в текстовом поле Инструкция фильтра. Можно ввести текст в тестовом поле или перетащить столбцы из списка Столбцы.
Текстовая область Инструкция фильтра содержит текст по умолчанию, в виде:
SELECT <published_columns> FROM [tableowner].[tablename] WHERE
Текст по умолчанию изменять нельзя. Введите предложение фильтра после ключевого слова WHERE, используя стандартный синтаксис SQL. Параметризованный фильтр включает вызов функции системы HOST_NAME() и/или SUSER_SNAME() либо пользовательской функции, которая ссылается на одну или обе эти функции. Ниже приведен пример полного выражения для параметризованного фильтра строк:
SELECT <published_columns> FROM [HumanResources].[Employee] WHERE LoginID = SUSER_SNAME()
В предложении WHERE необходимо использовать имена, состоящие из двух частей; имена, состоящие из трех или четырех частей, не поддерживаются.
Выберите параметр, который соответствует способу совместного использования данных подписчиками:
Строка из этой таблицы будет отправлена нескольким подпискам
Строка из этой таблицы будет отправлена только одной подписке
Если выбрана настройка Строка из этой таблицы будет отправлена только одной подписке, производительность репликации слиянием будет оптимизирована путем уменьшения объема хранимых и обрабатываемых метаданных. Однако следует убедиться, что данные секционированы таким образом, что одна строка не может быть реплицирована более чем одному подписчику. Дополнительные сведения см. в подразделе «Настройка параметров секционирования» раздела Параметризованные фильтры строк.
Нажмите кнопку ОК.
В диалоговом окне Свойства публикации — <публикация> нажмите кнопку ОК, чтобы сохранить результаты и закрыть диалоговое окно.
Изменение параметризованного фильтра строк
На странице Фильтрация строк таблицы мастера создания публикаций или на странице Фильтрация строк диалогового окна Свойства публикации — <публикация> выберите фильтр на панели Отфильтрованные таблицы и нажмите кнопку Правка.
В окне Изменение фильтра измените фильтр.
Нажмите кнопку ОК.
Удаление параметризованного фильтра строк
- На странице Фильтрация строк таблицы мастера создания публикаций или на странице Фильтрация строк диалогового окна Свойства публикации — <публикация> выберите фильтр на панели Отфильтрованные таблицы и нажмите кнопку Удалить.
[Top]
Использование Transact-SQL
Параметризованные фильтры строк можно создавать и изменять программно с помощью хранимых процедур репликации.
Определение параметризованного фильтра строк для статьи в публикации слиянием
В базе данных публикации на издателе выполните процедуру изменения задержки и проверки соединений для репликации транзакций (sp_addmergearticle (Transact-SQL)). Укажите параметр @publication, имя статьи в параметре @article, публикуемую таблицу в параметре @source_object, предложение WHERE, определяющее параметризованный фильтр в параметре @subset_filterclause (исключая WHERE), и одно из следующих значений в параметре @partition_options, описывающее тип секционирования, которое будет получено в результате применения параметризованного фильтра строк.
0 — фильтрация для данной статьи либо является статической, либо не возвращает уникального подмножества данных для каждой из секций (то есть имеются перекрывающиеся секции).
1 — результирующие секции перекрываются, и произведенные на подписчике изменения не могут быть внесены в секцию, которой принадлежит строка.
2 — фильтрация для статьи дает неперекрывающиеся секции, но несколько подписчиков могут получить одну и ту же секцию.
3 — фильтрация для статьи дает неперекрывающиеся секции, уникальные для каждой из подписок.
Изменение параметризованного фильтра строк для статьи в публикации слиянием
В базе данных публикации на издателе выполните процедуру sp_changemergearticle. Укажите параметры @publication, @article, значение subset_filterclause в параметре @property, выражение, определяющее параметризованный фильтр в параметре @value (исключая WHERE), и значение 1 как в параметре @force_invalidate_snapshot, так и в параметре @force_reinit_subscription.
Если это изменение приведет к разному поведению секционирования, еще раз выполните хранимую процедуру sp_changemergearticle. Укажите параметры @publication, @article, значение partition_options в параметре @property и наиболее оптимальный параметр секционирования в параметре @value, например один из следующих.
0 — фильтрация для данной статьи либо является статической, либо не возвращает уникального подмножества данных для каждой из секций (то есть имеются перекрывающиеся секции).
1 — результирующие секции перекрываются, и произведенные на подписчике изменения не могут быть внесены в секцию, которой принадлежит строка.
2 — фильтрация для статьи дает неперекрывающиеся секции, но несколько подписчиков могут получить одну и ту же секцию.
3 — фильтрация для статьи дает неперекрывающиеся секции, уникальные для каждой из подписок.
Пример (Transact-SQL)
В этом примере определяется группа статей в публикации слиянием. К статьям применяется последовательность фильтров соединения для таблицы Employee, которая в свою очередь фильтруется по столбцу LoginID с помощью параметризованного фильтра строк. Во время синхронизации переопределяется значение, возвращаемое функцией HOST_NAME. Дополнительные сведения см. в подразделе «Переопределение значения функции HOST_NAME()» раздела Параметризованные фильтры строк.
-- To avoid storing the login and password in the script file, the value
-- is passed into SQLCMD as a scripting variable. For information about
-- how to use scripting variables on the command line and in SQL Server
-- Management Studio, see the "Executing Replication Scripts" section in
-- the topic "Programming Replication Using System Stored Procedures".
--Add a new merge publication.
DECLARE @publicationdb AS sysname;
DECLARE @publication AS sysname;
DECLARE @table1 AS sysname;
DECLARE @table2 AS sysname;
DECLARE @filter AS sysname;
DECLARE @schema_hr AS sysname;
DECLARE @schema_sales AS sysname;
SET @publicationdb = N'AdventureWorks2012';
SET @publication = N'AdvWorksSalesPersonMerge';
SET @table1 = N'Employee';
SET @table2 = N'SalesPerson';
SET @filter = N'SalesPerson_Employee';
SET @schema_hr = N'HumanResources';
SET @schema_sales = N'Sales';
USE [AdventureWorks2012];
-- Enable AdventureWorks2012 for merge replication.
EXEC sp_replicationdboption
@dbname = @publicationdb,
@optname = N'merge publish',
@value = N'true';
-- Create new merge publication with Subscriber requested snapshot
-- and using the default agent schedule.
EXEC sp_addmergepublication
@publication = @publication,
@description = N'Merge publication of AdventureWorks2012.',
@allow_subscriber_initiated_snapshot = N'true',
@publication_compatibility_level = N'90RTM';
-- Create a new snapshot job for the publication, using the default schedule.
-- Pass credentials at runtime using sqlcmd scripting variables.
EXEC sp_addpublication_snapshot
@publication = @publication,
@job_login = $(login),
@job_password = $(password);
-- Add an article for the Employee table,
-- which is horizontally partitioned using
-- a parameterized row filter.
EXEC sp_addmergearticle
@publication = @publication,
@article = @table1,
@source_owner = @schema_hr,
@source_object = @table1,
@type = N'table',
@description = 'contains employee information',
@subset_filterclause = N'[LoginID] = HOST_NAME()';
-- Add an article for the SalesPerson table,
-- which is partitioned based on a join filter.
EXEC sp_addmergearticle
@publication = @publication,
@article = @table2,
@source_owner = @schema_sales,
@source_object = @table2,
@type = N'table',
@description = 'contains salesperson information';
-- Add a join filter between the two articles.
EXEC sp_addmergefilter
@publication = @publication,
@article = @table1,
@filtername = @filter,
@join_articlename = @table2,
@join_filterclause = N'[Employee].[BusinessEntityID] = [SalesPerson].[SalesPersonID]',
@join_unique_key = 1,
@filter_type = 1;
GO
-- Start the agent job to generate the full snapshot for the publication.
-- The filtered data snapshot is generated automatically the first time
-- the subscription is synchronized.
DECLARE @publication AS sysname;
SET @publication = N'AdvWorksSalesPersonMerge';
EXEC sp_startpublication_snapshot
@publication = @publication;
GO
[Top]
См. также
Основные понятия
Определение и изменение фильтра соединения между статьями публикации слиянием