Gepubliceerde gegevens filteren

Van toepassing op:SQL ServerAzure SQL Managed Instance

Met tabelartikelen filteren kunt u partities van gegevens maken die kunnen worden gepubliceerd. Door gepubliceerde gegevens te filteren, kunt u het volgende doen:

  • Minimaliseer de hoeveelheid gegevens die via het netwerk worden verzonden.

  • Verminder de hoeveelheid opslagruimte die nodig is voor de abonnee.

  • Publicaties en toepassingen aanpassen op basis van de vereisten voor afzonderlijke abonnees.

  • Vermijd of verminder conflicten als abonnees gegevens bijwerken, aangezien verschillende gegevenspartities naar verschillende abonnees kunnen worden verzonden (zodat geen twee abonnees dezelfde gegevenswaarden bijwerken).

  • Vermijd het verzenden van gevoelige gegevens. Rijfilters en kolomfilters kunnen worden gebruikt om de toegang van een abonnee tot gegevens te beperken. Voor samenvoegreplicatie zijn er beveiligingsoverwegingen als u een geparameteriseerd filter gebruikt dat HOST_NAME() bevat. Zie de sectie 'Filteren met HOST_NAME()' in Geparameteriseerde rijfilters voor meer informatie.

Replicatie biedt vier typen filters:

  • Statische rijfilters, die beschikbaar zijn voor alle typen replicatie.

    Met behulp van statische rijfilters kunt u een subset kiezen van rijen die moeten worden gepubliceerd. Alle abonnees van een gefilterde publicatie ontvangen dezelfde subset rijen voor de gefilterde tabel. Zie de sectie Statische rijfilters in dit onderwerp voor meer informatie.

  • Kolomfilters, die beschikbaar zijn voor alle typen replicatie.

    Met kolomfilters kunt u een subset van kolommen kiezen die u wilt publiceren. Zie de sectie Kolomfilters in dit onderwerp voor meer informatie.

  • Geparameteriseerde rijfilters, die alleen beschikbaar zijn bij samenvoegreplicatie.

    Met behulp van geparameteriseerde rijfilters kunt u een subset kiezen van rijen die moeten worden gepubliceerd. In tegenstelling tot statische filters die dezelfde subset rijen naar elke abonnee verzenden, gebruiken geparameteriseerde rijfilters een gegevenswaarde die door de abonnee wordt geleverd om abonnees verschillende subsets van rijen te verzenden. Zie Geparameteriseerde rijfiltersvoor meer informatie.

  • Join filters, die alleen beschikbaar zijn bij samengevoegde replicatie.

    Met behulp van joinfilters kunt u een rijfilter van de ene gepubliceerde tabel naar de andere uitbreiden. Zie Join-filters voor meer informatie.

Statische rijfilters

In de volgende afbeelding ziet u een gepubliceerde tabel die wordt gefilterd, zodat alleen de rijen 2, 3 en 6 in de publicatie worden opgenomen.

Rijfiltering

Een statisch rijfilter maakt gebruik van een WHERE-component om de juiste gegevens te selecteren die moeten worden gepubliceerd; u het laatste deel van de WHERE-component opgeeft. Bekijk de producttabel in de voorbeelddatabase Adventure Works, die de kolom ProductLine bevat. Als u alleen de rijen met gegevens over producten met betrekking tot mountainbikes wilt publiceren, geeft u op ProductLine = 'M'.

Een statisch rijfilter resulteert in één set gegevens voor elke publicatie. In het vorige voorbeeld ontvangen alle abonnees alleen de rijen met gegevens over producten die betrekking hebben op mountainbikes. Als u een andere abonnee hebt waarvoor alleen de rijen met gegevens over producten met betrekking tot road bikes zijn vereist:

  • Met momentopname of transactionele replicatie kunt u een andere publicatie maken, waarin u de tabel in beide publicaties opneemt (in de filterclausule voor het artikel in die publicatie, geeft u op ProductLine = 'R').

    Opmerking

    Rijfilters in transactionele publicaties kunnen aanzienlijke overhead toevoegen omdat de artikelfiltervoorwaarde wordt geëvalueerd voor elke logboekvermelding die is geschreven voor een gepubliceerde tabel, om vast te stellen of de rij gerepliceerd moet worden. Rijfilters in transactionele publicaties moeten worden vermeden als elk replicatieknooppunt de volledige gegevensbelasting kan ondersteunen en de algehele gegevensset redelijk klein is.

  • Gebruik bij samenvoegingsreplicatie geparameteriseerde rijfilters in plaats van meerdere publicaties te maken met statische rijfilters. Zie Geparameteriseerde rijfiltersvoor meer informatie.

Als u een statisch rijfilter wilt definiëren of wijzigen, raadpleegt u Een statisch rijfilter definiëren en wijzigen.

Kolomfilters

In de volgende afbeelding ziet u een publicatie die kolom C filtert.

Kolomfiltering

U kunt ook samen rij- en kolomfilters gebruiken, zoals hier wordt geïllustreerd.

