Condividi tramite


Creazione e applicazione dello snapshot iniziale

Si applica a: SQL Server Istanza gestita di SQL di Azure

Questo argomento illustra come creare e applicare lo snapshot iniziale in SQL Server tramite SQL Server Management Studio, Transact-SQL o Replication Management Objects. Per le pubblicazioni di tipo merge che utilizzano filtri con parametri è necessario uno snapshot a due parti. Per altre informazioni, vedere Creazione di uno snapshot per una pubblicazione di tipo merge con filtri con parametri.
Gli snapshot vengono generati dall'agente snapshot al termine della creazione di una pubblicazione. La generazione può essere eseguita:

  • Immediatamente. Per impostazione predefinita, per una pubblicazione di tipo merge uno snapshot viene generato immediatamente dopo la creazione di una pubblicazione mediante la Creazione guidata nuova pubblicazione.
  • A un'ora pianificata. Specificare una pianificazione nella pagina Agente snapshot della Creazione guidata nuova pubblicazione o quando si utilizzano stored procedure o Replication Management Objects (RMO).
  • Manualmente. Eseguire l'agente di snapshot dal prompt dei comandi o da SQL Server Management Studio. Per altre informazioni sull'esecuzione degli agenti, vedere Concetti di base relativi ai file eseguibili dell'agente di replica e Avviare e arrestare un agente di replica (SQL Server Management Studio).

Per la replica di tipo merge, viene generato uno snapshot a ogni esecuzione dell'agente snapshot. Per la replica transazionale, la generazione dello snapshot dipende dall'impostazione della proprietà di pubblicazione immediate_sync. Se tale proprietà è impostata su TRUE, ovvero il valore predefinito quando si utilizza la Creazione guidata nuova pubblicazione, viene generato uno snapshot ogni volta che viene eseguito l'agente snapshot, che può essere applicato a un Sottoscrittore in qualsiasi momento. Se invece è impostata su FALSE, ovvero il valore predefinito quando si utilizza sp_addpublication, lo snapshot viene generato solo se è stata aggiunta una nuova sottoscrizione dopo l'ultima esecuzione dell'agente snapshot. Per poter eseguire la sincronizzazione, è necessario che i sottoscrittori attendano il completamento dell'agente snapshot.

Per impostazione predefinita, una volta generati gli snapshot vengono salvati nella cartella snapshot predefinita nel server di distribuzione. È anche possibile salvare i file di snapshot su supporti rimovibili come dischi rimovibili, CD-ROM o in posizioni diverse dalla cartella snapshot predefinita. È inoltre possibile comprimere i file in modo da semplificarne l'archiviazione e il trasferimento ed eseguire script prima o dopo aver applicato lo snapshot nel Sottoscrittore. Per altre informazioni su queste opzioni, vedere Snapshot Options.

Se lo snapshot è per una pubblicazione di tipo merge che utilizza filtri con parametri, verrà creato utilizzando un processo a due fasi. Viene innanzitutto creato uno snapshot dello schema contenente gli script di replica e lo schema degli oggetti pubblicati, ma non i dati. Ogni sottoscrizione viene quindi inizializzata con uno snapshot che include gli script e lo schema copiati dallo snapshot dello schema e i dati appartenenti alla partizione della sottoscrizione. Per altre informazioni, vedere Snapshots for Merge Publications with Parameterized Filters.

Dopo aver creato lo snapshot nel server di pubblicazione e averlo archiviato in una posizione snapshot predefinita o alternativa, sarà possibile trasferirlo nel Sottoscrittore e applicarlo. L'agente di distribuzione (per la replica snapshot o transazionale) o l'agente di merge (per la replica di tipo merge) trasferisce lo snapshot e applica lo schema e i file di dati al database di sottoscrizione sul Sottoscrittore durante la sincronizzazione iniziale. Per impostazione predefinita, se si utilizza la Creazione guidata nuova sottoscrizione la sincronizzazione iniziale viene eseguita subito dopo la creazione di una sottoscrizione. Questo comportamento è controllato dall'opzione Inizializza quando della pagina Inizializza sottoscrizioni della procedura guidata. Gli snapshot generati in seguito all'inizializzazione di una sottoscrizione non vengono applicati a un Sottoscrittore a meno che la sottoscrizione non sia contrassegnata per la reinizializzazione. Per altre informazioni, vedere Reinizializzare le sottoscrizioni.

