Определение и изменение фильтра соединения между статьями публикации слиянием
Область применения: SQL Server
В этом разделе описывается определение и изменение фильтра соединения между статьями слиянием в SQL Server с помощью SQL Server Management Studio или Transact-SQL. Репликация слиянием поддерживает фильтры соединения, которые обычно используются совместно с параметризованными фильтрами для распространения секционирования таблиц на все связанные статьи таблиц.
В этом разделе
Перед началом:
Для определения и изменения фильтра соединения между статьями публикации слиянием используется:
Перед началом
Ограничения
Чтобы создать фильтр соединения, публикация должна содержать не менее двух связанных таблиц. Фильтр соединения расширяет фильтр строк, и поэтому следует задать фильтр строк для одной таблицы перед тем, как можно будет расширять фильтр соединением с другой таблицей. После того как будет определен один фильтр соединения, его можно расширить еще одним фильтром соединения, если публикация содержит другие связанные таблицы.
Если добавление, изменение или удаление фильтра соединения выполняется после инициализации подписок на публикацию, следует создать новый моментальный снимок и повторно инициализировать все подписки после внесения изменений. Дополнительные сведения о требованиях к изменениям свойств см. в статье Изменение свойств публикации и статьи.
Рекомендации
- Фильтры соединения можно создать вручную для набора таблиц, или же репликация может создать эти фильтры автоматически, основываясь на связях между внешними ключами и первичными ключами, заданных в таблицах. Дополнительные сведения о автоматическом создании набора фильтров соединения см. в статье "Автоматическое создание набора фильтров соединения между статьями слиянием" (SQL Server Management Studio).
Использование среды SQL Server Management Studio
Определение, изменение и удаление фильтров соединения на странице "Строки таблицы фильтров" мастера создания публикации или страницы "Строки фильтра" диалогового окна "Свойства публикации" — <"Публикация>". Дополнительные сведения об использовании мастера и доступе к этому диалоговому окну см. в статьях Создание публикации и Просмотр и изменение свойств публикации.
Определение фильтра соединения
На странице "Строки таблицы фильтров" мастера создания публикации или страницы "Фильтры строк" свойств публикации — <"Публикация>" выберите существующий фильтр строк или фильтр соединения в области "Отфильтрованные таблицы".
Щелкните Добавитьи выберите Добавить соединение для расширения выбранного фильтра.
Создайте инструкцию соединения: выберите либо Использовать построитель для создания инструкции , либо Создать инструкцию соединения вручную.
Если решено применить конструктор, то для создания инструкции соединения используйте столбцы в сетке (Сопряжение, Фильтруемый столбец таблицы, Оператори Столбец соединяемой таблицы).
Каждый столбец в сетке содержит раскрывающийся список со списком, позволяющий выбрать два столбца и оператор (=, =, <><=, <>=, >и подобное). Результаты выводятся в текстовом поле Предварительный просмотр . Если в соединении участвует более двух столбцов, выберите логику (AND или OR) из столбца Сопряжение , а затем введите еще два столбца и оператор.
Если нужно написать инструкцию вручную, введите ее в текстовом поле Инструкция соединения . Используйте списки Столбцы фильтруемой таблицы и Столбцы соединяемой таблицы , перетягивая из них поля в текстовое поле Инструкция соединения .
Полная инструкция соединения будет выглядеть таким образом:
SELECT <published_columns> FROM [Sales].[SalesOrderHeader] INNER JOIN [Sales].[SalesOrderDetail] ON [SalesOrderHeader].[SalesOrderID] = [SalesOrderDetail].[SalesOrderID]
В предложении JOIN необходимо использовать имена, состоящие их двух частей; имена, состоящие из трех и четырех частей не поддерживаются.
Задайте параметры соединения.
Если столбец, по которому производится соединение в отфильтрованной таблице (родительской таблице), уникален, выберите Уникальный ключ.
Внимание
Выбор этого параметра указывает, что связь между дочерней и родительской таблицей в фильтре соединения — «одна к одной» или «одна к нескольким». Устанавливайте этот параметр, лишь если на объединяющий столбец в дочерней таблице наложено ограничение, гарантирующее уникальность. Если параметр задан неправильно, может возникнуть потеря конвергенции данных.
По умолчанию во время синхронизации процесс репликации слиянием обрабатывает изменения построчно. Чтобы иметь связанные изменения в строках отфильтрованной таблицы и присоединенной таблицы, обработанной в виде единицы, выберите логическую запись (Только Microsoft SQL Server 2005 (9.x) и более поздние версии. Этот параметр доступен, только если удовлетворяются требования статьи и публикации на использование логических записей. Дополнительные сведения см. в подразделе "Вопросы использования логических записей" раздела Группирование изменений в связанных строках с помощью логических записей.
Нажмите ОК.
Если вы находитесь в диалоговом окне "Свойства публикации — <публикация> ", нажмите кнопку "ОК ", чтобы сохранить и закрыть диалоговое окно.
Изменение фильтра соединения
На странице "Строки таблицы фильтра" мастера создания публикации или страницы "Строки фильтра" свойств публикации — <публикация> выберите фильтр в области "Отфильтрованные таблицы" и нажмите кнопку "Изменить".
В окне Изменить соединение измените фильтр.
Нажмите ОК.
Удаление фильтра соединения
- На странице "Строки таблицы фильтра" мастера создания публикации или страницы "Фильтры строк" в свойствах публикации — <публикация> выберите фильтр в области "Отфильтрованные таблицы" и нажмите кнопку "Удалить". Если удаляемый фильтр соединения расширен за счет других фильтров, эти фильтры также будут удалены.
Использование Transact-SQL
Эти процедуры демонстрируют совместное использование параметризованного фильтра родительской статьи с фильтрами соединения связанных с ней дочерних статей. Фильтры соединения могут создаваться программным путем с помощью хранимых процедур репликации.
Определение фильтра соединения для распространения фильтра статьи на связанные с ней статьи в публикации слиянием
Определите параметры фильтрации статьи, к которой производится присоединение (она также называется родительской статьей).
Дополнительные сведения о фильтрации статьи при помощи параметризованного фильтра строк см. в разделе Определение и изменение параметризованного фильтра строк для статьи публикации слиянием.
Дополнительные сведения о фильтрации статьи с помощью статического строкового фильтра см. в разделе Define and Modify a Static Row Filter.
На издателе в базе данных публикации выполните sp_addmergearticle (Transact-SQL), чтобы определить одну или несколько связанных статей, которые также называются дочерними статьями для публикации. Дополнительные сведения см. в статье определить статью.
На издателе в базе данных публикации выполните sp_addmergefilter (Transact-SQL). Задайте значение параметра
@publication
, а также укажите уникальное имя фильтра в параметре@filtername
, имя дочерней статьи, созданной на шаге 2, — в параметре@article
, имя родительской статьи, к которой производится присоединение, — в параметре@join_articlename
, а в параметре@join_unique_key
задайте одно из следующих значений.0 — указывает на соединение типа «многие к одному» или «многие ко многим» между родительской и дочерними статьями.
1 — указывает на соединение типа «один к одному» или «один ко многим» между родительской и дочерними статьями.
Таким образом определяется используемый фильтр соединения двух статей.
Внимание
Если на столбец, по которому производится соединение, в базовой таблице для родительской статьи наложено ограничение, гарантирующее уникальность, укажите в параметре
@join_unique_key
значение 1. Если параметру@join_unique_key
по ошибке будет присвоено значение 1, то может произойти потеря конвергенции данных.
Примеры (Transact-SQL)
В следующем примере производится определение статьи для публикации слиянием, где статья таблицы SalesOrderDetail
фильтруется по таблице SalesOrderHeader
, для фильтрации которой, в свою очередь, используется статический строковый фильтр. Дополнительные сведения см. в разделе Define and Modify a Static Row Filter.
DECLARE @publication AS sysname;
DECLARE @table1 AS sysname;
DECLARE @table2 AS sysname;
DECLARE @table3 AS sysname;
DECLARE @salesschema AS sysname;
DECLARE @hrschema AS sysname;
DECLARE @filterclause AS nvarchar(1000);
SET @publication = N'AdvWorksSalesOrdersMerge';
SET @table1 = N'Employee';
SET @table2 = N'SalesOrderHeader';
SET @table3 = N'SalesOrderDetail';
SET @salesschema = N'Sales';
SET @hrschema = N'HumanResources';
SET @filterclause = N'Employee.LoginID = HOST_NAME()';
-- Add a filtered article for the Employee table.
EXEC sp_addmergearticle
@publication = @publication,
@article = @table1,
@source_object = @table1,
@type = N'table',
@source_owner = @hrschema,
@schema_option = 0x0004CF1,
@description = N'article for the Employee table',
@subset_filterclause = @filterclause;
-- Add an article for the SalesOrderHeader table that is filtered
-- based on Employee and horizontally filtered.
EXEC sp_addmergearticle
@publication = @publication,
@article = @table2,
@source_object = @table2,
@type = N'table',
@source_owner = @salesschema,
@vertical_partition = N'true',
@schema_option = 0x0034EF1,
@description = N'article for the SalesOrderDetail table';
-- Add an article for the SalesOrderDetail table that is filtered
-- based on SaledOrderHeader.
EXEC sp_addmergearticle
@publication = @publication,
@article = @table3,
@source_object = @table3,
@source_owner = @salesschema,
@description = 'article for the SalesOrderHeader table',
@identityrangemanagementoption = N'auto',
@pub_identity_range = 100000,
@identity_range = 100,
@threshold = 80,
@schema_option = 0x0004EF1;
-- Add all columns to the SalesOrderHeader article.
EXEC sp_mergearticlecolumn
@publication = @publication,
@article = @table2,
@force_invalidate_snapshot = 1,
@force_reinit_subscription = 1;
-- Remove the credit card Approval Code column.
EXEC sp_mergearticlecolumn
@publication = @publication,
@article = @table2,
@column = N'CreditCardApprovalCode',
@operation = N'drop',
@force_invalidate_snapshot = 1,
@force_reinit_subscription = 1;
-- Add a merge join filter between Employee and SalesOrderHeader.
EXEC sp_addmergefilter
@publication = @publication,
@article = @table2,
@filtername = N'SalesOrderHeader_Employee',
@join_articlename = @table1,
@join_filterclause = N'Employee.BusinessEntityID = SalesOrderHeader.SalesPersonID',
@join_unique_key = 1,
@filter_type = 1,
@force_invalidate_snapshot = 1,
@force_reinit_subscription = 1;
-- Add a merge join filter between SalesOrderHeader and SalesOrderDetail.
EXEC sp_addmergefilter
@publication = @publication,
@article = @table3,
@filtername = N'SalesOrderDetail_SalesOrderHeader',
@join_articlename = @table2,
@join_filterclause = N'SalesOrderHeader.SalesOrderID = SalesOrderDetail.SalesOrderID',
@join_unique_key = 1,
@filter_type = 1,
@force_invalidate_snapshot = 1,
@force_reinit_subscription = 1;
GO
В следующем примере определяется группа статей в публикации слиянием, где производится фильтрация статей с помощью набора фильтров соединения по таблице Employee
, для фильтрации которой, в свою очередь, используется параметризованный фильтр строк по значению параметра HOST_NAME в столбце LoginID . Дополнительные сведения см. в статье Определение и изменение параметризованного фильтра строк для статьи публикации слиянием.
-- 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
См. также
Фильтры соединения
Параметризованные фильтры строк
Изменение свойств публикации и статьи
Фильтрация опубликованных данных для репликации слиянием
Определение и изменение фильтра соединения между статьями публикации слиянием
Replication System Stored Procedures Concepts
Определение связи логических записей между статьями таблиц слияния
Определение и изменение параметризованного фильтра строк для статьи публикации слиянием