Replication Management Objects Concepts

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

Replication Management Objects (RMO) è un assembly di codice gestito che incapsula le funzionalità di replica per SQL Server. RMO viene implementato dallo spazio dei nomi Microsoft.SqlServer.Replication.

Negli argomenti seguenti viene descritto come utilizzare RMO a livello di programmazione per controllare le attività di replica:

Configurare la distribuzione
Negli argomenti inclusi in questa sezione viene illustrato come utilizzare RMO per configurare la pubblicazione e la distribuzione.

Creare una pubblicazione
Negli argomenti inclusi in questa sezione viene illustrato come utilizzare RMO per creare, eliminare e modificare pubblicazioni e articoli.

Subscribe to Publications
Negli argomenti inclusi in questa sezione viene illustrato come utilizzare RMO per creare, eliminare e modificare sottoscrizioni.

Proteggere una topologia di replica
Negli argomenti inclusi in questa sezione viene illustrato come utilizzare RMO per visualizzare e modificare le impostazioni di sicurezza.

Sincronizzare le sottoscrizioni (replica)
Negli argomenti inclusi in questa sezione viene illustrato come sincronizzare le sottoscrizioni.

Monitoraggio della replica
Negli argomenti inclusi in questa sezione viene illustrato come monitorare a livello di codice una topologia di replica.

Introduzione alla programmazione RMO

RMO è progettato per la programmazione di tutti gli aspetti della replica di SQL Server. Lo spazio dei nomi RMO è Microsoft.SqlServer.Replicatione viene implementato dal Microsoft.SqlServer.Rmo.dll, ovvero un assembly di Microsoft .NET Framework. L'assembly Microsoft.SqlServer.Replication.dll, che appartiene allo spazio dei nomi Microsoft.SqlServer.Replication, implementa un'interfaccia di codice gestito per la programmazione dei vari agenti di replica (Agente snapshot, Agente di distribuzione e Agente di merge). È possibile accedere alle classi corrispondenti da RMO per sincronizzare le sottoscrizioni. Le classi nello spazio dei nomi Microsoft.SqlServer.Replication.BusinessLogicSupport, implementato dall'assembly Microsoft.SqlServer.Replication.BusinessLogicSupport.dll, vengono utilizzate per creare la logica di business personalizzata per la replica di tipo merge. Questo assembly è indipendente da RMO.

Distribuzione di applicazioni basate su RMO

RMO dipende dai componenti di replica e dai componenti di connettività client inclusi in tutte le versioni di SQL Server ad eccezione di SQL Server Compact. Per distribuire un'applicazione basata su RMO, è necessario installare una versione di SQL Server che include componenti di replica e componenti di connettività client nel computer in cui verrà eseguita l'applicazione.

Introduzione a RMO

Questa sezione descrive come avviare un semplice progetto RMO usando Microsoft Visual Studio.

Per creare un nuovo progetto di Microsoft Visual C#

  1. Avviare Visual Studio.

  2. Scegliere NuovoProgetto dal menu File. Verrà visualizzata la finestra di dialogo Nuovo progetto.

  3. Nella finestra di dialogo Tipi progetto selezionare Progetti di Visual C#. Nel riquadro Modelli selezionare Applicazione Windows.

  4. (Facoltativo) In Nome digitare il nome della nuova applicazione.

  5. Fare clic su OK per caricare il modello di Windows per Visual C#.

  6. Scegliere Aggiungi riferimento dal menu Progetto. Verrà visualizzata la finestra di dialogo Aggiungi riferimento.

  7. Selezionare gli assembly seguenti nell'elenco della scheda .NET e quindi fare clic su OK.

    • Interfaccia di programmazione .NET per Microsoft.SqlServer.Replication

    • Microsoft.SqlServer.ConnectionInfo

    • Libreria dell'agente di replica

    Nota

    Per selezionare più file, utilizzare il tasto CTRL.

  8. (Facoltativo) Ripetere il passaggio 6. Fare clic sulla scheda Sfoglia , passare a C:\Programmi\Microsoft SQL Server\nnn\COM, selezionare Microsoft.SqlServer.Replication.BusinessLogicSupport.dll e quindi fare clic su OK.

  9. Scegliere Codice dal menu Visualizza.

  10. Nel codice, prima dell'istruzione dello spazio dei nomi, digitare le istruzioni using seguenti per qualificare i tipi negli spazi dei nomi di RMO:

    // These namespaces are required.  
    using Microsoft.SqlServer.Replication;  
    using Microsoft.SqlServer.Management.Common;  
    // This namespace is only used when creating custom business  
    // logic for merge replication.  
    using Microsoft.SqlServer.Replication.BusinessLogicSupport;   
    

