Поделиться через


sp_addmergefilter (Transact-SQL)

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

Значок ссылки на разделСинтаксические обозначения в 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 с пакетом обновления 1 (SP1).

    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.