Share via


Definieren und Ändern eines parametrisierten Zeilenfilters für einen Mergeartikel

In diesem Thema wird beschrieben, wie Sie einen parametrisierten Zeilenfilter in SQL Server 2014 mithilfe von SQL Server Management Studio oder Transact-SQL definieren und ändern.

Zum Erstellen von Tabellenartikeln können Sie parametrisierte Zeilenfilter verwenden. In diesen Filtern werden mit einer WHERE-Klausel die zu veröffentlichenden Daten ausgewählt. Statt in der Klausel einen Literalwert anzugeben (wie dies bei statischen Zeilenfiltern der Fall wäre), wird mindestens eine der folgenden Systemfunktionen angegeben: SUSER_SNAME und HOST_NAME. Weitere Informationen zu parametrisierten Zeilenfiltern finden Sie unter Parametrisierte Zeilenfilter.

Vorbereitungen

Einschränkungen

  • Wenn Sie einen parametrisierten Zeilenfilter hinzufügen, ändern oder löschen, nachdem Abonnements für die Veröffentlichung initialisiert wurden, müssen Sie eine neue Momentaufnahme generieren und alle Abonnements nach vorgenommener Änderung erneut initialisieren. Weitere Informationen zum Ändern von Eigenschaften finden Sie unter Ändern von Veröffentlichungs- und Artikeleigenschaften.

Empfehlungen

  • Aus Leistungsgründen wird empfohlen, keine Funktionen auf Spaltennamen in parametrisierten Zeilenfilterklauseln (beispielsweise LEFT([MyColumn]) = SUSER_SNAME()) anzuwenden. Wenn Sie HOST_NAME in einer Filterklausel verwenden und den HOST_NAME-Wert überschreiben, müssen Datentypen eventuell mit CONVERT konvertiert werden. Weitere Informationen zu bewährten Methoden für diesen Fall finden Sie im Abschnitt über das Überschreiben des HOST_NAME()-Werts im Thema Parameterized Row Filters.

Verwendung von SQL Server Management Studio

Definieren, ändern und löschen Sie parametrisierte Zeilenfilter auf der Seite Tabellenzeilen filtern des Assistenten für neue Veröffentlichung oder auf der Seite Zeilen filtern des Dialogfelds Veröffentlichungseigenschaften – <Veröffentlichung> . Weitere Informationen zum Verwenden des Assistenten sowie Zugriff auf das Dialogfeld finden Sie unter Erstellen einer Veröffentlichung und Anzeigen und Ändern von Veröffentlichungseigenschaften.

So definieren Sie einen parametrisierten Zeilenfilter

  1. Klicken Sie auf der Seite Tabellenzeilen filtern des Assistenten für neue Veröffentlichung oder auf der Seite Zeilen filtern der Veröffentlichungseigenschaften – <Veröffentlichung> auf Hinzufügen, und klicken Sie dann auf Filter hinzufügen.

  2. Wählen Sie in der Dropdownliste im Dialogfeld Filter hinzufügen die zu filternde Tabelle aus.

  3. Erstellen Sie im Textfeld Filteranweisung eine Filteranweisung. Sie können den Text direkt in den Textbereich eingeben, und Sie können Spalten auch mit Drag und Drop aus dem Listenfeld Spalten einfügen.

    • Der Textbereich Filteranweisung enthält den Standardtext im folgenden Format:

      SELECT <published_columns> FROM [tableowner].[tablename] WHERE  
      
    • Der Standardtext kann nicht geändert werden. Geben Sie mithilfe der SQL-Standardsyntax im Anschluss an das WHERE-Schlüsselwort die Filterklausel ein. Parametrisierte Filter enthalten einen Aufruf der HOST_NAME()- und/oder SUSER_SNAME()-Systemfunktion bzw. einer benutzerdefinierten Funktion, die auf eine oder beide dieser Funktionen verweist. Eine vollständige Filterklausel für einen parametrisierten Zeilenfilter kann z. B. wie folgt aussehen:

      SELECT <published_columns> FROM [HumanResources].[Employee] WHERE LoginID = SUSER_SNAME()  
      

      Verwenden Sie einen zweiteiligen Namen für die WHERE-Klausel, drei- oder vierteilige Namen werden nicht unterstützt.

  4. Wählen Sie die Option aus, mit der angegeben wird, wie Daten für mehrere Abonnenten freigegeben werden:

    • Eine Zeile aus dieser Tabelle wird an mehrere Abonnements gesendet

    • Eine Zeile aus dieser Tabelle wird nur an ein Abonnement gesendet

    Wenn Sie Eine Zeile aus dieser Tabelle wird nur an ein Abonnement gesendetauswählen, kann die Mergereplikation die Leistung optimieren, da weniger Metadaten gespeichert und verarbeitet werden. Sie müssen jedoch sicherstellen, dass die Daten so partitioniert werden, dass eine Zeile nicht für mehrere Abonnenten repliziert werden kann. Weitere Informationen finden Sie im Abschnitt zum Festlegen von Partitionsoptionen unter Parameterized Row Filters.

  5. Klicken Sie auf OK.

  6. Wenn Sie sich im Dialogfeld Veröffentlichungseigenschaften – <Veröffentlichung> befinden, klicken Sie auf OK , um das Dialogfeld zu speichern und zu schließen.

