sp_addmergefilter (Transact-SQL)

Применимо к: даSQL Server (все поддерживаемые версии) ДаУправляемый экземпляр SQL Azure

Добавляет новый фильтр слияния для создания секции на базе соединения с другой таблицей. Эта хранимая процедура выполняется на издателе в базе данных публикации.

Значок ссылки на раздел Синтаксические обозначения в 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' Родительская статья, к которой дочерняя статья, указанная в статье, должна быть соединена с помощью предложения JOIN, заданного join_filterclause, чтобы определить строки дочерней статьи, соответствующие критерию фильтра фильтра слияния. Аргумент join_articlename имеет тип sysname и не имеет значения по умолчанию. Статья должна быть в публикации, заданной в публикации.

[ @join_filterclause = ] join_filterclause Предложение join, которое должно использоваться для объединения дочерней статьи, указанной в статье и родительской статье, указанной в join_article, для определения строк, соответствующих фильтру слияния. join_filterclause имеет тип nvarchar (1000).

[ @join_unique_key = ] join_unique_key Указывает, является ли соединение между дочерней статьей и родительской статьей join_article"один ко многим", "один к одному", "многие к одному" или "многие ко многим". join_unique_key имеет тип int и значение по умолчанию 0. значение 0 указывает на соединение типа «многие к одному» или «многие ко многим». 1 указывает на соединение типа «один к одному» или «один ко многим». Это значение равно 1 , если соединяемые столбцы формируют уникальный ключ в join_article или если join_filterclause между внешним ключом в статье и первичным ключом в join_article.

Внимание!

Присвойте этому параметру значение 1 , если имеется ограничение на соединяемый столбец в базовой таблице для родительской статьи, что гарантирует уникальность. Если join_unique_key имеет неверное значение 1 , может произойти неконвергенция данных.

[ @force_invalidate_snapshot = ] force_invalidate_snapshot Подтверждает, что действие, выполняемое этой хранимой процедурой, может сделать существующий моментальный снимок недействительным. force_invalidate_snapshot является битом и имеет значение по умолчанию 0.

0 указывает, что изменения в статье слияния не приведут к недействительности моментального снимка. Если хранимая процедура определяет, что изменение требует создания нового моментального снимка, то возникает ошибка, и изменение не выполняется.

значение 1 указывает, что изменения в статье слияния могут привести к недействительности моментального снимка, и если существуют подписки, требующие нового моментального снимка, предоставляет разрешение на пометку существующего моментального снимка как устаревшего и создание нового моментального снимка.

[ @force_reinit_subscription = ] force_reinit_subscription Подтверждает, что действие, выполняемое этой хранимой процедурой, может потребовать повторной инициализации существующих подписок. force_reinit_subscription является битом и имеет значение по умолчанию 0.

0 указывает, что изменения в статье публикации слиянием не приведут к повторной инициализации подписки. Если хранимая процедура определит, что изменение потребует повторной инициализации подписки, то выдается сообщение об ошибке и изменения не производятся.

1 указывает, что изменения в статье слияния приведут к повторной инициализации существующих подписок и предложит разрешение на повторную инициализацию подписки.

[ @filter_type = ] filter_type Указывает тип добавляемого фильтра. filter_type имеет тип tinyint и может принимать одно из следующих значений.

Значение Описание
1 Только фильтр соединения. Необходим для поддержки подписчиков SQL Server Compact.
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.EmployeeID = 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.

См. также:

Define an Article
Определение и изменение фильтра соединения между статьями публикации слиянием
Join Filters
sp_changemergefilter (Transact-SQL)
sp_dropmergefilter (Transact-SQL)
sp_helpmergefilter (Transact-SQL)
Хранимые процедуры репликации (Transact-SQL)