Vorgehensweise: Definieren und Ändern eines statischen Zeilenfilters (Replikationsprogrammierung mit Transact-SQL)

Wenn Sie Tabellenartikel erstellen, können Sie eine WHERE-Klausel definieren, um Zeilen aus einem Artikel zu filtern. Zudem können Sie einen Zeilenfilter ändern, nachdem er definiert wurde. Statische Zeilenfilter können mithilfe gespeicherter Replikationsprozeduren programmgesteuert erstellt und geändert werden. Da diese Filter statisch sind, erhalten alle Abonnenten die gleiche Teilmenge der Daten. Informationen darüber, wie Sie Zeilen in einem Tabellenartikel, der zu einer Mergeveröffentlichung gehört, dynamisch filtern können, damit jeder Abonnent eine andere Partition der Daten erhält, finden Sie unter Vorgehensweise: Definieren und Ändern eines parametrisierten Zeilenfilters für einen Mergeartikel (Replikationsprogrammierung mit Transact-SQL). Mergereplikation ermöglicht es Ihnen zudem, verknüpfte Zeilen auf Grundlage eines vorhandenen Zeilenfilters zu filtern. Weitere Informationen finden Sie unter Vorgehensweise: Definieren und Ändern eines Joinfilters zwischen Mergeartikeln (Replikationsprogrammierung mit Transact-SQL).

So definieren Sie einen statischen Zeilenfilter für eine Snapshot- oder Transaktionsveröffentlichung

  1. Definieren Sie den zu filternden Artikel. Weitere Informationen finden Sie unter Vorgehensweise: Definieren eines Artikels (Replikationsprogrammierung mit Transact-SQL).

  2. Führen Sie auf dem Verleger für die Veröffentlichungsdatenbank sp_articlefilter (Transact-SQL) aus. Geben Sie den Namen des Artikels für @article, den Namen der Veröffentlichung für @publication, den Namen des Filters für @filter_name und die Filterklausel für @filter_clause an (ausgenommen WHERE).

  3. Wenn außerdem ein Spaltenfilter definiert werden muss, finden Sie Informationen unter Vorgehensweise: Definieren und Ändern eines Spaltenfilters (Replikationsprogrammierung mit Transact-SQL). Führen Sie anderenfalls sp_articleview (Transact-SQL) aus. Geben Sie den Veröffentlichungsnamen für @publication, den Namen des gefilterten Artikels für @article und die in Schritt 2 angegebene Filterklausel für @filter_clause an. Damit werden die Synchronisierungsobjekte für den gefilterten Artikel erstellt.

So ändern Sie einen statischen Zeilenfilter für eine Snapshot- oder Transaktionsveröffentlichung

  1. Führen Sie auf dem Verleger für die Veröffentlichungsdatenbank sp_articlefilter (Transact-SQL) aus. Geben Sie den Namen des Artikels für @article, den Namen der Veröffentlichung für @publication, den Namen des neuen Filters für @filter_name und die neue Filterklausel für @filter_clause an (ausgenommen WHERE). Da durch diese Änderung Daten in vorhandenen Abonnements ungültig werden, geben Sie den Wert 1 für @force_reinit_subscription an.

  2. Führen Sie auf dem Verleger für die Veröffentlichungsdatenbank sp_articleview (Transact-SQL) aus. Geben Sie den Veröffentlichungsnamen für @publication, den Namen des gefilterten Artikels für @article und die in Schritt 1 angegebene Filterklausel für @filter_clause an. Dadurch wird die Sicht neu erstellt, die den gefilterten Artikel definiert.

  3. Führen Sie den Snapshot-Agentauftrag für die Veröffentlichung erneut aus, um einen aktualisierten Snapshot zu erstellen. Weitere Informationen finden Sie unter Vorgehensweise: Erstellen des Anfangssnapshots (Replikationsprogrammierung mit Transact-SQL).

  4. Initialisieren Sie die Abonnements erneut. Weitere Informationen finden Sie unter Vorgehensweise: Erneutes Initialisieren eines Abonnements (Replikationsprogrammierung mit Transact-SQL).

So löschen Sie einen statischen Zeilenfilter für eine Snapshot- oder Transaktionsveröffentlichung

  1. Führen Sie auf dem Verleger für die Veröffentlichungsdatenbank sp_articlefilter (Transact-SQL) aus. Geben Sie den Namen des Artikels für @article, den Namen der Veröffentlichung für @publication und den Wert NULL für @filter_name und @filter_clause an. Da durch diese Änderung Daten in vorhandenen Abonnements ungültig werden, geben Sie den Wert 1 für @force_reinit_subscription an.

  2. Führen Sie den Snapshot-Agentauftrag für die Veröffentlichung erneut aus, um einen aktualisierten Snapshot zu erstellen. Weitere Informationen finden Sie unter Vorgehensweise: Erstellen des Anfangssnapshots (Replikationsprogrammierung mit Transact-SQL).

  3. Initialisieren Sie die Abonnements erneut. Weitere Informationen finden Sie unter Vorgehensweise: Erneutes Initialisieren eines Abonnements (Replikationsprogrammierung mit Transact-SQL).