Dopo aver applicato lo snapshot iniziale, l'agente di distribuzione o l'agente di merge propaga gli aggiornamenti successivi e le altre modifiche dei dati. La distribuzione e l'applicazione degli snapshot nei Sottoscrittori hanno effetto solamente sui Sottoscrittori in attesa dello snapshot iniziale o di nuovi snapshot, mentre non hanno alcun effetto sui Sottoscrittori della pubblicazione in cui sono già state eseguite operazioni di inserimento, aggiornamento ed eliminazione o altre modifiche dei dati pubblicati.

Per visualizzare o modificare la posizione della cartella snapshot predefinita, vedere

Posizione predefinita degli snapshot

Specificare la posizione predefinita degli snapshot nella pagina Cartella snapshot della Configurazione guidata distribuzione. Per altre informazioni sull'uso di questa procedura guidata, vedere Configurare la pubblicazione e la distribuzione. Se si crea una pubblicazione su un server non configurato come server di distribuzione, specificare una posizione predefinita degli snapshot nella pagina Cartella snapshot della Creazione guidata nuova pubblicazione. Per altre informazioni sull'uso di questa procedura guidata, vedere Creare una pubblicazione.

Modificare la posizione predefinita degli snapshot nella pagina Server di pubblicazione della finestra di dialogo Proprietà database di distribuzione - <DatabaseDistribuzione>. Per altre informazioni, vedere Visualizzare e modificare le proprietà del server di pubblicazione e del database di distribuzione. Impostare la cartella snapshot per ogni pubblicazione nella finestra di dialogo Proprietà pubblicazione - <Pubblicazione>. Per altre informazioni, vedere View and Modify Publication Properties.

Modificare la posizione predefinita degli snapshot

  1. Nella pagina Server di pubblicazione della finestra di dialogo Proprietà database di distribuzione - <DatabaseDistribuzione>> fare clic sul pulsante delle proprietà (...) per il server di pubblicazione di cui si vuole modificare la posizione predefinita degli snapshot.

  2. Nella finestra di dialogo Proprietà server di pubblicazione - <Server di pubblicazione>> immettere un valore per la proprietà Cartella snapshot predefinita.

    Nota

    L'agente snapshot deve disporre delle autorizzazioni di scrittura per la directory specificata, mentre l'agente di distribuzione o l'agente di merge deve disporre delle autorizzazioni di lettura. Se si usano sottoscrizioni pull, è necessario specificare una directory condivisa come percorso UNC (Universal Naming Convention), ad esempio \\nomecomputer\snapshot. Per altre informazioni, vedere Proteggere la cartella snapshot.

  3. Seleziona OK.

Crea snapshot

Per impostazione predefinita, se SQL Server Agent è in esecuzione, l'agente di snapshot genera immediatamente uno snapshot dopo aver creato una pubblicazione con la Creazione guidata nuova pubblicazione. Sempre per impostazione predefinita, tale snapshot viene quindi applicato dall'agente di distribuzione (per la replica snapshot e transazionale) o dall'agente di merge (per le sottoscrizioni di tipo merge) per tutte le sottoscrizioni. È anche possibile generare uno snapshot utilizzando SQL Server Management Studio e Monitoraggio replica. Per informazioni sull'avvio di Monitoraggio replica, vedere Avviare Monitoraggio replica.

