Share via


Definizione e modifica di un filtro di riga con parametri per un articolo di merge

Questo argomento descrive come definire e modificare un filtro di riga con parametri in SQL Server 2014 usando SQL Server Management Studio o Transact-SQL.

Quando si creano articoli di tabella, è possibile usare filtri di riga con parametri. Questi filtri usano 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, specificare una o entrambe le funzioni di sistema seguenti: SUSER_SNAME e HOST_NAME. Per altre informazioni sui filtri di riga con parametri, vedere Filtri di riga con parametri.

Prima di iniziare

Limitazioni e restrizioni

  • Se si aggiunge, modifica o elimina un filtro di riga con parametri dopo che sono state inizializzate sottoscrizioni per la pubblicazione, è necessario generare un nuovo snapshot e reinizializzare tutte le sottoscrizioni in seguito alla modifica. Per altre informazioni sui requisiti per la modifica delle proprietà, vedere Modificare le proprietà di pubblicazioni e articoli.

Consigli

  • Per motivi relativi alle prestazioni è consigliabile evitare di applicare funzioni ai nomi di colonna nelle clausole per filtri di riga con parametri, come LEFT([MyColumn]) = SUSER_SNAME(). Se si usano HOST_NAME in una clausola di filtro e si sostituisce il valore HOST_NAME, può essere necessario convertire i tipi di dati tramite l'istruzione CONVERT. Per altre informazioni sulle procedure consigliate in questo caso, vedere la sezione relativa alla sostituzione del valore HOST_NAME() nell'argomento Parameterized Row Filters.

Uso di SQL Server Management Studio

Definire, modificare ed eliminare filtri di riga con parametri nella pagina Filtra righe tabella della Creazione guidata nuova pubblicazione o nella pagina Filtra righe della finestra di dialogo Proprietà pubblicazione - <Pubblicazione> . Per altre informazioni sull'uso della creazione guidata e l'accesso alla finestra di dialogo, vedere Creare una pubblicazione e Visualizzare e modificare le proprietà della pubblicazione.

Per definire un filtro di riga con parametri

  1. Nella pagina Filtro righe tabella della Creazione guidata nuova pubblicazione o nella pagina Filtra righe della pubblicazione Proprietà pubblicazione - <Pubblicazione> fare clic su Aggiungi e quindi su Aggiungi filtro.

  2. Nella finestra di dialogo Aggiungi filtro selezionare una tabella da filtrare nell'elenco a discesa.

  3. Creare un'istruzione di filtro nella casella di testo Istruzione per il filtro . È possibile digitare direttamente nell'area di testo nonché trascinare colonne dalla casella di riepilogo Colonne .

    • L'area di testo Istruzione per il filtro contiene il testo predefinito, nel formato seguente:

      SELECT <published_columns> FROM [tableowner].[tablename] WHERE  
      
    • Il testo predefinito non può essere modificato. Digitare la clausola di filtro dopo la parola chiave WHERE usando la sintassi SQL standard. Un filtro con parametri include una chiamata alla funzione di sistema HOST_NAME() e/o SUSER_SNAME() oppure a una funzione definita dall'utente che fa riferimento a una di queste funzioni o a entrambe. Di seguito è riportato un esempio di una clausola di filtro completa per un filtro di riga con parametri:

      SELECT <published_columns> FROM [HumanResources].[Employee] WHERE LoginID = SUSER_SNAME()  
      

      Per la clausola WHERE è consigliabile usare nomi in due parti. I nomi in tre e quattro parti non sono supportati.

  4. Selezionare l'opzione corrispondente alla modalità desiderata di condivisione dei dati tra i Sottoscrittori:

    • Una riga di questa tabella verrà inviata a più sottoscrizioni

    • Una riga di questa tabella verrà inviata a una sola sottoscrizione

    Selezionando Una riga di questa tabella verrà inviata a una sola sottoscrizioneè possibile ottimizzare le prestazioni della replica di tipo merge archiviando ed elaborando una minore quantità di metadati. È tuttavia necessario garantire che i dati vengano partizionati in modo da non consentire la replica di una riga in più Sottoscrittori. Per altre informazioni, vedere la sezione relativa all'impostazione delle opzioni delle partizioni nell'argomento Filtri di riga con parametri.

  5. Fare clic su OK.

  6. Se si è nella finestra di dialogo Proprietà pubblicazione - <Pubblicazione> , fare clic su OK per salvare e chiudere la finestra di dialogo.

Per modificare un filtro di riga con parametri

  1. Nella pagina Filtro righe tabella della Creazione guidata nuova pubblicazione o nella pagina Filtro righe della pubblicazione Proprietà pubblicazione - <Pubblicazione> selezionare un filtro nel riquadro Tabelle filtrate e quindi fare clic su Modifica.

  2. Nella finestra di dialogo Modifica filtro modificare il filtro.

  3. Fare clic su OK.

Per eliminare un filtro di riga con parametri

  1. Nella pagina Filtro righe tabella della Creazione guidata nuova pubblicazione o nella pagina Filtro righe della pubblicazione Proprietà pubblicazione - <Pubblicazione> selezionare un filtro nel riquadro Tabelle filtrate e quindi fare clic su Elimina.

Uso di Transact-SQL

È 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

  1. Nel database di pubblicazione del server di pubblicazione eseguire sp_addmergearticle (Transact-SQL). Specificare @publication, un nome per l'articolo per @article, la tabella da pubblicare per @source_object, la clausola WHERE che definisce il filtro con parametri per @subset_filterclause (non incluso WHERE) e uno dei valori seguenti per @partition_options, che descrive il tipo di partizionamento risultante dal 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, un valore di subset_filterclause per @property, l'espressione che definisce il filtro con parametri per @value (non incluso WHERE) e il valore 1 per @force_invalidate_snapshot e @force_reinit_subscription.

  2. Se questa modifica implica un diverso comportamento del partizionamento, eseguire nuovamente sp_changemergearticle . Specificare @publication, @article, un valore per partition_options@property e l'opzione di partizionamento più appropriata per @value, che può essere una delle seguenti:

    • 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 (Transact-SQL)

In questo esempio viene definito un gruppo di articoli di una pubblicazione di tipo merge in cui agli articoli è applicata una serie di filtri di 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 altre informazioni, vedere la sezione relativa alla sostituzione del valore HOST_NAME() nell'argomento 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

Vedere anche

Definire e modificare un filtro di join tra articoli di merge
Modificare le proprietà di pubblicazioni e articoli
Join Filters
Filtri di riga con parametri