Definieren und Ändern eines parametrisierten Zeilenfilters für einen MergeartikelDefine and Modify a Parameterized Row Filter for a Merge Article

Gilt für: JaSQL Server NeinAzure SQL-Datenbank NeinAzure Synapse Analytics (SQL DW) NeinParallel Data Warehouse APPLIES TO: yesSQL Server noAzure SQL Database noAzure Synapse Analytics (SQL DW) noParallel Data Warehouse

In diesem Thema wird beschrieben, wie in SQL ServerSQL Server mit SQL Server Management StudioSQL Server Management Studio oder Transact-SQLTransact-SQLparametrisierte Zeilenfilter definiert und geändert werden.This topic describes how to define and modify a parameterized row filter in SQL ServerSQL Server by using SQL Server Management StudioSQL Server Management Studio or Transact-SQLTransact-SQL.

Zum Erstellen von Tabellenartikeln können Sie parametrisierte Zeilenfilter verwenden.When creating table articles, you can use parameterized row filters. In diesen Filtern werden mit einer WHERE-Klausel die zu veröffentlichenden Daten ausgewählt.These filters use a WHERE clause to select the appropriate data to be published. 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.Rather than specifying a literal value in the clause (as you do with a static row filter), you specify one or both of the following system functions: SUSER_SNAME and HOST_NAME. Weitere Informationen zu parametrisierten Zeilenfiltern finden Sie unter Parametrisierte Zeilenfilter.For more information, see Parameterized Row Filters.

In diesem ThemaIn This Topic

VorbereitungenBefore You Begin

EinschränkungenLimitations and Restrictions

  • 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.If you add, modify, or delete a parameterized row filter after subscriptions to the publication have been initialized, you must generate a new snapshot and reinitialize all subscriptions after making the change. Weitere Informationen zum Ändern von Eigenschaften finden Sie unter Ändern von Veröffentlichungs- und Artikeleigenschaften.For more information about requirements for property changes, see Change Publication and Article Properties.

EmpfehlungenRecommendations

  • Aus Leistungsgründen wird empfohlen, keine Funktionen auf Spaltennamen in parametrisierten Zeilenfilterklauseln (beispielsweise LEFT([MyColumn]) = SUSER_SNAME()) anzuwenden.For performance reasons, we recommend that you not apply functions to column names in parameterized row filter clauses, such as LEFT([MyColumn]) = SUSER_SNAME(). Wenn Sie HOST_NAME in einer Filterklausel verwenden und den HOST_NAME-Wert überschreiben, müssen Datentypen eventuell mit CONVERT konvertiert werden.If you use HOST_NAME in a filter clause and override the HOST_NAME value, it might be necessary to convert data types using CONVERT. 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.For more information about best practices for this case, see the section "Overriding the HOST_NAME() Value" in the topic Parameterized Row Filters.

Verwenden von SQL Server Management StudioUsing 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 Filterzeilen des Dialogfelds Veröffentlichungseigenschaften - <Veröffentlichung> .Define, modify, and delete parameterized row filters on the Filter Table Rows page of the New Publication Wizard or the Filter Rows page of the Publication Properties - <Publication> dialog box. 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.For more information about using the wizard and accessing the dialog box, see Create a Publication and View and Modify Publication Properties.

