Condividi tramite


Definizione e modifica di un filtro di join tra articoli di merge

In questo argomento viene descritto come definire e modificare un filtro di join tra articoli di merge in SQL Server 2012 tramite SQL Server Management Studio o Transact-SQL. La replica di tipo merge supporta i filtri di join, solitamente utilizzati in combinazione con filtri con parametri per estendere il partizionamento della tabella ad altri articoli correlati.

Contenuto dell'argomento

  • Prima di iniziare:

    Limitazioni e restrizioni

    Indicazioni

  • Per definire e modificare di un filtro di join tra articoli di merge, utilizzando:

    SQL Server Management Studio

    Transact-SQL

Prima di iniziare

Limitazioni e restrizioni

  • Per creare un filtro di join, la pubblicazione deve contenere almeno due tabelle correlate. Dal momento che i filtri join rappresentano un'estensione dei filtri di riga, è necessario definire prima un filtro di riga in una tabella da estendere con un join a un'altra tabella. Dopo aver definito un filtro di join, è possibile estenderlo con un altro filtro di join se la pubblicazione contiene ulteriori tabelle correlate.

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

Indicazioni

Icona freccia utilizzata con il collegamento Torna all'inizio[Top]

Utilizzo di SQL Server Management Studio

Definire, modificare ed eliminare filtri di join nella pagina Filtro righe tabella di Creazione guidata nuova pubblicazione o nella pagina Filtro righe della finestra di dialogo Proprietà pubblicazione - <Pubblicazione>. Per ulteriori informazioni sull'utilizzo della procedura guidata e sull'accesso a questa finestra di dialogo, vedere Creazione di una pubblicazione e Visualizzazione e modifica delle proprietà della pubblicazione.

Per definire un filtro di join

  1. Nella pagina Filtro righe tabella di Creazione guidata nuova pubblicazione o nella pagina Filtro righe di Proprietà pubblicazione - <Pubblicazione> selezionare un filtro di riga o un filtro di join esistente nel riquadro Tabelle filtrate.

  2. Fare clic su Aggiungi e quindi su Aggiungi join per estendere il filtro selezionato.

  3. Creare l'istruzione per il join. Selezionare Per compilare l'istruzione verrà utilizzato il generatore o L'istruzione per il join verrà scritta manualmente.

    • Se si sceglie di utilizzare il generatore, utilizzare le colonne Congiunzione, Colonna tabella filtrata, Operatore e Colonna tabella unita in join nella griglia per compilare l'istruzione per il join.

      Ogni colonna della griglia contiene una casella combinata a discesa che consente di selezionare due colonne e un operatore, (=, <>, <=, <, >=, > e like). I risultati vengono visualizzati nell'area di testo Anteprima. Se il join è associato a più di due colonne, selezionare una congiunzione (AND oppure OR) dalla colonna Congiunzione e quindi immettere altre due colonne e un operatore.

    • Se si sceglie l'opzione manuale, scrivere manualmente l'istruzione per il join nell'area di testo Istruzione per il join. Utilizzare le caselle di riepilogo Colonne tabella filtrata e Colonne tabella unita in join per trascinare le colonne nell'area di testo Istruzione per il join.

    • L'istruzione per il join completa sarà simile alla seguente:

      SELECT <published_columns> FROM [Sales].[SalesOrderHeader] INNER JOIN [Sales].[SalesOrderDetail] ON [SalesOrderHeader].[SalesOrderID] = [SalesOrderDetail].[SalesOrderID]
      

      Per la clausola JOIN è necessario utilizzare nomi composti da due parti, in quanto la denominazione a tre e quattro parti non è supportata.

  4. Specificare le opzioni per il join:

    • Se la colonna nella quale viene eseguito il join della tabella filtrata, ovvero la tabella padre, è univoca, selezionare Chiave univoca.

      Nota di attenzioneAttenzione

      La selezione di questa opzione indica che la relazione tra le tabelle figlio e le tabelle padre in un filtro join è di tipo uno-a-uno o uno-a-molti. Utilizzare questa opzione solo se esiste un vincolo nella colonna di join della tabella figlio che garantisce l'univocità. Un'impostazione non corretta di questa opzione può impedire la convergenza dei dati.

    • Per impostazione predefinita, durante la sincronizzazione la replica di tipo merge elabora le modifiche riga per riga. Per elaborare come singola unità modiche correlate presenti sia in righe della tabella filtrata sia della tabella unita in join, selezionare Record logico (solo per Microsoft SQL Server 2005 e versioni successive). Questa opzione è disponibile solo se gli articoli e la pubblicazione soddisfano i requisiti per l'utilizzo di record logici. Per ulteriori informazioni vedere la sezione relativa agli aspetti dell'utilizzo di record logici in Raggruppamento di modifiche alla righe correlate con record logici.

  5. Fare clic su OK.  

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

