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

Gilt für:SQL Server

In diesem Thema wird beschrieben, wie Sie einen parametrisierten Zeilenfilter in SQL Server 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.

In diesem Thema

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 parametrisierter Zeilenfilter auf der Seite 'Tabellenzeilen filtern' des Assistenten für neue Publikation oder der Seite 'Zeilen filtern ' der Publikationseigenschaften - <Publikationsdialogfeld> . 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 "Neue Publikation" oder auf der Seite "Zeilen filtern" der Publikationseigenschaften auf <"Hinzufügen>", klicken Sie 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. Klickan Sie auf OK.

  6. Wenn Sie sich im Dialogfeld "Publikationseigenschaften <- Publikation>" 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 'Neue Publikation' oder der Seite 'Zeilen filtern ' der Publikationseigenschaften - <Publikation> einen Filter im Bereich 'Gefilterte Tabellen' aus, und klicken Sie dann auf ' Bearbeiten'.

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

  3. Klickan Sie auf OK.

So löschen Sie einen parametrisierten Zeilenfilter

  1. Wählen Sie auf der Seite "Tabellenzeilen filtern" des Assistenten für neue Publikation oder auf der Seite "Zeilen filtern" der Publikationseigenschaften - <Publikation> 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 im Publisher in der Publikationsdatenbank sp_addmergearticle (Transact-SQL) aus. Geben Sie @publication, einen Namen für den Artikel für @article, die zu veröffentlichende Tabelle für @source_object, die WHERE-Klausel zur Definition des parametrisierten Filters für @subset_filterclause (ohne Angabe von WHERE) und einen der folgenden Werte für @partition_optionsan, der die Art der Partitionierung beschreibt, die aus dem parametrisierten Filter resultiert:

    • 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, einen Wert von subset_filterclause für @property an, den Ausdruck, der den parametrisierten Filter für @value definiert (nicht eingeschlossenWHERE), und einen Wert von 1 für @force_invalidate_Momentaufnahme und @force_reinit_subscription.

  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 @propertyund die am besten geeignete Partitionierungsoption für @valuean. Folgende Partitionierungsoptionen können angegeben werden:

    • 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'AdventureWorks2022';
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 [AdventureWorks2022];

-- Enable AdventureWorks2022 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 AdventureWorks2022.', 
  @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
Verknüpfungsfilter
Parameterized Row Filters