So ändern Sie einen parametrisierten Zeilenfilter

  1. Wählen Sie auf der Seite Tabellenzeilen filtern des Assistenten für neue Veröffentlichung oder auf der Seite Zeilen filtern der Veröffentlichungseigenschaften – <Veröffentlichung> im Bereich Gefilterte Tabellen einen Filter aus, und klicken Sie dann auf Bearbeiten.

  2. Ändern Sie den Filter im Dialogfeld Filter bearbeiten .

  3. Klicken Sie auf OK.

So löschen Sie einen parametrisierten Zeilenfilter

  1. Wählen Sie auf der Seite Tabellenzeilen filtern des Assistenten für neue Veröffentlichung oder auf der Seite Zeilen filtern der Veröffentlichungseigenschaften – <Veröffentlichung> einen Filter im Bereich Gefilterte Tabellen aus, und klicken Sie dann auf Löschen.

Verwenden von Transact-SQL

Parametrisierte Zeilenfilter können mithilfe gespeicherter Replikationsprozeduren programmgesteuert erstellt und geändert werden.

So definieren Sie einen parametrisierten Zeilenfilter für einen Artikel in einer Mergeveröffentlichung

  1. Führen Sie auf dem Verleger für die Veröffentlichungsdatenbank sp_addmergearticle (Transact-SQL) aus. Geben Sie @publication, einen Namen für den Artikel für @article, die tabelle, die für @source_object veröffentlicht wird, die WHERE-Klausel, die den parametrisierten Filter für @subset_filterclause definiert (ohne ), WHEREund einen der folgenden Werte für @partition_options an, der den Typ der Partitionierung beschreibt, der sich aus dem parametrisierten Zeilenfilter ergibt:

    • 0 – Das Filtern für den Artikel ist entweder statisch oder ergibt keine eindeutige Teilmenge von Daten für jede Partition (eine "überlappende" Partition).

    • 1 – Die resultierenden Partitionen überlappen sich, und beim Abonnenten vorgenommene Updates können nicht zur Änderung der Partition führen, zu der eine Zeile gehört.

    • 2 – Der Filtervorgang für den Artikel ergibt nicht überlappende Partitionen. Mehrere Abonnenten können jedoch die gleiche Partition erhalten.

    • 3 – Der Filtervorgang für den Artikel ergibt sich nicht überlappende Partitionen, die für jedes Abonnement eindeutig sind.

So ändern Sie einen parametrisierten Zeilenfilter für einen Artikel in einer Mergeveröffentlichung

  1. Führen Sie auf dem Verleger für die Veröffentlichungsdatenbank sp_changemergearticleaus. Geben Sie @publication@article den Wert subset_filterclause für @property, den Ausdruck, der den parametrisierten Filter für @value definiert (ohne ), WHEREund den Wert 1 für @force_invalidate_snapshot und @force_reinit_subscription an.

  2. Wenn diese Änderung zu einem anderem Partitionierungsverhalten führt, dann führen Sie sp_changemergearticle erneut aus. Geben Sie @publication, @article, den Wert partition_options für @property und die am besten geeignete Partitionierungsoption für @value an. Dies kann eine der folgenden Sein:

    • 0 – Das Filtern für den Artikel ist entweder statisch oder ergibt keine eindeutige Teilmenge von Daten für jede Partition (eine "überlappende" Partition).

    • 1 – Die resultierenden Partitionen überlappen sich, und beim Abonnenten vorgenommene Updates können nicht zur Änderung der Partition führen, zu der eine Zeile gehört.

    • 2 – Der Filtervorgang für den Artikel ergibt nicht überlappende Partitionen. Mehrere Abonnenten können jedoch die gleiche Partition erhalten.

    • 3 – Der Filtervorgang für den Artikel ergibt sich nicht überlappende Partitionen, die für jedes Abonnement eindeutig sind.

Beispiel (Transact-SQL)

In diesem Beispiel wird eine Gruppe von Artikeln in einer Mergeveröffentlichung definiert, bei der die Artikel mit einer Reihe von Verknüpfungsfiltern anhand der Employee -Tabelle gefiltert werden, die selbst mithilfe eines parametrisierten Zeilenfilters in der LoginID -Spalte gefiltert wird. Während der Synchronisierung wird der von der HOST_NAME -Funktion zurückgegebene Wert überschrieben. Weitere Informationen finden Sie im Abschnitt "Überschreiben des HOST_NAME()-Werts" im Thema Parameterized Row Filters.

-- 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

Weitere Informationen

Definieren und Ändern eines Verknüpfungsfilters zwischen Mergeartikeln
Ändern von Veröffentlichungs- und Artikeleigenschaften
Join Filters
Parametrisierte Zeilenfilter