Utilizzo di SQL Server Management Studio

  1. Connettersi al server di pubblicazione in Management Studio e quindi espandere il nodo del server.
  2. Espandere la cartella Replica e quindi la cartella Pubblicazioni locali .
  3. Fare clic con il pulsante destro del mouse sulla pubblicazione per la quale si desidera creare uno snapshot, quindi scegliere Visualizza stato agente snapshot.
  4. Nella finestra di dialogo Visualizza stato agente snapshot - <Pubblicazione> fare clic su Avvia.
    Al termine della generazione dello snapshot, verrà visualizzato un messaggio del tipo "[100%] Generato uno snapshot di 17 articoli."

In Monitoraggio replica

  1. In Monitoraggio replica espandere un gruppo di server di pubblicazione nel riquadro di sinistra e quindi espandere un server di pubblicazione.
  2. Fare clic con il pulsante destro del mouse sulla pubblicazione per la quale si desidera generare uno snapshot, quindi scegliere Genera snapshot.
  3. Per visualizzare lo stato dell’agente di snapshot, fare clic sulla scheda Agenti. Per informazioni più dettagliate, fare clic con il pulsante destro del mouse sul agente di snapshot nella griglia e quindi scegliere Visualizza dettagli.

Utilizzo di Transact-SQL

Gli snapshot iniziali possono essere creati a livello di programmazione creando ed eseguendo un processo dell'agente snapshot o eseguendo il file eseguibile dell'agente snapshot da un file batch. Dopo la generazione, lo snapshot iniziale viene trasferito e applicato al Sottoscrittore la prima volta che la sottoscrizione viene sincronizzata. Se si esegue l'agente snapshot da un prompt dei comandi o un file batch, sarà necessario rieseguirlo ogni volta che lo snapshot esistente diventa non valido.

Importante

Se possibile, richiedere agli utenti di immettere le credenziali di sicurezza in fase di esecuzione. Se è necessario archiviare le credenziali in un file script, è fondamentale proteggere il file per evitare accessi non autorizzati.

  1. Creare una pubblicazione snapshot, transazionale o di tipo merge. Per altre informazioni, vedere Create a Publication.

  2. Eseguire sp_addpublication_snapshot (Transact-SQL). Specificare @publication e i parametri seguenti:

    • @job_login , che specifica le credenziali dell'autenticazione di Windows con cui l'agente snapshot viene eseguito nel server di distribuzione.

    • @job_password, che corrisponde alla password per le credenziali di Windows specificate.

    • (Facoltativo) Valore 0 per @publisher_security_mode se l'agente utilizzerà l'autenticazione di SQL Server per la connessione al server di pubblicazione. In questo caso, è necessario specificare anche le informazioni di accesso dell'autenticazione di SQL Server per @publisher_login e @publisher_password.

    • (Facoltativo) Pianificazione della sincronizzazione per il processo dell'agente snapshot. Per altre informazioni, vedere Specify Synchronization Schedules.

    Importante

    Quando si configura un server di pubblicazione con un server di distribuzione remoto, i valori specificati per tutti i parametri, inclusi job_login e job_password, vengono inviati al server di distribuzione come testo normale. È consigliabile crittografare la connessione tra il server di pubblicazione e il server di distribuzione remoto prima di eseguire questa stored procedure. Per altre informazioni, vedere Abilitare le connessioni crittografate al motore di database (Gestione configurazione SQL Server).

  3. Aggiungere articoli alla pubblicazione. Per altre informazioni, vedere definire un articolo.

  4. Nel database di pubblicazione del server di pubblicazione eseguire sp_startpublication_snapshot (Transact-SQL), specificando il valore di @publication dal passaggio 1.

Applicare uno snapshot