So definieren Sie einen parametrisierten ZeilenfilterTo define a parameterized row filter

  1. Klicken Sie auf der Seite Tabellenzeilen filtern des Assistenten für neue Veröffentlichung oder auf der Seite Filterzeilen der Veröffentlichungseigenschaften - <Veröffentlichung> auf Hinzufügen und dann auf Filter hinzufügen.On the Filter Table Rows page of the New Publication Wizard or the Filter Rows page of the Publication Properties - <Publication>, click Add, and then click Add Filter.

  2. Wählen Sie in der Dropdownliste im Dialogfeld Filter hinzufügen die zu filternde Tabelle aus.In the Add Filter dialog box, select a table to filter from the drop-down list box.

  3. Erstellen Sie im Textfeld Filteranweisung eine Filteranweisung.Create a filter statement in the Filter statement text box. 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.You can type directly in the text area, and you can also drag and drop columns from the Columns list box.

    • Der Textbereich Filteranweisung enthält den Standardtext im folgenden Format:The Filter statement text area includes the default text, which is in the form of:

      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.The default text cannot be changed; type the filter clause after the WHERE keyword using standard SQL syntax. 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.A parameterized filter includes a call to the system function HOST_NAME() and/or SUSER_SNAME(), or a user-defined function that references one or both of these functions. Eine vollständige Filterklausel für einen parametrisierten Zeilenfilter kann z. B. wie folgt aussehen:The following is an example of a complete filter clause for a parameterized row filter:

      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.The WHERE clause should use two-part naming; three-part naming and four-part naming are not supported.

  4. Wählen Sie die Option aus, mit der angegeben wird, wie Daten für mehrere Abonnenten freigegeben werden:Select the option that matches how data will be shared among Subscribers:

    • Eine Zeile aus dieser Tabelle wird an mehrere Abonnements gesendetA row from this table will go to multiple subscriptions

    • Eine Zeile aus dieser Tabelle wird nur an ein Abonnement gesendetA row from this table will go to only one subscription

    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.If you select A row from this table will go to only one subscription, merge replication can optimize performance by storing and processing less metadata. Sie müssen jedoch sicherstellen, dass die Daten so partitioniert werden, dass eine Zeile nicht für mehrere Abonnenten repliziert werden kann.However, you must ensure that the data is partitioned in such a way that a row cannot be replicated to more than one Subscriber. Weitere Informationen finden Sie im Abschnitt zum Festlegen von Partitionsoptionen unter Parameterized Row Filters.For more information, see the section "Setting 'partition options'" in the topic Parameterized Row Filters.

  5. Klicken Sie auf OK.Click OK.

  6. Wenn Sie sich im Dialogfeld Veröffentlichungseigenschaften.-.<Veröffentlichung> befinden, klicken Sie auf OK, um zu speichern und das Dialogfeld zu schließen.If you are in the Publication Properties - <Publication> dialog box, click OK to save and close the dialog box.

So ändern Sie einen parametrisierten ZeilenfilterTo modify a parameterized row filter

  1. Wählen Sie auf der Seite Tabellenzeilen filtern des Assistenten für neue Veröffentlichung oder auf der Seite Filterzeilen von Veröffentlichungseigenschaften - <Veröffentlichung> einen Filter im Bereich gefilterte Tabellen, und klicken Sie dann auf Bearbeiten.On the Filter Table Rows page of the New Publication Wizard or the Filter Rows page of the Publication Properties - <Publication>, select a filter in the Filtered Tables pane, and then click Edit.

  2. Ändern Sie den Filter im Dialogfeld Filter bearbeiten .In the Edit Filter dialog box, modify the filter.

  3. Klicken Sie auf OK.Click OK.

So löschen Sie einen parametrisierten ZeilenfilterTo delete a parameterized row filter

  1. Wählen Sie auf der Seite Tabellenzeilen filtern des Assistenten für neue Veröffentlichung oder der Seite Filterzeilen von Veröffentlichungseigenschaften - <Veröffentlichung> einen Filter im Bereich gefilterte Tabellen, und klicken Sie dann auf Löschen.On the Filter Table Rows page of the New Publication Wizard or the Filter Rows page of the Publication Properties - <Publication>, select a filter in the Filtered Tables pane, and then click Delete.

Verwenden von Transact-SQLUsing Transact-SQL

Parametrisierte Zeilenfilter können mithilfe gespeicherter Replikationsprozeduren programmgesteuert erstellt und geändert werden.Parameterized row filters can be created and modified programmatically using replication stored procedures.

