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.
Sicherheitshinweis: |
---|
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
Erstellen Sie mithilfe der ServerConnection-Klasse eine Verbindung mit dem Verleger.
Erstellen Sie mithilfe der Verlegerverbindung aus Schritt 1 eine Instanz der TransPublication-Klasse. Geben Sie Name, DatabaseName und ConnectionContext an.
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.
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.
Falls die Abonnementdatenbank nicht vorhanden ist, erstellen Sie sie mithilfe der Database-Klasse. Weitere Informationen finden Sie unter Creating, Altering, and Removing Databases.
Erstellen Sie eine Instanz der TransSubscription-Klasse.
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.
Hinweis: 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.
Rufen Sie die Create-Methode auf.
Sicherheitshinweis: 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
Erstellen Sie mithilfe der ServerConnection-Klasse eine Verbindung mit dem Verleger.
Erstellen Sie mithilfe der Verlegerverbindung aus Schritt 1 eine Instanz der MergePublication-Klasse. Geben Sie Name, DatabaseName und ConnectionContext an.
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.
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.
Falls die Abonnementdatenbank nicht vorhanden ist, erstellen Sie sie mithilfe der Database-Klasse. Weitere Informationen finden Sie unter Creating, Altering, and Removing Databases.
Erstellen Sie eine Instanz der MergeSubscription-Klasse.
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.
Hinweis: 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.
Rufen Sie die Create-Methode auf.
Sicherheitshinweis: 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