Per creare un nuovo progetto di Microsoft Visual Basic .NET

  1. Avviare Visual Studio.

  2. Scegliere Nuovo progetto dal menu File. Verrà visualizzata la finestra di dialogo Nuovo progetto.

  3. Nel riquadro Tipi progetto selezionare Visual Basic. Nel riquadro Modelli selezionare Applicazione Windows.

  4. (Facoltativo) Nella casella Nome digitare il nome della nuova applicazione.

  5. Fare clic su OK per caricare il modello di Windows per Visual Basic.

  6. Scegliere Aggiungi riferimento dal menu Progetto. Verrà visualizzata la finestra di dialogo Aggiungi riferimento.

  7. Selezionare gli assembly seguenti nell'elenco della scheda .NET e quindi fare clic su OK.

    • Interfaccia di programmazione .NET per Microsoft.SqlServer.Replication

    • Microsoft.SqlServer.ConnectionInfo

    • Libreria dell'agente di replica

    Nota

    Per selezionare più file, utilizzare il tasto CTRL.

  8. (Facoltativo) Ripetere il passaggio 6. Fare clic sulla scheda Sfoglia , passare a C:\Programmi\Microsoft SQL Server\nnn\COM, selezionare Microsoft.SqlServer.Replication.BusinessLogicSupport.dll e quindi fare clic su OK.

  9. Scegliere Codice dal menu Visualizza.

  10. Nel codice, prima di qualsiasi dichiarazione, digitare le istruzioni Imports seguenti per qualificare i tipi nello spazio dei nomi di RMO.

    ' These namespaces are required.  
    Imports Microsoft.SqlServer.Replication  
    Imports Microsoft.SqlServer.Management.Common  
    ' This namespace is only used when creating custom business  
    ' logic for merge replication.  
    Imports Microsoft.SqlServer.Replication.BusinessLogicSupport   
    

Connessione a un server di replica

Gli oggetti di programmazione RMO richiedono che venga stabilita una connessione a un'istanza di SQL Server usando un'istanza della ServerConnection classe . Questa connessione al server viene stabilita indipendentemente da qualsiasi oggetto di programmazione RMO. Viene quindi passata all'oggetto RMO durante la creazione dell'istanza o mediante l'assegnazione alla proprietà P:Microsoft.SqlServer.Replication.ReplicationObject.ConnectionContex dell'oggetto. In questo modo, un oggetto di programmazione RMO e le istanze dell'oggetto connessione possono essere creati e gestiti separatamente e un singolo oggetto connessione può essere riutilizzato con più oggetti di programmazione RMO. Le regole seguenti sono valide per le connessioni a un server di replica:

  • Tutte le proprietà per la connessione sono definite per un oggetto ServerConnection specificato.

  • Una connessione a ogni istanza di SQL Server deve avere un proprio ServerConnection oggetto.

  • L'oggetto ServerConnection è assegnato alla proprietà P:Microsoft.SqlServer.Replication.ReplicationObject.ConnectionContext dell'oggetto di programmazione RMO creato o a cui si accede nel server.

  • Il metodo Connect apre la connessione al server. Questo metodo deve essere chiamato prima di chiamare i metodi che consentono di accedere al server su qualsiasi oggetto di programmazione RMO utilizzando la connessione.

  • Poiché RMO e SQL Server Management Objects (SMO) usano entrambe la ServerConnection classe per le connessioni a SQL Server, la stessa connessione può essere usata dagli oggetti RMO e SMO. Per altre informazioni, vedere Connessione a un'istanza di SQL Server.

  • Tutte le informazioni di autenticazione che consentono di stabilire la connessione e accedere correttamente al server vengono fornite nell'oggetto ServerConnection.

  • L'autenticazione di Windows rappresenta l'impostazione predefinita. Per usare l'autenticazione di SQL Server, LoginSecure deve essere impostato su false e Login Password deve essere impostato su un account di accesso e una password di SQL Server validi. Le credenziali di sicurezza devono essere sempre archiviate e gestite in modo protetto, nonché fornite in fase di esecuzione quando possibile.

  • Per le applicazioni multithreading, in ogni thread è necessario utilizzare un oggetto ServerConnection separato.

Chiamare il metodo Disconnect sull'oggetto ServerConnection per chiudere le connessioni al server attive utilizzate da oggetti RMO.

Impostazione delle proprietà RMO

Le proprietà degli oggetti di programmazione RMO rappresentano le proprietà di tali oggetti di replica nel server. Quando si creano nuovi oggetti di replica nel server, le proprietà RMO vengono utilizzate per definire tali oggetti. Per gli oggetti esistenti, le proprietà RMO rappresentano le proprietà dell'oggetto esistente, che possono essere modificate solo per le proprietà scrivibili o configurabili. Le proprietà possono essere impostate su oggetti nuovi o esistenti.

Impostazione delle proprietà per oggetti di replica nuovi

Quando si crea un nuovo oggetto di replica nel server, è necessario specificare tutte le proprietà obbligatorie prima di chiamare il metodo Create dell'oggetto. Per altre informazioni sull'impostazione delle proprietà per un nuovo oggetto di replica, vedere Configurare la pubblicazione e la distribuzione.