Per modificare un filtro join

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

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

  3. Fare clic su OK.  

Per eliminare un filtro join

  • Nella pagina Filtro righe tabella di Creazione guidata nuova pubblicazione o nella pagina Filtro righe di Proprietà pubblicazione - <Pubblicazione> selezionare un filtro nel riquadro Tabelle filtrate e quindi fare clic su Elimina. Se il filtro di join eliminato è esteso da altri join, anch'essi verranno eliminati.

Icona freccia utilizzata con il collegamento Torna all'inizio[Top]

Utilizzo di Transact-SQL

Tali procedure indicano un filtro con parametri su un articolo padre con filtri di join tra questo articolo e gli articoli figlio correlati. I filtri join possono essere definiti e modificati a livello di programmazione tramite le stored procedure di replica.

Per definire un filtro join per estendere un filtro di articolo agli articoli correlati in una pubblicazione di tipo merge

  1. Definire il filtro per l'articolo da unire in join, ovvero l'articolo padre.

  2. Nel database di pubblicazione del server di pubblicazione eseguire sp_addmergearticle (Transact-SQL) per definire uno o più articoli correlati, ovvero gli articoli figlio, per la pubblicazione. Per ulteriori informazioni, vedere Definizione di un articolo.

  3. Nel database di pubblicazione del server di pubblicazione eseguire sp_addmergefilter (Transact-SQL). Specificare @publication, un nome univoco per il filtro per @filtername, il nome dell'articolo figlio creato nel passaggio 2 per @article, il nome dell'articolo padre da unire in join per @join_articlename e uno dei valori seguenti per @join_unique_key:

    • 0: indica un join molti-a-uno o molti-a-molti tra gli articoli padre e figlio.

    • 1: indica un join uno-a-uno o uno-a-molti tra gli articoli padre e figlio.

    In questo modo viene definito un filtro join tra i due articoli.

    Nota di attenzioneAttenzione

    Impostare @join_unique_key su 1 solo se l'univocità è garantita da un vincolo nella colonna unita tramite join nella tabella sottostante per l'articolo padre. Se @join_unique_key è impostato su 1 in modo errato, è possibile che si verifichi la non convergenza dei dati.

Esempi (Transact-SQL)

In questo esempio viene definito un articolo per una pubblicazione di tipo merge, in cui all'articolo della tabella SalesOrderDetail viene applicato un filtro sulla tabella SalesOrderHeader, che presenta essa stessa un filtro di riga statico. Per ulteriori informazioni, vedere Definizione e modifica di un filtro di riga statico.

DECLARE @publication AS sysname;
DECLARE @table1 AS sysname;
DECLARE @table2 AS sysname;
DECLARE @table3 AS sysname;
DECLARE @salesschema AS sysname;
DECLARE @hrschema AS sysname;
DECLARE @filterclause AS nvarchar(1000);
SET @publication = N'AdvWorksSalesOrdersMerge'; 
SET @table1 = N'Employee'; 
SET @table2 = N'SalesOrderHeader'; 
SET @table3 = N'SalesOrderDetail'; 
SET @salesschema = N'Sales';
SET @hrschema = N'HumanResources';
SET @filterclause = N'Employee.LoginID = HOST_NAME()';

