Freigeben über


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

In diesem Thema wird beschrieben, wie in SQL Server 2012 mit SQL Server Management Studio oder Transact-SQL parametrisierte Zeilenfilter definiert und geändert werden.

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

    Sicherheit

  • So definieren oder ändern Sie einen parametrisierten Zeilenfilter mit:

    SQL Server Management Studio

    Transact-SQL

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 zu den Anforderungen für Eigenschaftenänderungen 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 Wert HOST_NAME überschreiben, kann es erforderlich sein, Datentypen mithilfe von CONVERT zu konvertieren. Weitere Informationen zu bewährten Methoden für diesen Fall finden Sie im Abschnitt zum Überschreiben des HOST_NAME()-Werts im Thema Parametrisierte Zeilenfilter.

Pfeilsymbol, dass mit dem Link "Zurück zum Anfang" verwendet wird[Top]

Verwendung von SQL Server Management Studio

Zum Definieren, Ändern oder Löschen parametrisierter Zeilenfilter steht Ihnen die Seite Tabellenzeilen filtern des Assistenten für neue Veröffentlichung bzw. die Seite Zeilen filtern des Dialogfelds Veröffentlichungseigenschaften – <Veröffentlichung> zur Verfügung. Weitere Informationen zum Verwenden des Assistenten sowie zum Zugreifen 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 des Dialogfelds Veröffentlichungseigenschaften – <Veröffentlichung> auf Hinzufügen und anschließend 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 in folgender Form:

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

      Die WHERE-Klausel muss zweiteilige Benennungen verwenden. Drei- und vierteilige Benennungen 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 gesendet auswä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 Parametrisierte Zeilenfilter.

  5. Klicken Sie auf OK.  

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

So ändern Sie einen parametrisierten Zeilenfilter

  1. Wählen Sie im Assistenten für neue Veröffentlichung auf der Seite Tabellenzeilen filtern oder im Dialogfeld Veröffentlichungseigenschaften – <Veröffentlichung> auf der Seite Zeilen filtern 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

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

Pfeilsymbol, dass mit dem Link "Zurück zum Anfang" verwendet wird[Top]

Verwendung 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

  • 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 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_options an, der die Art der Partitionierung beschreibt, die aus dem parametrisierten Filter resultiert:

    • 0 – Der Filtervorgang 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 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_changemergearticle aus. Geben Sie @publication, @article, den Wert subset_filterclause für @property, den Ausdruck zur Definition des parametrisierten Filters für @value (ohne Angabe von WHERE) und den Wert 1 sowohl für @force_invalidate_snapshot als auch für @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. 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 Parametrisierte Zeilenfilter .

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

Pfeilsymbol, dass mit dem Link "Zurück zum Anfang" verwendet wird[Top]

Siehe auch

Konzepte

Definieren und Ändern eines Verknüpfungsfilters zwischen Mergeartikeln

Ändern von Veröffentlichungs- und Artikeleigenschaften

Joinfilter

Parametrisierte Zeilenfilter