So definieren Sie einen statischen Zeilenfilter für eine Mergeveröffentlichung

  1. Führen Sie auf dem Verleger für die Veröffentlichungsdatenbank sp_addmergearticle (Transact-SQL) aus. Geben Sie die Filterklausel für @subset_filterclause an (ausgenommen WHERE). Weitere Informationen finden Sie unter Vorgehensweise: Definieren eines Artikels (Replikationsprogrammierung mit Transact-SQL).

  2. Wenn außerdem ein Spaltenfilter definiert werden muss, finden Sie Informationen unter Vorgehensweise: Definieren und Ändern eines Spaltenfilters (Replikationsprogrammierung mit Transact-SQL).

So ändern Sie einen statischen Zeilenfilter für eine Mergeveröffentlichung

  1. Führen Sie auf dem Verleger für die Veröffentlichungsdatenbank sp_changemergearticle (Transact-SQL) aus. Geben Sie den Veröffentlichungsnamen für @publication, den Namen des gefilterten Artikels für @article, den Wert subset_filterclause für @property und die neue Filterklausel für @value an (ausgenommen WHERE). Da durch diese Änderung Daten in vorhandenen Abonnements ungültig werden, geben Sie den Wert 1 für @force_reinit_subscription an.

  2. Führen Sie den Snapshot-Agentauftrag für die Veröffentlichung erneut aus, um einen aktualisierten Snapshot zu erstellen. Weitere Informationen finden Sie unter Vorgehensweise: Erstellen des Anfangssnapshots (Replikationsprogrammierung mit Transact-SQL).

  3. Initialisieren Sie die Abonnements erneut. Weitere Informationen finden Sie unter Vorgehensweise: Erneutes Initialisieren eines Abonnements (Replikationsprogrammierung mit Transact-SQL).

Beispiel

In diesem Beispiel für eine Transaktionsreplikation wird der Artikel horizontal gefiltert, um alle eingestellten Produkte zu entfernen.

DECLARE @publication    AS sysname;
DECLARE @table AS sysname;
DECLARE @filterclause AS nvarchar(500);
DECLARE @filtername AS nvarchar(386);
DECLARE @schemaowner AS sysname;
SET @publication = N'AdvWorksProductTran'; 
SET @table = N'Product';
SET @filterclause = N'[DiscontinuedDate] IS NULL'; 
SET @filtername = N'filter_out_discontinued';
SET @schemaowner = N'Production';

-- Add a horizontally and vertically filtered article for the Product table.
-- Manually set @schema_option to ensure that the Production schema 
-- is generated at the Subscriber (0x8000000).
EXEC sp_addarticle 
    @publication = @publication, 
    @article = @table, 
    @source_object = @table,
    @source_owner = @schemaowner, 
    @schema_option = 0x80030F3,
    @vertical_partition = N'true', 
    @type = N'logbased',
    @filter_clause = @filterclause;

-- (Optional) Manually call the stored procedure to create the 
-- horizontal filtering stored procedure. Since the type is 
-- 'logbased', this stored procedures is executed automatically.
EXEC sp_articlefilter 
    @publication = @publication, 
    @article = @table, 
    @filter_clause = @filterclause, 
    @filter_name = @filtername;

-- Add all columns to the article.
EXEC sp_articlecolumn 
    @publication = @publication, 
    @article = @table;

-- Remove the DaysToManufacture column from the article
EXEC sp_articlecolumn 
    @publication = @publication, 
    @article = @table, 
    @column = N'DaysToManufacture', 
    @operation = N'drop';

-- (Optional) Manually call the stored procedure to create the 
-- vertical filtering view. Since the type is 'logbased', 
-- this stored procedures is executed automatically.
EXEC sp_articleview 
    @publication = @publication, 
    @article = @table,
    @filter_clause = @filterclause;
GO

In diesem Beispiel für eine Mergereplikation werden die Artikel horizontal gefiltert, und nur die Zeilen zurückgegeben, die auf den angegebenen Vertriebsmitarbeiter entfallen. Außerdem wird ein Verknüpfungsfilter verwendet. Weitere Informationen finden Sie unter Vorgehensweise: Definieren und Ändern eines Joinfilters zwischen Mergeartikeln (Replikationsprogrammierung mit Transact-SQL).

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