-- Add a filtered article for the Employee table.
EXEC sp_addmergearticle 
  @publication = @publication, 
  @article = @table1, 
  @source_object = @table1, 
  @type = N'table', 
  @source_owner = @hrschema,
  @schema_option = 0x0004CF1,
  @description = N'article for the Employee table',
  @subset_filterclause = @filterclause;

-- Add an article for the SalesOrderHeader table that is filtered
-- based on Employee and horizontally filtered.
EXEC sp_addmergearticle 
  @publication = @publication, 
  @article = @table2, 
  @source_object = @table2, 
  @type = N'table', 
  @source_owner = @salesschema, 
  @vertical_partition = N'true',
  @schema_option = 0x0034EF1,
  @description = N'article for the SalesOrderDetail table';

-- Add an article for the SalesOrderDetail table that is filtered
-- based on SaledOrderHeader.
EXEC sp_addmergearticle 
  @publication = @publication, 
  @article = @table3, 
  @source_object = @table3, 
  @source_owner = @salesschema,
  @description = 'article for the SalesOrderHeader table', 
  @identityrangemanagementoption = N'auto', 
  @pub_identity_range = 100000, 
  @identity_range = 100, 
  @threshold = 80,
  @schema_option = 0x0004EF1;

-- Add all columns to the SalesOrderHeader article.
EXEC sp_mergearticlecolumn 
  @publication = @publication, 
  @article = @table2, 
  @force_invalidate_snapshot = 1, 
  @force_reinit_subscription = 1;

-- Remove the credit card Approval Code column.
EXEC sp_mergearticlecolumn 
  @publication = @publication, 
  @article = @table2, 
  @column = N'CreditCardApprovalCode', 
  @operation = N'drop', 
  @force_invalidate_snapshot = 1, 
  @force_reinit_subscription = 1;

-- Add a merge join filter between Employee and SalesOrderHeader.
EXEC sp_addmergefilter 
  @publication = @publication, 
  @article = @table2, 
  @filtername = N'SalesOrderHeader_Employee', 
  @join_articlename = @table1, 
  @join_filterclause = N'Employee.BusinessEntityID = SalesOrderHeader.SalesPersonID', 
  @join_unique_key = 1, 
  @filter_type = 1, 
  @force_invalidate_snapshot = 1, 
  @force_reinit_subscription = 1;

-- Add a merge join filter between SalesOrderHeader and SalesOrderDetail.
EXEC sp_addmergefilter 
  @publication = @publication, 
  @article = @table3, 
  @filtername = N'SalesOrderDetail_SalesOrderHeader', 
  @join_articlename = @table2, 
  @join_filterclause = N'SalesOrderHeader.SalesOrderID = SalesOrderDetail.SalesOrderID', 
  @join_unique_key = 1, 
  @filter_type = 1, 
  @force_invalidate_snapshot = 1, 
  @force_reinit_subscription = 1;
GO

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 sul valore HOST_NAME nella colonna LoginID. Per ulteriori informazioni, vedere Definizione e modifica di un filtro di riga con parametri per un articolo di merge.

-- 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

Icona freccia utilizzata con il collegamento Torna all'inizio[Top]

Vedere anche

Concetti

Filtri join

Filtri di riga con parametri

Modifica delle proprietà di pubblicazioni e articoli

Filtro dei dati pubblicati per la replica di tipo merge

Definizione e modifica di un filtro di join tra articoli di merge

Concetti di base relativi alle stored procedure del sistema di replica

Definizione di una relazione tra record logici degli articoli di tabelle di merge

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