Vorgehensweise: Erstellen eines Pushabonnements (RMO-Programmierung)

Pushabonnements können mithilfe von Replikationsverwaltungsobjekten (RMO, Replication Management Objects) programmgesteuert erstellt werden. Die RMO-Klassen, die Sie zum Erstellen eines Pushabonnements verwenden, hängen vom Publikationstyp ab, für den das Abonnement erstellt wird.

ms146863.security(de-de,SQL.90).gifSicherheitshinweis:
Fordern Sie nach Möglichkeit die Benutzer zur Laufzeit auf, die Sicherheitsanmeldeinformationen einzugeben. Wenn Sie Benutzerinformationen speichern möchten, verwenden Sie die Kryptografiedienste von Microsoft Windows .NET Framework.

So erstellen Sie ein Pushabonnement für eine Snapshot- oder Transaktionspublikation

  1. Erstellen Sie mithilfe der ServerConnection-Klasse eine Verbindung mit dem Verleger.

  2. Erstellen Sie mithilfe der Verlegerverbindung aus Schritt 1 eine Instanz der TransPublication-Klasse. Geben Sie Name, DatabaseName und ConnectionContext an.

  3. Rufen Sie die LoadProperties-Methode auf. Falls diese Methode false zurückgibt, sind entweder die in Schritt 2 angegebenen Eigenschaften falsch, oder die Publikation ist auf dem Server nicht vorhanden.

  4. Führen Sie ein bitweises logisches AND (& in Visual C# und And in Visual Basic) zwischen der Attributes-Eigenschaft und AllowPush aus. Falls das Ergebnis None lautet, legen Sie für Attributes das Ergebnis eines bitweisen logischen OR (| in Visual C# und Or in Visual Basic) zwischen Attributes und AllowPush fest. Rufen Sie anschließend CommitPropertyChanges auf, um Pushabonnements zu aktivieren.

  5. Falls die Abonnementdatenbank nicht vorhanden ist, erstellen Sie sie mithilfe der Database-Klasse. Weitere Informationen finden Sie unter Creating, Altering, and Removing Databases.

  6. Erstellen Sie eine Instanz der TransSubscription-Klasse.

  7. Legen Sie die folgenden Abonnementeigenschaften fest:

    • ServerConnection auf den in Schritt 1 erstellten Verleger für ConnectionContext.
    • Den Namen der Abonnementdatenbank für SubscriptionDBName.
    • Den Namen des Abonnenten für SubscriberName.
    • Den Namen der Publikationsdatenbank für DatabaseName.
    • Den Namen der Publikation für PublicationName.
    • Das Feld Login, Password oder SecurePassword von SynchronizationAgentProcessSecurity, um die Anmeldeinformationen für das Microsoft Windows-Konto bereitzustellen, unter dem der Verteilungs-Agent auf dem Verteiler ausgeführt wird. Mithilfe dieses Kontos werden lokale Verbindungen mit dem Verteiler sowie Remoteverbindungen mithilfe der Windows-Authentifizierung hergestellt.
      ms146863.note(de-de,SQL.90).gifHinweis:
      SynchronizationAgentProcessSecurity muss zwar nicht festgelegt werden, wenn das Abonnement von einem Mitglied der festen Serverrolle sysadmin erstellt wird, aber es empfiehlt sich. In diesem Fall nimmt der Agent die Identität des SQL Server-Agent-Kontos an. Weitere Informationen finden Sie unter Sicherheitsmodell des Replikations-Agents.
    • (Optional) Den Wert true (Standard) für CreateSyncAgentByDefault, um einen Agentauftrag zu erstellen, mit dem das Abonnement synchronisiert wird. Wenn Sie false angeben, kann das Abonnement nur programmgesteuert synchronisiert werden.
    • (Optional) Legen Sie das Feld SqlStandardLogin, SqlStandardPassword oder SecureSqlStandardPassword von SubscriberSecurity fest, wenn Sie die SQL Server-Authentifizierung zum Herstellen einer Verbindung mit dem Abonnenten verwenden.
  8. Rufen Sie die Create-Methode auf.

    ms146863.security(de-de,SQL.90).gifSicherheitshinweis:
     Beim Erstellen eines Push-Abonnements auf einem Verleger mit einem Remoteverteiler werden die Werte, die für alle Eigenschaften einschließlich SynchronizationAgentProcessSecurity und job_password bereitgestellt werden, als Nur-Text an den Verteiler gesendet. Sie sollten die Verbindung zwischen dem Verleger und seinem Remoteverteiler verschlüsseln, bevor die Create-Methode aufgerufen wird. Weitere Informationen finden Sie unter Verschlüsseln von Verbindungen zu SQL Server.

So erstellen Sie ein Pushabonnement für eine Mergepublikation

  1. Erstellen Sie mithilfe der ServerConnection-Klasse eine Verbindung mit dem Verleger.

  2. Erstellen Sie mithilfe der Verlegerverbindung aus Schritt 1 eine Instanz der MergePublication-Klasse. Geben Sie Name, DatabaseName und ConnectionContext an.

  3. Rufen Sie die LoadProperties-Methode auf. Falls diese Methode false zurückgibt, sind entweder die in Schritt 2 angegebenen Eigenschaften falsch, oder die Publikation ist auf dem Server nicht vorhanden.

  4. Führen Sie ein bitweises logisches AND (& in Visual C# und And in Visual Basic) zwischen der Attributes-Eigenschaft und AllowPush aus. Falls das Ergebnis None lautet, legen Sie für Attributes das Ergebnis eines bitweisen logischen OR (| in Visual C# und Or in Visual Basic) zwischen Attributes und AllowPush fest. Rufen Sie anschließend CommitPropertyChanges auf, um Pushabonnements zu aktivieren.

  5. Falls die Abonnementdatenbank nicht vorhanden ist, erstellen Sie sie mithilfe der Database-Klasse. Weitere Informationen finden Sie unter Creating, Altering, and Removing Databases.

  6. Erstellen Sie eine Instanz der MergeSubscription-Klasse.

  7. Legen Sie die folgenden Abonnementeigenschaften fest:

    • ServerConnection auf den in Schritt 1 erstellten Verleger für ConnectionContext.
    • Den Namen der Abonnementdatenbank für SubscriptionDBName.
    • Den Namen des Abonnenten für SubscriberName.
    • Den Namen der Publikationsdatenbank für DatabaseName.
    • Den Namen der Publikation für PublicationName.
    • Das Feld Login, Password oder SecurePassword von SynchronizationAgentProcessSecurity, um die Anmeldeinformationen für das Microsoft Windows-Konto bereitzustellen, unter dem der Merge-Agent auf dem Verteiler ausgeführt wird. Mithilfe dieses Kontos werden lokale Verbindungen mit dem Verteiler sowie Remoteverbindungen mithilfe der Windows-Authentifizierung hergestellt.
      ms146863.note(de-de,SQL.90).gifHinweis:
      SynchronizationAgentProcessSecurity muss zwar nicht festgelegt werden, wenn das Abonnement von einem Mitglied der festen Serverrolle sysadmin erstellt wird, aber es empfiehlt sich. In diesem Fall nimmt der Agent die Identität des SQL Server-Agent-Kontos an. Weitere Informationen finden Sie unter Sicherheitsmodell des Replikations-Agents.
    • (Optional) Den Wert true (Standard) für CreateSyncAgentByDefault, um einen Agentauftrag zu erstellen, mit dem das Abonnement synchronisiert wird. Wenn Sie false angeben, kann das Abonnement nur programmgesteuert synchronisiert werden.
    • (Optional) Legen Sie das Feld SqlStandardLogin, SqlStandardPassword oder SecureSqlStandardPassword von SubscriberSecurity fest, wenn Sie die SQL Server-Authentifizierung zum Herstellen einer Verbindung mit dem Abonnenten verwenden.
    • (Optional) Legen Sie das Feld SqlStandardLogin, SqlStandardPassword oder SecureSqlStandardPassword von PublisherSecurity fest, wenn Sie die SQL Server-Authentifizierung zum Herstellen einer Verbindung mit dem Verleger verwenden.
  8. Rufen Sie die Create-Methode auf.

    ms146863.security(de-de,SQL.90).gifSicherheitshinweis:
     Beim Erstellen eines Push-Abonnements auf einem Verleger mit einem Remoteverteiler werden die Werte, die für alle Eigenschaften einschließlich SynchronizationAgentProcessSecurity und job_password bereitgestellt werden, als Nur-Text an den Verteiler gesendet. Sie sollten die Verbindung zwischen dem Verleger und seinem Remoteverteiler verschlüsseln, bevor die Create-Methode aufgerufen wird. Weitere Informationen finden Sie unter Verschlüsseln von Verbindungen zu SQL Server.

Beispiel

Das folgende Beispiel erstellt ein neues Pushabonnement für eine Transaktionspublikation. Die Anmeldeinformationen für das Windows-Konto, mit dem der Verteilungs-Agent-Auftrag ausgeführt wird, werden zur Laufzeit übergeben.

// Define the Publisher, publication, and databases.
string publicationName = "AdvWorksProductTran";
string publisherName = publisherInstance;
string subscriberName = subscriberInstance;
string subscriptionDbName = "AdventureWorksReplica";
string publicationDbName = "AdventureWorks";

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

// Create the objects that we need.
TransPublication publication;
TransSubscription subscription;

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

    // Ensure that the publication exists and that 
    // it supports push subscriptions.
    publication = new TransPublication();
    publication.Name = publicationName;
    publication.DatabaseName = publicationDbName;
    publication.ConnectionContext = conn;

    if (publication.IsExistingObject)
    {
        if ((publication.Attributes & PublicationAttributes.AllowPush) == 0)
        {
            publication.Attributes |= PublicationAttributes.AllowPush;
        }

        // Define the push subscription.
        subscription = new TransSubscription();
        subscription.ConnectionContext = conn;
        subscription.SubscriberName = subscriberName;
        subscription.PublicationName = publicationName;
        subscription.DatabaseName = publicationDbName;
        subscription.SubscriptionDBName = subscriptionDbName;

        // Specify the Windows login credentials for the Distribution Agent job.
        subscription.SynchronizationAgentProcessSecurity.Login = winLogin;
        subscription.SynchronizationAgentProcessSecurity.Password = winPassword;

        // By default, subscriptions to transactional publications are synchronized 
        // continuously, but in this case we only want to synchronize on demand.
        subscription.AgentSchedule.FrequencyType = ScheduleFrequencyType.OnDemand;
 
        // Create the push subscription.
        subscription.Create();
    }
    else
    {
        // Do something here if the publication does not exist.
        throw new ApplicationException(String.Format(
            "The publication '{0}' does not exist on {1}.",
            publicationName, publisherName));
    }
}
catch (Exception ex)
{
    // Implement the appropriate error handling here.
    throw new ApplicationException(String.Format(
        "The subscription to {0} could not be created.", publicationName), ex);
}
finally
{
    conn.Disconnect();
}
' Define the Publisher, publication, and databases.
Dim publicationName As String = "AdvWorksProductTran"
Dim publisherName As String = publisherInstance
Dim subscriberName As String = subscriberInstance
Dim subscriptionDbName As String = "AdventureWorksReplica"
Dim publicationDbName As String = "AdventureWorks"

'Create a connection to the Publisher.
Dim conn As ServerConnection = New ServerConnection(subscriberName)

' Create the objects that we need.
Dim publication As TransPublication
Dim subscription As TransSubscription

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

    ' Ensure that the publication exists and that 
    ' it supports push subscriptions.
    publication = New TransPublication()
    publication.Name = publicationName
    publication.DatabaseName = publicationDbName
    publication.ConnectionContext = conn

    If publication.IsExistingObject Then
        If (publication.Attributes And PublicationAttributes.AllowPush) = 0 Then
            publication.Attributes = publication.Attributes _
            Or PublicationAttributes.AllowPush
        End If

        ' Define the push subscription.
        subscription = New TransSubscription()
        subscription.ConnectionContext = conn
        subscription.SubscriberName = subscriberName
        subscription.PublicationName = publicationName
        subscription.DatabaseName = publicationDbName
        subscription.SubscriptionDBName = subscriptionDbName

        ' Specify the Windows login credentials for the Distribution Agent job.
        subscription.SynchronizationAgentProcessSecurity.Login = winLogin
        subscription.SynchronizationAgentProcessSecurity.Password = winPassword

        ' By default, subscriptions to transactional publications are synchronized 
        ' continuously, but in this case we only want to synchronize on demand.
        subscription.AgentSchedule.FrequencyType = ScheduleFrequencyType.OnDemand

        ' Create the push subscription.
        subscription.Create()
    Else
        ' Do something here if the publication does not exist.
        Throw New ApplicationException(String.Format( _
         "The publication '{0}' does not exist on {1}.", _
         publicationName, publisherName))
    End If

Catch ex As Exception
    ' Implement the appropriate error handling here.
    Throw New ApplicationException(String.Format( _
        "The subscription to {0} could not be created.", publicationName), ex)
Finally
    conn.Disconnect()
End Try

Das folgende Beispiel erstellt ein neues Pushabonnement für eine Mergepublikation. Die Anmeldeinformationen für das Windows-Konto, mit dem der Merge-Agent-Auftrag ausgeführt wird, werden zur Laufzeit übergeben.

// Define the Publisher, publication, and databases.
string publicationName = "AdvWorksSalesOrdersMerge";
string publisherName = publisherInstance;
string subscriberName = subscriberInstance;
string subscriptionDbName = "AdventureWorksReplica";
string publicationDbName = "AdventureWorks";
string hostname = @"adventure-works\garrett1";

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

// Create the objects that we need.
MergePublication publication;
MergeSubscription subscription;

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

    // Ensure that the publication exists and that 
    // it supports push subscriptions.
    publication = new MergePublication();
    publication.Name = publicationName;
    publication.DatabaseName = publicationDbName;
    publication.ConnectionContext = conn;

    if (publication.IsExistingObject)
    {
        if ((publication.Attributes & PublicationAttributes.AllowPush) == 0)
        {
            publication.Attributes |= PublicationAttributes.AllowPush;
        }

        // Define the push subscription.
        subscription = new MergeSubscription();
        subscription.ConnectionContext = conn;
        subscription.SubscriberName = subscriberName;
        subscription.PublicationName = publicationName;
        subscription.DatabaseName = publicationDbName;
        subscription.SubscriptionDBName = subscriptionDbName;
        subscription.HostName = hostname;

        // Set a schedule to synchronize the subscription every 2 hours
        // during weekdays from 6am to 10pm.
        subscription.AgentSchedule.FrequencyType = ScheduleFrequencyType.Weekly;
        subscription.AgentSchedule.FrequencyInterval = Convert.ToInt32(0x003E);
        subscription.AgentSchedule.FrequencyRecurrenceFactor = 1;
        subscription.AgentSchedule.FrequencySubDay = ScheduleFrequencySubDay.Hour;
        subscription.AgentSchedule.FrequencySubDayInterval = 2;
        subscription.AgentSchedule.ActiveStartDate = 20051108;
        subscription.AgentSchedule.ActiveEndDate = 20071231;
        subscription.AgentSchedule.ActiveStartTime = 060000;
        subscription.AgentSchedule.ActiveEndTime = 100000;

        // Specify the Windows login credentials for the Merge Agent job.
        subscription.SynchronizationAgentProcessSecurity.Login = winLogin;
        subscription.SynchronizationAgentProcessSecurity.Password = winPassword;

        // Create the push subscription.
        subscription.Create();
    }
    else
    {
        // Do something here if the publication does not exist.
        throw new ApplicationException(String.Format(
            "The publication '{0}' does not exist on {1}.",
            publicationName, publisherName));
    }
}
catch (Exception ex)
{
    // Implement the appropriate error handling here.
    throw new ApplicationException(String.Format(
        "The subscription to {0} could not be created.", publicationName), ex);
}
finally
{
    conn.Disconnect();
}
' Define the Publisher, publication, and databases.
Dim publicationName As String = "AdvWorksSalesOrdersMerge"
Dim publisherName As String = publisherInstance
Dim subscriberName As String = subscriberInstance
Dim subscriptionDbName As String = "AdventureWorksReplica"
Dim publicationDbName As String = "AdventureWorks"
Dim hostname As String = "adventure-works\garrett1"

