Verknüpfungsfilter

Mithilfe von Verknüpfungsfiltern können Tabellen so gefiltert werden wie die zugehörigen Tabellen in der Veröffentlichung. In der Regel wird eine übergeordnete Tabelle mithilfe eines parametrisierten Filters gefiltert. Anschließend werden ein oder mehrere Verknüpfungsfilter auf dieselbe Weise definiert, wie Sie eine Verknüpfung zwischen Tabellen definieren. Die Verknüpfungsfilter erweitern den parametrisierten Filter so, dass die Daten in den zugehörigen Tabellen nur dann repliziert werden, wenn sie der Verknüpfungsfilterklausel entsprechen.

Verknüpfungsfilter folgen in der Regel den für die Tabellen definierten Primärschlüssel/Fremdschlüssel (PRIMARY KEY/FOREIGN KEY)-Beziehungen, auf die sie angewendet werden, sie sind jedoch nicht strikt auf Primärschlüssel/Fremdschlüssel-Beziehungen beschränkt. Verknüpfungsfilter können auf jeder Logik basieren, die miteinander in Beziehung stehende Daten in zwei Tabellen vergleicht.

Nehmen wir als Beispiel die folgenden Tabellen in der Adventure Works-Beispieldatenbank, die durch eine Primärschlüssel/Fremdschlüssel-Beziehung miteinander verbunden sind:

  • HumanResources.Employee

  • Sales.SalesOrderHeader

  • Sales.SalesOrderDetail

Diese Tabellen könnten in einer Anwendung zur Unterstützung mobiler Außendienstmitarbeiter verwendet werden, müssen dabei aber gefiltert werden, damit jeder Mitarbeiter in der HumanResources.Employee-Tabelle nur die für die Aufträge seiner Kunden relevanten Daten erhält.

Dafür muss als Erstes ein parametrisierter Filter für die übergeordnete Tabelle definiert werden. In diesem Beispiel ist dies die HumanResources.Employee-Tabelle. Diese Tabelle enthält die LoginID-Spalte, in der Sie die Domäne und den Anmeldenamen (Anmelde-ID) für jeden Mitarbeiter in der Form domain\login finden. Wenn Sie diese Tabelle so filtern möchten, dass jeder Mitarbeiter nur die Daten erhält, die für ihn relevant sind, geben Sie folgende parametrisierte Filterklausel an:

LoginID = SUSER_SNAME()

Dieser Filter stellt sicher, dass das Abonnement des jeweiligen Mitarbeiters nur die Daten aus der HumanResources.Employee-Tabelle enthält, die für ihn relevant sind (in diesem Fall also nur eine einzelne Zeile). Weitere Informationen finden Sie unter Parametrisierte Zeilenfilter.

Als Nächstes wird dieser Filter auf jede einzelne der zugehörigen Tabellen erweitert. Die dazu verwendete Syntax ähnelt derjenigen, mit der Sie eine Verknüpfung zwischen zwei Tabellen angeben können. Die erste Verknüpfungsfilterklausel lautet:

Employee.EmployeeID = SalesOrderHeader.SalesPersonID

Diese Klausel stellt sicher, dass das Abonnement nur die Auftragsdaten enthält, die für den betreffenden Außendienstmitarbeiter relevant sind. Die zweite Verknüpfungsfilterklausel lautet:

SalesOrderHeader.SalesOrderID = SalesOrderDetail.SalesOrderID

Diese Klausel stellt sicher, dass das Abonnement nur die den Auftragsdaten zugehörigen Detaildaten des betreffenden Außendienstmitarbeiters enthält. Dieses Beispiel zeigt eine Einzeltabelle, die an jedem Punkt verknüpft ist. Es ist aber auch möglich, an jedem Punkt mehrere Tabellen zu verknüpfen.

Verknüpfungsfilter können jeweils einzeln im Assistenten für neue Veröffentlichung und im Dialogfeld Veröffentlichungseigenschaften oder aber programmgesteuert hinzugefügt werden. Außerdem können Verknüpfungsfilter über den Assistenten für neue Veröffentlichung automatisch generiert werden: Geben Sie dazu einen Zeilenfilter für eine Tabelle an, und die Verknüpfungsfilter werden auf alle entsprechenden Tabellen angewendet.

Optimieren der Verknüpfungsfilterleistung

Zur Optimierung der Leistung der Verknüpfungsfilter sollten Sie die folgenden Hinweise beachten:

  • Begrenzen Sie die Anzahl der Tabellen in der Verknüpfungsfilterhierarchie.

    Verknüpfungsfilter können zwar eine unbegrenzte Anzahl von Tabellen enthalten, Filter mit einer großen Tabellenanzahl wirken sich aber möglicherweise deutlich negativ auf die Leistung bei der Mergeverarbeitung aus. Wenn Sie Verknüpfungsfilter mit fünf oder mehr Tabellen generieren, sollten Sie über andere Lösungen nachdenken: Filtern Sie keine Tabellen, die klein sind, die nicht geändert werden oder bei denen es sich in erster Linie um Nachschlagetabellen handelt. Verwenden Sie Verknüpfungsfilter nur zwischen Tabellen, die auf Abonnements aufgeteilt (partitioniert) werden müssen.

  • Legen Sie, sofern zutreffend, für join unique key den Wert True fest.

    Im Mergeprozess sind besondere Leistungsoptimierungsmöglichkeiten verfügbar, wenn die verknüpfte Spalte in der übergeordneten Tabelle eindeutig ist. Wenn die Verknüpfungsbedingung auf einer eindeutigen Spalte basiert, aktivieren Sie die Option join unique key für den Verknüpfungsfilter. Informationen zum Festlegen dieser Option finden Sie in den im vorhergehenden Abschnitt genannten Vorgehensweise-Themen.

  • Stellen Sie sicher, dass die Spalten, auf die in den Verknüpfungsfiltern verwiesen wird, indiziert sind.

    Wenn die Spalten, auf die im Filter verwiesen wird, indiziert sind, kann die Replikation die Filter effizienter verarbeiten.

  • Erstellen Sie keine Zeilenfilter, die sich wie Verknüpfungsfilter verhalten.

    Mithilfe einer Unterabfrage in einer WHERE-Klausel ist es möglich, Zeilenfilter zu erstellen, die sich wie Verknüpfungsfilter verhalten:

    WHERE Customer.SalesPersonID IN (SELECT EmployeeID FROM Employee WHERE LoginID = SUSER_SNAME()) 
    

    Es wird dringend empfohlen, eine solche Logik statt in einer Unterabfrage in einem Verknüpfungsfilter auszudrücken. Wenn Ihre Anwendung für die Verwendung einer Unterabfrage einen Zeilenfilter benötigt, stellen Sie sicher, dass die Unterabfrage ausschließlich Daten in der Nachschlagetabelle referenziert, die sich nicht ändern.