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

Si applica a:SQL Server

Questo argomento descrive come definire e modificare un filtro di join tra articoli di unione in SQL Server usando 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'articolo

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 altre informazioni sui requisiti per la modifica delle proprietà, vedere Modificare le proprietà di pubblicazioni e articoli.

Consigli

Utilizzo di SQL Server Management Studio

Definire, modificare ed eliminare filtri join nella pagina Filtro righe tabella della Creazione guidata nuova pubblicazione o nella pagina Filtro 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 join

  1. Nella pagina Filtro righe tabella della 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 Aggiungie 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 della griglia, ovveroCongiunzione, Colonna tabella filtrata, Operatoree Colonna tabella unita in join, per compilare un'istruzione per il join.

      In tutte le colonne della griglia è disponibile 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 di scrivere manualmente l'istruzione per il join, digitarla 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.

      Attenzione

      Selezionando questa opzione si indica che la relazione tra la tabella padre e le tabelle figlio in un filtro join è 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à. Se l'opzione è impostata in modo errato 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à modifiche correlate presenti sia in righe della tabella filtrata sia in righe della tabella unita in join, selezionare Record logico (Microsoft SQL Server 2005 (9.x) e versioni successive). Questa opzione è disponibile solo se sono soddisfatti i requisiti relativi all'utilizzo dei record logici negli articoli e nelle pubblicazioni. Per altre informazioni, vedere la sezione "Considerazioni sull'utilizzo di record logici" in Raggruppare modifiche alle righe correlate con record logici.

  5. Seleziona 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 della 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. Seleziona OK.

Per eliminare un filtro join

  1. Nella pagina Filtro righe tabella della 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.

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, noti anche come articoli figlio, per la pubblicazione. Per altre informazioni, vedere definire 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.

    Attenzione

    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 altre informazioni, vedere Define and Modify a Static Row Filter.

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

-- Enable AdventureWorks2022 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 AdventureWorks2022.', 
  @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

Vedi anche

Filtri di join
Filtri di riga con parametri
Modificare le proprietà di pubblicazioni e articoli
Filtrare i dati pubblicati per la replica di tipo merge
Procedura: Definire e modificare un filtro di join tra articoli di merge (SQL Server Management Studio)
Replication System Stored Procedures Concepts
Definire una relazione tra record logici degli articoli di tabelle di merge
Definire e modificare un filtro di riga con parametri per un articolo di merge