Определение и изменение параметризованного фильтра строк для статьи публикации слиянием
Область применения: SQL Server
В этом разделе описывается определение и изменение параметризованного фильтра строк в SQL Server с помощью SQL Server Management Studio или Transact-SQL.
При создании статей таблицы можно применять параметризованные фильтры строк. Эти фильтры используют предложение WHERE , чтобы выбрать необходимые данные для публикации. Вместо того чтобы задавать буквенное значение в предложении (как для статического фильтра строк), вы указываете одну или обе системные функции: SUSER_SNAME и HOST_NAME. Дополнительные сведения см. в разделе Параметризованные фильтры строк.
В этом разделе
Перед началом:
Для определения и изменения параметризованного фильтра строк используется:
Перед началом
Ограничения
- Если добавление, изменение или удаление параметризованного фильтра строк выполняется после инициализации подписок на публикацию, следует создать новый моментальный снимок и повторно инициализировать все подписки после внесения изменений. Дополнительные сведения о требованиях к изменениям свойств см. в статье Изменение свойств публикации и статьи.
Рекомендации
- Для обеспечения высокой производительности не рекомендуется применять функции к именам столбцов в выражениях параметризованных фильтров строк, таких как
LEFT([MyColumn]) = SUSER_SNAME()
. Если в предложении фильтра используется HOST_NAME и переопределяется значение HOST_NAME, может быть, необходимо выполнить преобразование типов данных при помощи инструкции CONVERT. Дополнительные сведения см. в подразделе «Переопределение значения HOST_NAME()» раздела Parameterized Row Filters.
Использование среды 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 необходимо использовать имена, состоящие из двух частей; имена, состоящие из трех или четырех частей, не поддерживаются.
Выберите параметр, который соответствует способу совместного использования данных подписчиками:
Строка из этой таблицы будет отправлена нескольким подпискам
Строка из этой таблицы будет отправлена только одной подписке
Если выбрана настройка Строка из этой таблицы будет отправлена только одной подписке, производительность репликации слиянием будет оптимизирована путем уменьшения объема хранимых и обрабатываемых метаданных. Однако следует убедиться, что данные секционированы таким образом, что одна строка не может быть реплицирована более чем одному подписчику. Дополнительные сведения см. в подразделе «Настройка параметров секционирования» раздела Параметризованные фильтры строк.
Нажмите ОК.
Если вы находитесь в диалоговом окне "Свойства публикации — <публикация> ", нажмите кнопку "ОК ", чтобы сохранить и закрыть диалоговое окно.
Изменение параметризованного фильтра строк
На странице "Строки таблицы фильтра" мастера создания публикации или страницы "Строки фильтра" свойств публикации — <публикация> выберите фильтр в области "Отфильтрованные таблицы" и нажмите кнопку "Изменить".
В окне Изменение фильтра измените фильтр.
Нажмите ОК.
Удаление параметризованного фильтра строк
- На странице "Строки таблицы фильтра" мастера создания публикации или страницы "Фильтры строк" в свойствах публикации — <публикация> выберите фильтр в области "Отфильтрованные таблицы" и нажмите кнопку "Удалить".
Использование 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, the expression that defines the parameterized filter в параметре @value (исключая
WHERE
), и значение 1 в параметре both @в параметреce_invalidate_snapshot и @в параметреce_reinit_subscription.Если это изменение приведет к разному поведению секционирования, еще раз выполните хранимую процедуру sp_changemergearticle . Укажите параметры @publication, @article, значение partition_options в параметре @propertyи наиболее оптимальный параметр секционирования в параметре @value, например один из следующих.
0 — фильтрация для данной статьи либо является статической, либо не возвращает уникального подмножества данных для каждой из секций (то есть имеются перекрывающиеся секции).
1 — результирующие секции перекрываются, и произведенные на подписчике изменения не могут быть внесены в секцию, которой принадлежит строка.
2 — фильтрация для статьи дает неперекрывающиеся секции, но несколько подписчиков могут получить одну и ту же секцию.
3 — фильтрация для статьи дает неперекрывающиеся секции, уникальные для каждой из подписок.
Пример (Transact-SQL)
В этом примере определяется группа статей в публикации слиянием. К статьям применяется последовательность фильтров соединения для таблицы Employee
, которая в свою очередь фильтруется по столбцу LoginID с помощью параметризованного фильтра строк. Во время синхронизации переопределяется значение, возвращаемое функцией HOST_NAME . Дополнительные сведения см. в подразделе «Переопределение значения функции HOST_NAME()» раздела Parameterized Row Filters.
-- 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'AdventureWorks2022';
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 [AdventureWorks2022];
-- Enable AdventureWorks2022 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 AdventureWorks2022.',
@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
См. также
Определение и изменение фильтра соединения между статьями публикации слиянием
Изменение свойств публикации и статьи
Фильтры соединения
Параметризованные фильтры строк