Concetti di base relativi a RMO (Replication Management Objects)

RMO (Replication Management Objects) è 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:

Introduzione alla programmazione RMO

RMO è progettato per consentire la programmazione di tutti gli aspetti della replica di SQL Server. Lo spazio dei nomi di RMO è Microsoft.SqlServer.Replication e viene implementato da Microsoft.SqlServer.Rmo.dll, 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à del client inclusi in tutte le versioni di SQL Server, tranne SQL Server Compact. Per distribuire un'applicazione basata su RMO, è necessario installare una versione di SQL Server che includa componenti di replica e componenti di connettività del client nel computer in cui verrà eseguita l'applicazione.

Introduzione a RMO

In questa sezione viene descritto come creare un progetto RMO semplice utilizzando 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, 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\100\COM, selezionare Microsoft.SqlServer.Replication.BusinessLogicSupport.dll, 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, 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\100\COM, selezionare Microsoft.SqlServer.Replication.BusinessLogicSupport.dll, 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 negli spazi 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 una connessione a un'istanza di SQL Server venga stabilita mediante un'istanza della classe ServerConnection. 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à ConnectionContext 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.

  • La connessione a ogni istanza di SQL Server deve disporre del relativo oggetto ServerConnection.

  • L'oggetto ServerConnection è assegnato alla proprietà 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 SMO (SQL Server Management Objects) utilizzano entrambi la classe ServerConnection per le connessioni a SQL Server, la stessa connessione può essere utilizzata sia da oggetti RMO che SMO. Per ulteriori 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 utilizzare l'autenticazione di SQL Server, LoginSecure deve essere impostato su false e Login e Password devono essere impostati su un accesso e una password di SQL Server. Le credenziali di protezione 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 ulteriori informazioni sull'impostazione delle proprietà per un nuovo oggetto di replica, vedere Procedura: Configurazione della pubblicazione e della distribuzione (programmazione RMO).

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 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 IsExistingObject può essere utilizzato per verificare che un oggetto esista nel server prima di tentare di recuperare o modificare le proprietà corrispondenti. Per ulteriori informazioni sulla modifica delle proprietà di un oggetto di replica, vedere Procedura: Visualizzazione e modifica delle proprietà del server di pubblicazione e del server di distribuzione (programmazione RMO).

[!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 proprietà SqlExecutionModes è impostata su CaptureSql, tutte le istruzioni Transact-SQL generate da RMO vengono acquisite in modo che possano essere eseguite manualmente in un unico batch mediante uno dei metodo di esecuzione disponibili. RMO consente di memorizzare nella cache le modifiche alle proprietà e di eseguirne il commit contemporaneamente in un unico batch mediante il metodo CommitPropertyChanges dell'oggetto. Per memorizzare nella cache le modifiche alle proprietà, la proprietà 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 ulteriori informazioni sulla memorizzazione nella cache delle modifiche alle proprietà per un oggetto di replica, vedere Procedura: Visualizzazione e modifica delle proprietà del server di pubblicazione e del server di distribuzione (programmazione RMO).

Nota importanteImportante

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.

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 = "AdventureWorks";

            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();
            }