Rij- en kolomfilters rij

Nadat een publicatie is gemaakt, kunt u kolomfilters gebruiken om een kolom uit een bestaande publicatie te verwijderen, maar de kolom in de tabel in Publisher te behouden en ook om een bestaande kolom in de publicatie op te nemen. Voor andere wijzigingen, zoals het toevoegen van een nieuwe kolom aan een tabel en deze vervolgens toevoegen aan het gepubliceerde artikel, gebruikt u schemawijzigingsreplicatie. Zie de secties Kolommen toevoegen en Kolommen verwijderen in het onderwerp Schemawijzigingen aanbrengen in publicatiedatabases voor meer informatie.

De typen kolommen in de volgende tabel kunnen niet worden gefilterd uit bepaalde typen publicaties.

Kolomtype Type van publicatie en opties
Primaire sleutelkolom Primaire-sleutelkolommen zijn vereist voor alle tabellen in transactionele publicaties. Primaire sleutels zijn niet vereist voor tabellen in samenvoegpublicaties, maar als er een primaire-sleutelkolom aanwezig is, kan deze niet worden gefilterd.
Kolom vreemde sleutel Alle publicaties die zijn gemaakt met de wizard Nieuwe publicatie. U kunt kolommen met vreemde sleutels filteren met behulp van Transact-SQL stored procedures. Definieer en wijzig een kolomfilter voor meer informatie.
De rowguid-kolom Publicaties samenvoegen*
De kolom msrepl_tran_version Momentopname of transactionele publicaties die kunnen worden bijgewerkt
Kolommen waarvoor NULL niet is toegestaan en waarvoor geen standaardwaarden of de IDENTITY eigenschap zijn ingesteld. Momentopname of transactionele publicaties die kunnen worden bijgewerkt
Kolommen met unieke beperkingen of indexen Momentopname of transactionele publicaties die kunnen worden bijgewerkt
Alle kolommen in een SQL Server 7.0-samenvoegpublicatie Kolommen kunnen niet worden gefilterd in samenvoegpublicaties van SQL Server 7.0.
Tijdstempel SQL Server 7.0-snapshot of transactionele publicaties, die wijzigbare abonnementen toestaan

*Als u een tabel in een samenvoegpublicatie publiceert en die tabel al een kolom van het gegevenstype uniqueidentifier bevat met de eigenschap ROWGUIDCOL , kan replicatie deze kolom gebruiken in plaats van een extra kolom met de naam rowguid te maken. In dit geval moet de bestaande kolom worden gepubliceerd.

Zie Een kolomfilter definiëren en wijzigen om een kolomfilter te definiëren of te wijzigen.

Overwegingen voor filteren

Houd rekening met de volgende overwegingen bij het filteren van gegevens:

  • Alle kolommen waarnaar in rijfilters wordt verwezen, moeten worden opgenomen in de publicatie. Met andere woorden, u kunt geen kolomfilter gebruiken om een kolom uit te sluiten die in een rijfilter wordt gebruikt.

  • Als een filter wordt toegevoegd of gewijzigd nadat abonnementen zijn geïnitialiseerd, moeten de abonnementen opnieuw worden geïnitialiseerd.

  • Het maximum aantal bytes dat is toegestaan voor een kolom die in een filter wordt gebruikt, is 1024 voor een artikel in een samenvoegpublicatie en 8000 voor een artikel in een transactionele publicatie.

  • Kolommen met de volgende gegevenstypen kunnen niet worden verwezen naar in rijfilters of join-filters.

    • varchar(max) en nvarchar(max)

    • varbinary(max)

    • tekst en ntekst

    • afbeelding

    • XML

    • UDT

  • Met transactionele replicatie kunt u een geïndexeerde weergave repliceren als een weergave of als een tabel. Als u de weergave als tabel repliceert, kunt u geen kolommen uit de tabel filteren.

Rijfilters zijn niet ontworpen om tussen databases te werken. SQL Server beperkt opzettelijk de uitvoering van sp_replcmds (waaronder filters worden uitgevoerd) aan de database-eigenaar (dbo). De dbo heeft geen bevoegdheden voor meerdere databases. Met de toevoeging van CDC (Change Data Capture) in SQL Server 2008 (10.0.x) vult de sp_replcmds logica de tabellen voor het bijhouden van wijzigingen in met informatie waarnaar de gebruiker kan terugkeren en query's kan uitvoeren. Om veiligheidsredenen beperkt SQL Server de uitvoering van deze logica, zodat een kwaadwillende dbo dit uitvoeringspad niet kan verjagen. Een kwaadwillende dbo kan bijvoorbeeld triggers toevoegen aan CDC-tabellen die vervolgens worden uitgevoerd onder de context van de gebruiker die sp_replcmds aanroept, in dit geval de logreader-agent. Als het account waaronder de agent draait een hogere bevoegdheid heeft, kan de kwaadaardige dbo hun bevoegdheden verhogen.