Utilizzo di SQL Server Management Studio

  1. Al termine della generazione, lo snapshot verrà applicato mediante la sincronizzazione della sottoscrizione con l'agente di distribuzione o l'agente di merge:

    • Se l'agente è impostato per l'esecuzione continua, ovvero l'impostazione predefinita per la replica transazionale, lo snapshot verrà applicato automaticamente al termine della generazione.
    • Se è invece impostato per l'esecuzione in base a una pianificazione, lo snapshot verrà applicato alla successiva esecuzione pianificata dell'agente.
    • Se l'agente è impostato per l'esecuzione su richiesta, lo snapshot verrà applicato alla successiva esecuzione dell'agente.

    Per ulteriori informazioni sulla sincronizzazione delle sottoscrizioni, vedere Synchronize a Push Subscription e Synchronize a Pull Subscription.

Usare Transact-SQL

  1. Creare una pubblicazione snapshot, transazionale o di tipo merge. Per altre informazioni, vedere Create a Publication.

  2. Aggiungere articoli alla pubblicazione. Per altre informazioni, vedere definire un articolo.

  3. Dal prompt dei comandi o in un file batch avviare l' Agente merge repliche eseguendo snapshot.execon gli argomenti della riga di comando seguenti:

    • -Publication
    • -Publisher
    • -Distributor
    • -PublisherDB
    • -ReplicationType

    Se si usano l'autenticazione di SQL Server, è inoltre necessario specificare gli argomenti seguenti:

    • -DistributorLogin
    • -DistributorPassword
    • -DistributorSecurityMode = 0
    • -PublisherLogin
    • -PublisherPassword
    • -PublisherSecurityMode = 0

Esempi (Transact-SQL)

In questo esempio viene illustrato come creare una pubblicazione transazionale e aggiungere un processo dell'agente snapshot per la nuova pubblicazione (utilizzando le variabili di scripting SQLCMD ). Viene inoltre avviato il processo.

-- To avoid storing the login and password in the script file, the values 
-- are passed into SQLCMD as scripting variables. 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".

DECLARE @publicationDB AS sysname;
DECLARE @publication AS sysname;
DECLARE @login AS sysname;
DECLARE @password AS sysname;
SET @publicationDB = N'AdventureWorks2022'; --publication database
SET @publication = N'AdvWorksCustomerTran'; -- transactional publication name
SET @login = $(Login);
SET @password = $(Password);

USE [AdventureWorks]

-- Enable transactional and snapshot replication on the publication database.
EXEC sp_replicationdboption 
  @dbname = @publicationDB, 
  @optname = N'publish',
  @value = N'true';

-- Execute sp_addlogreader_agent to create the agent job. 
EXEC sp_addlogreader_agent 
  @job_login = @login, 
  @job_password = @password,
  -- Explicitly specify the security mode used when connecting to the Publisher.
  @publisher_security_mode = 1;

-- Create new transactional publication, using the defaults. 
USE [AdventureWorks2022]
EXEC sp_addpublication 
  @publication = @publication, 
  @description = N'transactional publication';

-- Create a new snapshot job for the publication, using the defaults.
EXEC sp_addpublication_snapshot 
  @publication = @publication,
  @job_login = @login,
  @job_password = @password;

-- Start the Snapshot Agent job.
EXEC sp_startpublication_snapshot @publication = @publication;
GO

In questo esempio viene creata una pubblicazione di tipo merge e viene aggiunto un processo dell'agente snapshot (utilizzando le variabili sqlcmd ) per la pubblicazione. Viene inoltre avviato il processo.

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

DECLARE @publicationDB AS sysname;
DECLARE @publication AS sysname;
DECLARE @login AS sysname;
DECLARE @password AS sysname;
SET @publicationDB = N'AdventureWorks2022'; 
SET @publication = N'AdvWorksSalesOrdersMerge'; 
SET @login = $(Login);
SET @password = $(Password);

-- Enable merge replication on the publication database.
USE master
EXEC sp_replicationdboption 
  @dbname = @publicationDB, 
  @optname=N'merge publish',
  @value = N'true';

-- Create new merge publication, using the defaults. 
USE [AdventureWorks]
EXEC sp_addmergepublication 
  @publication = @publication, 
  @description = N'Merge publication.';