'Create a connection to the Publisher.
Dim conn As ServerConnection = New ServerConnection(subscriberName)

' Create the objects that we need.
Dim publication As MergePublication
Dim subscription As MergeSubscription

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

    ' Ensure that the publication exists and that 
    ' it supports push subscriptions.
    publication = New MergePublication()
    publication.Name = publicationName
    publication.DatabaseName = publicationDbName
    publication.ConnectionContext = conn

    If publication.IsExistingObject Then
        If (publication.Attributes And PublicationAttributes.AllowPush) = 0 Then
            publication.Attributes = publication.Attributes _
            Or PublicationAttributes.AllowPush
        End If

        ' Define the push subscription.
        subscription = New MergeSubscription()
        subscription.ConnectionContext = conn
        subscription.SubscriberName = subscriberName
        subscription.PublicationName = publicationName
        subscription.DatabaseName = publicationDbName
        subscription.SubscriptionDBName = subscriptionDbName
        subscription.HostName = hostname

        ' Set a schedule to synchronize the subscription every 2 hours
        ' during weekdays from 6am to 10pm.
        subscription.AgentSchedule.FrequencyType = ScheduleFrequencyType.Weekly
        subscription.AgentSchedule.FrequencyInterval = Convert.ToInt32("0x003E", 16)
        subscription.AgentSchedule.FrequencyRecurrenceFactor = 1
        subscription.AgentSchedule.FrequencySubDay = ScheduleFrequencySubDay.Hour
        subscription.AgentSchedule.FrequencySubDayInterval = 2
        subscription.AgentSchedule.ActiveStartDate = 20051108
        subscription.AgentSchedule.ActiveEndDate = 20071231
        subscription.AgentSchedule.ActiveStartTime = 60000
        subscription.AgentSchedule.ActiveEndTime = 100000

        ' Specify the Windows login credentials for the Merge Agent job.
        subscription.SynchronizationAgentProcessSecurity.Login = winLogin
        subscription.SynchronizationAgentProcessSecurity.Password = winPassword

        ' Create the push subscription.
        subscription.Create()
    Else

        ' Do something here if the publication does not exist.
        Throw New ApplicationException(String.Format( _
         "The publication '{0}' does not exist on {1}.", _
         publicationName, publisherName))
    End If
Catch ex As Exception
    ' Implement the appropriate error handling here.
    Throw New ApplicationException(String.Format( _
    "The subscription to {0} could not be created.", publicationName), ex)
Finally
    conn.Disconnect()
End Try

Siehe auch

Aufgaben

Vorgehensweise: Erstellen eines Pushabonnements (Replikationsprogrammierung mit Transact-SQL)
Vorgehensweise: Synchronisieren eines Pushabonnements (RMO-Programmierung)

Andere Ressourcen

Programming with Replication Management Objects
How to: Create a Publication (RMO Programming)
Abonnieren von Publikationen

Hilfe und Informationen

Informationsquellen für SQL Server 2005