So definieren Sie einen parametrisierten Zeilenfilter für einen Artikel in einer MergeveröffentlichungTo define a parameterized row filter for an article in a merge publication

  1. Führen Sie auf dem Verleger für die Veröffentlichungsdatenbank sp_addmergearticle (Transact-SQL) aus.At the Publisher on the publication database, execute sp_addmergearticle (Transact-SQL). Geben Sie @publication an sowie für @article einen Namen für den Artikel, für @source_object die zu veröffentlichende Tabelle, für @subset_filterclause die WHERE-Klausel zur Definition des parametrisierten Filters (ohne Angabe von WHERE) und für @partition_options einen der folgenden Werte zur Beschreibung der Art der Partitionierung, die aus dem parametrisierten Filter resultiert:Specify @publication, a name for the article for @article, the table being published for @source_object, the WHERE clause that defines the parameterized filter for @subset_filterclause (not including WHERE), and one of the following values for @partition_options, which describes the type of partitioning that will result from the parameterized row filter:

    • 0 – Das Filtern für den Artikel ist entweder statisch oder ergibt keine eindeutige Teilmenge von Daten für jede Partition (eine "überlappende" Partition).0 - Filtering for the article either is static or does not yield a unique subset of data for each partition (an "overlapping" 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.1 - Resulting partitions are overlapping, and updates made at the Subscriber cannot change the partition to which a row belongs.

    • 2 – Der Filtervorgang für den Artikel ergibt nicht überlappende Partitionen. Mehrere Abonnenten können jedoch die gleiche Partition erhalten.2 - Filtering for the article yields nonoverlapping partitions, but multiple Subscribers can receive the same partition.

    • 3 – Der Filtervorgang für den Artikel ergibt sich nicht überlappende Partitionen, die für jedes Abonnement eindeutig sind.3 - Filtering for the article yields nonoverlapping partitions that are unique for each subscription.

So ändern Sie einen parametrisierten Zeilenfilter für einen Artikel in einer MergeveröffentlichungTo change a parameterized row filter for an article in a merge publication

  1. Führen Sie auf dem Verleger für die Veröffentlichungsdatenbank sp_changemergearticleaus.At the Publisher on the publication database, execute sp_changemergearticle. 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.Specify @publication, @article, a value of subset_filterclause for @property, the expression that defines the parameterized filter for @value (not including WHERE), and a value of 1 for both @force_invalidate_snapshot and @force_reinit_subscription.

  2. Wenn diese Änderung zu einem anderem Partitionierungsverhalten führt, dann führen Sie sp_changemergearticle erneut aus.If this change results in different partitioning behavior, then execute sp_changemergearticle again. 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:Specify @publication, @article, a value of partition_options for @property, and the most appropriate partitioning option for @value, which can be one of the following:

    • 0 – Das Filtern für den Artikel ist entweder statisch oder ergibt keine eindeutige Teilmenge von Daten für jede Partition (eine "überlappende" Partition).0 - Filtering for the article either is static or does not yield a unique subset of data for each partition (an "overlapping" 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.1 - Resulting partitions are overlapping, and updates made at the Subscriber cannot change the partition to which a row belongs.

    • 2 – Der Filtervorgang für den Artikel ergibt nicht überlappende Partitionen. Mehrere Abonnenten können jedoch die gleiche Partition erhalten.2 - Filtering for the article yields nonoverlapping partitions, but multiple Subscribers can receive the same partition.

    • 3 – Der Filtervorgang für den Artikel ergibt sich nicht überlappende Partitionen, die für jedes Abonnement eindeutig sind.3 - Filtering for the article yields nonoverlapping partitions that are unique for each subscription.

Beispiel (Transact-SQL)Example (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.This example defines a group of articles in a merge publication where the articles are filtered with a series of join filters against the Employee table that is itself filtered using a parameterized row filter on the LoginID column. Während der Synchronisierung wird der von der HOST_NAME -Funktion zurückgegebene Wert überschrieben.During synchronization, the value returned by the HOST_NAME function is overridden. Weitere Informationen finden Sie im Abschnitt "Überschreiben des HOST_NAME()-Werts" im Thema Parameterized Row Filters.For more information, see Overriding the HOST_NAME() Value in the topic 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 InformationenSee Also

Definieren und Ändern eines Verknüpfungsfilters zwischen Mergeartikeln Define and Modify a Join Filter Between Merge Articles
Ändern von Veröffentlichungs- und Artikeleigenschaften Change Publication and Article Properties
Join Filters Join Filters
Parameterized Row FiltersParameterized Row Filters