Impostazione delle proprietà per oggetti di replica esistenti

Per gli oggetti di replica che esistono nel server, a seconda dell'oggetto, RMO potrebbe supportare la possibilità di modificare alcune o tutte le proprietà corrispondenti. Solo le proprietà scrivibili o configurabili possono essere modificate. Prima di poter modificare le proprietà, è necessario chiamare il metodo Load o M:Microsoft.SqlServer.Replication.ReplicationObject.LoadProperties per ottenere le proprietà correnti dal server. La chiamata di questi metodi indica che è in corso la modifica di un oggetto esistente.

Per impostazione predefinita, quando si modificano le proprietà degli oggetti, RMO esegue il commit di tali modifiche nel server in base alla modalità di esecuzione dell'oggetto ServerConnection in uso. Il metodo P:Microsoft.SqlServer.Replication.ReplicationObject.IsExistingObject può essere utilizzato per verificare che un oggetto esista nel server prima di tentare di recuperare o modificare le proprietà corrispondenti. Per altre informazioni sulla modifica delle proprietà di un oggetto di replica, vedere Visualizzare e modificare le proprietà del server di pubblicazione e del database di distribuzione.

Nota

Se più client RMO o più istanze di un oggetto di programmazione RMO stanno accedendo allo stesso oggetto di replica nel server, il metodo Refresh dell'oggetto RMO può essere chiamato per aggiornare le proprietà in base allo stato corrente dell'oggetto nel server.

Memorizzazione nella cache delle modifiche alle proprietà

Quando la SqlExecutionModes proprietà è impostata su CaptureSql tutte le istruzioni Transact-SQL generate da RMO vengono acquisite in modo che possano essere eseguite manualmente in un singolo batch usando uno dei metodi di esecuzione. RMO consente di memorizzare nella cache le modifiche alle proprietà e di eseguirne il commit contemporaneamente in un unico batch mediante il metodo M:Microsoft.SqlServer.Replication.ReplicationObject.CommitPropertyChanges dell'oggetto. Per memorizzare nella cache le modifiche alle proprietà, la proprietà P:Microsoft.SqlServer.Replication.ReplicationObject.CachePropertyChanges dell'oggetto deve essere impostata su true. Quando si memorizzano nella cache le modifiche alle proprietà apportate in RMO, l'oggetto ServerConnection controlla comunque quando viene eseguito l'invio delle modifiche al server. Per altre informazioni sulla modifica delle proprietà di un oggetto di replica, vedere Visualizzare e modificare le proprietà del server di pubblicazione e del database di distribuzione.

Importante

Sebbene la classe ServerConnection supporti la dichiarazione di transazioni esplicite durante l'impostazione delle proprietà, tali transazioni possono interferire con le transazioni di replica interne e produrre risultati inaspettati. Per questo motivo non devono essere utilizzate con RMO.

Abilitazione del supporto TLS 1.2 per i componenti RMO

Il supporto TLS 1.2 per i componenti RMO in Windows 2012 e versioni precedenti può essere abilitato installando l'aggiornamento KB 3140245 e creando le chiavi del Registro di sistema come descritto nell'articolo. In Windows 2012 R2 e versioni successive è necessario creare solo le chiavi del Registro di sistema, come descritto precedentemente nell'articolo.

Esempio

In questo esempio viene illustrata la memorizzazione nella cache delle modifiche alle proprietà. Le modifiche apportate agli attributi di una pubblicazione transazionale rimangono memorizzate nella cache fino a quando non vengono inviate in modo esplicito al server.

// Define the server, database, and publication names
string publisherName = publisherInstance;
string publicationName = "AdvWorksProductTran";
string publicationDbName = "AdventureWorks2022";

TransPublication publication;

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

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

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

    // Explicitly enable caching of property changes on this object.
    publication.CachePropertyChanges = true;

    // If we can't get the properties for this publication, 
    // throw an application exception.
    if (publication.LoadProperties())
    {
        // Enable support for push subscriptions and disable support 
        // for pull subscriptions.
        if ((publication.Attributes & PublicationAttributes.AllowPull) != 0)
        {
            publication.Attributes ^= PublicationAttributes.AllowPull;
        }
        if ((publication.Attributes & PublicationAttributes.AllowPush) == 0)
        {
            publication.Attributes |= PublicationAttributes.AllowPush;
        }

        // Send changes to the server.
        publication.CommitPropertyChanges();
    }
    else
    {
        throw new ApplicationException(String.Format(
            "Settings could not be retrieved for the publication. " +
            "Ensure that the publication {0} exists on {1}.",
            publicationName, publisherName));
    }
}
catch (Exception ex)
{
    // Do error handling here.
    throw new ApplicationException(
        "The publication property could not be changed.", ex);
}
finally
{
    conn.Disconnect();
}