-- Create a new snapshot job for the publication, using the defaults.
EXEC sp_addpublication_snapshot 
  @publication = @publication,
  @job_login = @login,
  @job_password = @password;

-- Start the Snapshot Agent job.
EXEC sp_startpublication_snapshot @publication = @publication;
GO

Con gli argomenti della riga di comando seguenti l'agente snapshot viene avviato per generare lo snapshot per una pubblicazione di tipo merge.

Nota

Le interruzioni di riga sono state aggiunte per agevolare la lettura. I comandi in un file batch devono essere inseriti in un'unica riga.

  
REM -- Declare variables  
SET Publisher=%InstanceName%  
SET PublicationDB=AdventureWorks2022   
SET Publication=AdvWorksSalesOrdersMerge   
  
REM --Start the Snapshot Agent to generate the snapshot for AdvWorksSalesOrdersMerge.  
"C:\Program Files\Microsoft SQL Server\120\COM\SNAPSHOT.EXE" -Publication %Publication%   
-Publisher %Publisher% -Distributor %Publisher% -PublisherDB %PublicationDB%   
-ReplicationType 2 -OutputVerboseLevel 1 -DistributorSecurityMode 1  
  

Utilizzo di RMO (Replication Management Objects)

L'agente snapshot genera gli snapshot al termine della creazione di una pubblicazione. È possibile generare questi snapshot a livello di programmazione tramite gli oggetti RMO (Replication Management Objects) e l'accesso diretto tramite codice gestito alle funzionalità dell'agente di replica. Gli oggetti utilizzati dipendono dal tipo di replica. L'agente snapshot può essere avviato in modo sincrono tramite l'oggetto SnapshotGenerationAgent o in modo asincrono tramite il processo dell'agente. Dopo la generazione, lo snapshot iniziale viene trasferito e applicato al Sottoscrittore la prima volta che la sottoscrizione viene sincronizzata. È necessario rieseguire l'agente ogni volta che lo snapshot esistente non contiene più dati validi e aggiornati. Per altre informazioni, vedere Gestire le pubblicazioni.

Importante

Se possibile, richiedere agli utenti di immettere le credenziali di sicurezza in fase di esecuzione. Se è necessario archiviare le credenziali, utilizzare i servizi di crittografia offerti da Microsoft Windows .NET Framework.

Per generare lo snapshot iniziale per una pubblicazione snapshot o transazionale avviando il processo dell'agente snapshot (modo asincrono)

  1. Creare una connessione al server di pubblicazione tramite la classe ServerConnection .

  2. Creare un'istanza della classe TransPublication. Impostare le proprietà Name e DatabaseName per la pubblicazione, quindi impostare la proprietà ConnectionContext sulla connessione creata nel passaggio 1.

  3. Chiamare il metodo LoadProperties per caricare le proprietà rimanenti dell'oggetto. Se questo metodo restituisce false, le proprietà della pubblicazione sono state definite in modo non corretto nel passaggio 2 oppure la pubblicazione non esiste.

  4. Se il valore di SnapshotAgentExists è false, chiamare CreateSnapshotAgent per creare il processo dell'agente snapshot per questa pubblicazione.

  5. Chiamare il metodo StartSnapshotGenerationAgentJob per avviare il processo dell'agente che genera lo snapshot per la pubblicazione.

  6. (Facoltativo) Quando il valore di SnapshotAvailable è true, lo snapshot è disponibile per i Sottoscrittori.

Per generare lo snapshot iniziale per una pubblicazione snapshot o transazionale eseguendo il processo dell'agente snapshot (modo sincrono)

  1. Creare un'istanza della classe SnapshotGenerationAgent e impostare le seguenti proprietà obbligatorie:

  2. Impostare il valore Transactional o Snapshot per ReplicationType.

  3. Chiamare il metodo GenerateSnapshot .

