Определение и изменение фильтра соединения между статьями публикации слиянием
В этом разделе описывается определение и изменение фильтра соединения между статьями публикации слиянием в SQL Server 2012 при помощи среды Среда SQL Server Management Studio или Transact-SQL. Репликация слиянием поддерживает фильтры соединения, которые обычно используются совместно с параметризованными фильтрами для распространения секционирования таблиц на все связанные статьи таблиц.
В этом разделе
Перед началом работы выполните следующие действия.
Ограничения
Рекомендации
Для определения и изменения фильтра соединения между статьями публикации слиянием используется:
Среда SQL Server Management Studio
Transact-SQL
Перед началом
Ограничения
Чтобы создать фильтр соединения, публикация должна содержать не менее двух связанных таблиц. Фильтр соединения расширяет фильтр строк, и поэтому следует задать фильтр строк для одной таблицы перед тем, как можно будет расширять фильтр соединением с другой таблицей. После того как будет определен один фильтр соединения, его можно расширить еще одним фильтром соединения, если публикация содержит другие связанные таблицы.
Если добавление, изменение или удаление фильтра соединения выполняется после инициализации подписок на публикацию, следует создать новый моментальный снимок и повторно инициализировать все подписки после внесения изменений. Дополнительные сведения о требованиях к изменениям свойств см. в разделе Изменение свойств публикации и статьи.
Рекомендации
- Фильтры соединения можно создать вручную для набора таблиц, или же репликация может создать эти фильтры автоматически, основываясь на связях между внешними ключами и первичными ключами, заданных в таблицах. Дополнительные сведения об автоматическом создании фильтров соединения см. в разделе Автоматическое формирование набора фильтров соединения между статьями публикации слиянием (среда SQL Server Management Studio).
[Top]
Использование среды SQL Server Management Studio
Задать, изменить и удалить фильтры соединения можно на странице Фильтрация строк таблицы мастера создания публикаций или на странице Фильтрация строк диалогового окна Свойства публикации — <публикация>. Дополнительные сведения об использовании этого мастера и о доступе к этому диалоговому окну см. в разделах Создание публикации и Просмотр и изменение свойств публикации.
Определение фильтра соединения
На странице Фильтрация строк таблицы в мастере создания публикаций или на странице Фильтрация строк диалогового окна Свойства публикации — <публикация> выберите существующий фильтр строк или фильтр соединения на панели Отфильтрованные таблицы.
Нажмите кнопку Добавить и выберите Добавить соединение для расширения выбранного фильтра.
Создайте инструкцию соединения: выберите либо Использовать построитель для создания инструкции, либо Создать инструкцию соединения вручную.
При использовании построителя для создания инструкции соединения используйте столбцы в сетке (сопряжение, столбец отфильтрованной таблицы, оператор и столбец соединяемой таблицы).
Каждый столбец сетки содержит раскрывающееся поле со списком, позволяющее выбрать два столбца и оператор (=, <>, <=, <, >=,>, и like). Результаты выводятся в области Предварительный просмотр. Если в соединении участвует более двух столбцов, выберите логику (AND или OR) из столбца Сопряжение, а затем введите еще два столбца и оператор.
Если нужно написать инструкцию вручную, введите ее в текстовом поле Инструкция соединения. Используйте списки Столбцы фильтруемой таблицы и Столбцы соединяемой таблицы, перетягивая из них поля в текстовое поле Инструкция соединения.
Полная инструкция соединения будет выглядеть таким образом:
SELECT <published_columns> FROM [Sales].[SalesOrderHeader] INNER JOIN [Sales].[SalesOrderDetail] ON [SalesOrderHeader].[SalesOrderID] = [SalesOrderDetail].[SalesOrderID]
В предложении JOIN необходимо использовать имена, состоящие их двух частей; имена, состоящие из трех и четырех частей не поддерживаются.
Задайте параметры соединения.
Если столбец, по которому производится соединение в отфильтрованной таблице (родительской таблице), уникален, выберите Уникальный ключ.
Внимание! Выбор этого параметра указывает, что связи между дочерней и родительской таблицей в фильтре соединения – «один к одному» или «один ко многим». Устанавливайте этот параметр, лишь если на объединяющий столбец в дочерней таблице наложено ограничение, гарантирующее уникальность. Если параметр задан неправильно, может произойти потеря целостности данных.
По умолчанию во время синхронизации процессы репликации слиянием изменяются в зависимости от строк. Чтобы в строках и фильтруемой, и присоединенной таблицы присутствовали связанные изменения, и присоединенная таблица функционировала бы как целое, выберите Логическая запись (только MicrosoftSQL Server 2005 и более поздние версии). Этот параметр доступен, только если удовлетворяются требования статьи и публикации на использование логических записей. Дополнительные сведения см. в подразделе «Вопросы использования логических записей» раздела Изменения группирования связанных строк с логическими записями.
Нажмите кнопку ОК.
В диалоговом окне Свойства публикации — <публикация> нажмите кнопку ОК, чтобы сохранить результаты и закрыть диалоговое окно.
Изменение фильтра соединения
На странице Фильтрация строк таблицы мастера создания публикаций или на странице Фильтрация строк диалогового окна Свойства публикации — <публикация> выберите фильтр в панели Отфильтрованные таблицы и нажмите кнопку Правка.
В окне Изменить соединение измените фильтр.
Нажмите кнопку ОК.
Удаление фильтра соединения
- На странице Фильтрация строк таблицы мастера создания публикаций или на странице Фильтрация строк диалогового окна Свойства публикации — <публикация> выберите фильтр в панели Отфильтрованные таблицы и щелкните Удалить. Если удаляемый фильтр соединения расширен за счет других фильтров, эти фильтры также будут удалены.
[Top]
Использование Transact-SQL
Эти процедуры демонстрируют совместное использование параметризованного фильтра родительской статьи с фильтрами соединения связанных с ней дочерних статей. Фильтры соединения могут создаваться программным путем с помощью хранимых процедур репликации.
Определение фильтра соединения для распространения фильтра статьи на связанные с ней статьи в публикации слиянием
Определите параметры фильтрации статьи, к которой производится присоединение (она также называется родительской статьей).
Дополнительные сведения о фильтрации статьи при помощи параметризованного фильтра строк см. в разделе Определение и изменение параметризованного фильтра строк для статьи публикации слиянием.
Дополнительные сведения о фильтрации статьи с помощью статического строкового фильтра см. в разделе Определение и изменение статического строкового фильтра.
Чтобы определить связанные с публикацией статьи (которые также называют дочерними), в базе данных публикации на издателе выполните хранимую процедуру 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, для фильтрации которой, в свою очередь, используется статический строковый фильтр. Дополнительные сведения см. в разделе Определение и изменение статического строкового фильтра.
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'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]
См. также
Основные понятия
Параметризованные фильтры строк
Изменение свойств публикации и статьи
Фильтрация опубликованных данных для репликации слиянием
Определение и изменение фильтра соединения между статьями публикации слиянием
Основные понятия системных хранимых процедур репликации
Определение связи логических записей между статьями таблиц слияния
Определение и изменение параметризованного фильтра строк для статьи публикации слиянием