Procedura: Definizione e modifica di un filtro di riga con parametri per un articolo di merge (programmazione Transact-SQL della replica)

Quando si creano articoli di tabella, è possibile utilizzare filtri di riga con parametri. Questi filtri utilizzano una clausola WHERE per selezionare i dati adatti da pubblicare. Anziché specificare un valore letterale nella clausola, come avviene con il filtro di riga statico, si specificano una o entrambe le funzioni di sistema seguenti: SUSER_SNAME e HOST_NAME. Per ulteriori informazioni sui filtri di riga con parametri, vedere Filtri di riga con parametri. È possibile creare e modificare a livello di programmazione i filtri di riga con parametri tramite le stored procedure di replica.

Per definire un filtro di riga con parametri per un articolo in una pubblicazione di tipo merge

  • Nel database di pubblicazione del server di pubblicazione eseguire sp_addmergearticle (Transact-SQL). Specificare @publication, un nome di articolo per @article, la tabella da pubblicare per @source_object, la clausola WHERE che definisce il filtro con parametri per @subset_filterclause (escluso WHERE) e uno dei valori seguenti per @partition_options, che descrive il tipo di partizionamento risultante dall'applicazione del filtro di riga con parametri:

    • 0: il filtro dell'articolo è statico oppure non restituisce un subset univoco di dati per ogni partizione, ovvero si tratta di una partizione "sovrapposta".

    • 1: le partizioni risultanti sono sovrapposte e gli aggiornamenti apportati nel Sottoscrittore non possono modificare la partizione a cui appartiene una riga.

    • 2: il filtro dell'articolo restituisce partizioni non sovrapposte, ma più Sottoscrittori ricevono la stessa partizione.

    • 3: il filtro dell'articolo restituisce partizioni non sovrapposte univoche per ogni sottoscrizione.

Per modificare un filtro di riga con parametri per un articolo in una pubblicazione di tipo merge

  1. Nel database di pubblicazione del server di pubblicazione eseguire sp_changemergearticle. Specificare @publication, @article, il valore subset_filterclause per @property, l'espressione che definisce il filtro con parametri per @value (escluso WHERE) e il valore 1 sia per @force_invalidate_snapshot che per @force_reinit_subscription.

  2. Se questa modifica implica un diverso comportamento del partizionamento, eseguire nuovamente sp_changemergearticle. Specificare @publication, @article, il valore partition_options per @property e l'opzione di partizionamento più appropriata tra quelle elencate di seguito per @value:

    • 0: il filtro dell'articolo è statico oppure non restituisce un subset univoco di dati per ogni partizione, ovvero si tratta di una partizione "sovrapposta".

    • 1: le partizioni risultanti sono sovrapposte e gli aggiornamenti apportati nel Sottoscrittore non possono modificare la partizione a cui appartiene una riga.

    • 2: il filtro dell'articolo restituisce partizioni non sovrapposte, ma più Sottoscrittori ricevono la stessa partizione.

    • 3: il filtro dell'articolo restituisce partizioni non sovrapposte univoche per ogni sottoscrizione.

Esempio

In questo esempio viene definito un gruppo di articoli di una pubblicazione di tipo merge in cui agli articoli è applicata una serie di filtri join sulla tabella Employee che presenta essa stessa un filtro di riga con parametri sulla colonna LoginID. Durante la sincronizzazione viene sostituito il valore restituito dalla funzione HOST_NAME. Per ulteriori informazioni, vedere la sezione relativa alla sostituzione del valore HOST_NAME() nell'argomento Filtri di riga con parametri.

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

-- Enable AdventureWorks 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 AdventureWorks.', 
  @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].[EmployeeID] = [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