Per generare lo snapshot iniziale per una pubblicazione di tipo merge avviando il processo dell'agente snapshot (modo asincrono)

  1. Creare una connessione al server di pubblicazione tramite la classe ServerConnection .

  2. Creare un'istanza della classe MergePublication. Impostare le proprietà Name e DatabaseName per la pubblicazione, quindi impostare la proprietà ConnectionContext sulla connessione creata nel passaggio 1.

  3. Chiamare il metodo LoadProperties per caricare le proprietà rimanenti dell'oggetto. Se questo metodo restituisce false, le proprietà della pubblicazione sono state definite in modo non corretto nel passaggio 2 oppure la pubblicazione non esiste.

  4. Se il valore di SnapshotAgentExists è false, chiamare CreateSnapshotAgent per creare il processo dell'agente snapshot per questa pubblicazione.

  5. Chiamare il metodo StartSnapshotGenerationAgentJob per avviare il processo dell'agente che genera lo snapshot per la pubblicazione.

  6. (Facoltativo) Quando il valore di SnapshotAvailable è true, lo snapshot è disponibile per i Sottoscrittori.

Per generare lo snapshot iniziale per una pubblicazione di tipo merge eseguendo il processo dell'agente snapshot (modo sincrono)

  1. Creare un'istanza della classe SnapshotGenerationAgent e impostare le seguenti proprietà obbligatorie:

  2. Impostare un valore di Merge per ReplicationType.

  3. Chiamare il metodo GenerateSnapshot .

Esempi (RMO)

In questo esempio viene eseguito l'agente snapshot in modo sincrono per generare lo snapshot iniziale per una pubblicazione transazionale.

// Set the Publisher, publication database, and publication names.
string publicationName = "AdvWorksProductTran";
string publicationDbName = "AdventureWorks2022";
string publisherName = publisherInstance;
string distributorName = publisherInstance;

SnapshotGenerationAgent agent;

try
{
    // Set the required properties for Snapshot Agent.
    agent = new SnapshotGenerationAgent();
    agent.Distributor = distributorName;
    agent.DistributorSecurityMode = SecurityMode.Integrated;
    agent.Publisher = publisherName;
    agent.PublisherSecurityMode = SecurityMode.Integrated;
    agent.Publication = publicationName;
    agent.PublisherDatabase = publicationDbName;
    agent.ReplicationType = ReplicationType.Transactional;

    // Start the agent synchronously.
    agent.GenerateSnapshot();

}
catch (Exception ex)
{
    // Implement custom application error handling here.
    throw new ApplicationException(String.Format(
        "A snapshot could not be generated for the {0} publication."
        , publicationName), ex);
}
' Set the Publisher, publication database, and publication names.
Dim publicationName As String = "AdvWorksProductTran"
Dim publicationDbName As String = "AdventureWorks2022"
Dim publisherName As String = publisherInstance
Dim distributorName As String = publisherInstance

Dim agent As SnapshotGenerationAgent

Try
    ' Set the required properties for Snapshot Agent.
    agent = New SnapshotGenerationAgent()
    agent.Distributor = distributorName
    agent.DistributorSecurityMode = SecurityMode.Integrated
    agent.Publisher = publisherName
    agent.PublisherSecurityMode = SecurityMode.Integrated
    agent.Publication = publicationName
    agent.PublisherDatabase = publicationDbName
    agent.ReplicationType = ReplicationType.Transactional

    ' Start the agent synchronously.
    agent.GenerateSnapshot()

Catch ex As Exception
    ' Implement custom application error handling here.
    Throw New ApplicationException(String.Format( _
     "A snapshot could not be generated for the {0} publication." _
     , publicationName), ex)
End Try

In questo esempio viene avviato l'agente snapshot in modo asincrono per generare lo snapshot iniziale per una pubblicazione transazionale.

// Set the Publisher, publication database, and publication names.
string publicationName = "AdvWorksProductTran";
string publicationDbName = "AdventureWorks2022";
string publisherName = publisherInstance;

TransPublication publication;

