sp_addmergefilter (Transact-SQL)
Добавляет новый фильтр слияния для создания секции на базе соединения с другой таблицей. Эта хранимая процедура выполняется на издателе в базе данных публикации.
Синтаксис
sp_addmergefilter [ @publication = ] 'publication'
, [ @article = ] 'article'
, [ @filtername = ] 'filtername'
, [ @join_articlename = ] 'join_articlename'
, [ @join_filterclause = ] join_filterclause
[ , [ @join_unique_key = ] join_unique_key ]
[ , [ @force_invalidate_snapshot = ] force_invalidate_snapshot ]
[ , [ @force_reinit_subscription = ] force_reinit_subscription ]
[ , [ @filter_type = ] filter_type ]
Аргументы
[ @publication= ] 'publication'
Имя публикации, к которой добавляется фильтр слияния. Аргумент publication имеет тип sysname и не имеет значения по умолчанию.[ @article= ] 'article'
Имя статьи, к которой добавляется фильтр слияния. Аргумент article имеет тип sysname и не имеет значения по умолчанию.[ @filtername= ] 'filtername'
Имя фильтра. Аргумент filtername является обязательным. Аргумент filtername имеет тип sysname и не имеет значения по умолчанию.[ @join_articlename= ] 'join_articlename'
Родительская статья, к которой дочерняя статья, указанная аргументом article, должна быть присоединена с использованием предложения JOIN, указанного аргументом join_filterclause, чтобы определить строки дочерней статьи, соответствующие критерию фильтрации фильтра слияния. Аргумент join_articlename имеет тип sysname и не имеет значения по умолчанию. Статья должна находиться в публикации, указанной аргументом publication.[ @join_filterclause= ] join_filterclause
Предложение соединения, которое должно использоваться для соединения дочерней статьи, указанной аргументом article, с родительской статьей, указанной аргументом join_article, чтобы определить строки, указывающие фильтр слияния. Аргумент join_filterclause имеет тип nvarchar(1000).[ @join_unique_key= ] join_unique_key
Показывает, относится ли соединение между дочерней статьей article и родительской статьей join_article к типу «один к одному», «многие к одному» или «многие ко многим». Аргумент join_unique_key имеет тип int и значение по умолчанию 0. Значение 0 указывает на соединение «многие к одному» или «многие ко многим». Значение 1 указывает на соединение «один к одному» или «один ко многим». Значение равно 1, если соединяемые столбцы формируют уникальный ключ в join_article, или если соединение join_filterclause производится между внешним ключом в article и первичным ключом в join_article.Внимание! Просто присвойте этому параметру значение 1, если на соединяемый столбец в базовой таблице для родительской статьи наложено ограничение, гарантирующее уникальность. Если аргументу join_unique_key ошибочно присвоено значение 1, то конвергенции данных может не произойти.
[ @force_invalidate_snapshot= ] force_invalidate_snapshot
Подтверждает, что действие, выполненное этой хранимой процедурой, может сделать недействительным текущий моментальный снимок. Аргумент force_invalidate_snapshot имеет тип bit и значение по умолчанию 0.Значение 0 указывает, что изменения статьи слияния не приведут к порче моментального снимка. Если хранимая процедура определяет, что изменение требует создания нового моментального снимка, то возникает ошибка, и изменение не выполняется.
Значение 1 указывает, что изменение статьи слияния может привести к недействительности моментального снимка, и если имеются подписки, которым может потребоваться новый моментальный снимок, то дает разрешение на пометку текущего снимка как устаревшего, после чего создается новый снимок.
[ @force_reinit_subscription= ] force_reinit_subscription
Подтверждает, что действие, выполняемое данной хранимой процедурой, может сделать необходимой повторную инициализацию текущих подписок. Аргумент force_reinit_subscription имеет тип bit и значение по умолчанию 0.Значение 0 указывает, что изменения статьи слияния не приведут к повторной инициализации подписки. Если хранимая процедура определит, что изменение потребует повторной инициализации подписки, то выдается сообщение об ошибке и изменения не производятся.
Значение 1 указывает, что изменения в статье слияния вызывают повторную инициализацию подписок, и дает разрешение произвести повторную инициализацию.
[ @filter_type= ] filter_type
Указывает тип добавляемого фильтра. Аргумент filter_type имеет тип tinyint и может принимать одно из следующих значений.Значение
Описание
1
Только фильтр соединения. Необходим для поддержки подписчиков SQL Server Compact 3.5 с пакетом обновления 2 (SP2).
2
Только связь логических записей.
3
Как фильтр соединения, так и связь логических записей.
Дополнительные сведения см. в разделе Изменения группирования связанных строк с логическими записями.
Значения кодов возврата
0 (успешное завершение) или 1 (неуспешное завершение)
Замечания
Процедура sp_addmergefilter используется в репликации слиянием.
Процедура sp_addmergefilter может использоваться только с табличными статьями. Статьи представлений и индексированных представлений не поддерживаются.
Эта процедура также может быть использована для формирования логической взаимосвязи между двумя статьями, между которыми может существовать или отсутствовать фильтр соединения. Аргумент filter_type используется, чтобы указать, добавляется ли фильтр слияния к фильтру соединения, логической взаимосвязи или к обеим этим связям.
Для использования логических записей публикация и статьи должны удовлетворять определенным требованиям. Дополнительные сведения см. в разделе Изменения группирования связанных строк с логическими записями.
Как правило, этот параметр используется для статьи с внешним ключом, указывающим на опубликованную таблицу первичного ключа, а таблица первичного ключа имеет фильтр, определенный в статье. Подмножество строк первичного ключа используется для определения строк внешнего ключа, реплицируемых в подписчика.
Между двумя опубликованными статьями можно вставить фильтр соединения, если исходные таблицы обеих статей имеют общее имя объекта таблицы. В этом случае, даже если обе таблицы принадлежат различным схемам и имеют уникальные имена статей, создание фильтра соединения завершится неудачей.
Если как параметризованный фильтр строк, так и фильтр соединения применяются к статье таблицы, то репликация определяет, принадлежит ли строка к секции подписчика. Это достигается путем расчета функции фильтрации или фильтра соединения (с использованием оператора OR), а не поиском пересечения двух условий (с использованием оператора AND).
Пример
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
Разрешения
Только элементы предопределенной роли сервера sysadmin или предопределенной роли базы данных db_owner могут выполнять процедуру sp_addmergefilter.
См. также