// Create a connection to the Publisher using Windows Authentication.
ServerConnection conn;
conn = new ServerConnection(publisherName);

try
{
    // Connect to the Publisher.
    conn.Connect();

    // Set the required properties for an existing publication.
    publication = new TransPublication();
    publication.ConnectionContext = conn;
    publication.Name = publicationName;
    publication.DatabaseName = publicationDbName;

    if (publication.LoadProperties())
    {
        // Start the Snapshot Agent job for the publication.
        publication.StartSnapshotGenerationAgentJob();
    }
    else
    {
        throw new ApplicationException(String.Format(
            "The {0} publication does not exist.", publicationName));
    }
}
catch (Exception ex)
{
    // Implement custom application error handling here.
    throw new ApplicationException(String.Format(
        "A snapshot could not be generated for the {0} publication."
        , publicationName), ex);
}
finally
{
    conn.Disconnect();
}
' Set the Publisher, publication database, and publication names.
Dim publicationName As String = "AdvWorksProductTran"
Dim publicationDbName As String = "AdventureWorks2022"
Dim publisherName As String = publisherInstance

Dim publication As TransPublication

' Create a connection to the Publisher using Windows Authentication.
Dim conn As ServerConnection
conn = New ServerConnection(publisherName)

Try
    ' Connect to the Publisher.
    conn.Connect()

    ' Set the required properties for an existing publication.
    publication = New TransPublication()
    publication.ConnectionContext = conn
    publication.Name = publicationName
    publication.DatabaseName = publicationDbName

    If publication.LoadProperties() Then
        ' Start the Snapshot Agent job for the publication.
        publication.StartSnapshotGenerationAgentJob()
    Else
        Throw New ApplicationException(String.Format( _
         "The {0} publication does not exist.", publicationName))
    End If
Catch ex As Exception
    ' Implement custom application error handling here.
    Throw New ApplicationException(String.Format( _
     "A snapshot could not be generated for the {0} publication." _
     , publicationName), ex)
Finally
    conn.Disconnect()
End Try

Blocco all'applicazione dello snapshot iniziale

Se sono presenti più pubblicazioni che pubblicano i dati in un database negli abbonati, mentre si applicano gli snapshot iniziali, si noterà che una sola pubblicazione è in grado di applicare lo snapshot uno alla volta.

Quando si esamina l'attività SQL, potrebbe venire visualizzata una risorsa di attesa simile alla seguente:

APP: 18:16384:[snapshot_delivery_in_progress_Tr]:(9bcdaf92)
APP: 5:16384:[snapshot_delivery_in_progress_Er]:(3c3b7db9
)

L'esecuzione di query per il comportamento di blocco può mostrare risorse simili alle seguenti:

APP 16384:[appname]:(fbe42d68) XAPP 16384:[snapshot_del]:(9bcdaf92) X

Questo comportamento è impostato a livello di progettazione. Si verifica perché viene usato un blocco dell'applicazione per impedire a più agenti di replica di applicare contemporaneamente snapshot di pubblicazioni diverse allo stesso database sottoscrittore. Poiché il blocco dell'applicazione contiene il nome del database sottoscrittore, il relativo impatto interessa tutte le pubblicazioni pubblicate nello stesso database sottoscrittore. Il risultato è che è possibile inserire un unico snapshot nel database sottoscrittore in un dato momento.

In questa situazione, vengono usati blocchi esclusivi per evitare la possibilità di deadlock reciproci tra gli agenti di replica.

Per aggirare questo problema, specificare un database sottoscrittore diverso per ogni pubblicazione.

Vedi anche

Creare una pubblicazione
Create a Pull Subscription
Creare una sottoscrizione push
Specificare le pianificazioni della sincronizzazione
Inizializzare una sottoscrizione con uno snapshot
Replication Management Objects Concepts
Procedure consigliate per la sicurezza della replica
Replication System Stored Procedures Concepts
Utilizzo di sqlcmd con variabili di scripting