0

J'ai un serveur SQL 2008 R2. J'ai créé une publication en utilisant l'assistant qui semblait aller bien. Il existe une base de données 'distribution' dans la section 'bases de données système' qui contient peu de choses. (Je ne sais pas si cela existait déjà ou si le "Assistant Publication" l'a créé.) J'ai configuré la synchronisation Web et j'ai accès à relisapi.dll via IIS7 et un certificat auto-signé.Réplication SQL Server 2008 vers SQL Express 2005 via la synchronisation Web

Mon programme d'installation pour mon site Web ASP.NET installe SQL Express 2005. J'ai écrit un petit site pour tester la création d'un abonnement et la synchronisation initiale. Je ne crée pas une base de données initiale car je suppose que la première synchronisation va tout retirer du serveur. Le bit de code suivant semble fonctionner parce qu'un abonnement est créé dans SQL Express & dans le serveur SQL 2008.

' Define the pull subscription. 
      subscription = New MergePullSubscription() 
      subscription.ConnectionContext = subscriberConn 
      subscription.PublisherName = publisherName 
      subscription.PublicationName = publicationName 
      subscription.PublicationDBName = publicationDbName 
      subscription.DatabaseName = subscriptionDbName 
      subscription.HostName = hostname 
      subscription.CreateSyncAgentByDefault = True 

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

      ' Enable Web synchronization. 
      subscription.UseWebSynchronization = True 
      subscription.InternetUrl = webSyncUrl 

      ' Specify the same Windows credentials to use when connecting to the 
      ' Web server using HTTPS Basic Authentication. 
      subscription.InternetSecurityMode = AuthenticationMethod.BasicAuthentication 
      subscription.InternetLogin = winLogin 
      subscription.InternetPassword = winPassword 

      If Not subscription.LoadProperties() Then 
       ' Create the pull subscription at the Subscriber. 
       subscription.Create() 

Je lance ce morceau de code:

 If Not subscription.PublisherSecurity Is Nothing Or _ 
       subscription.DistributorSecurity Is Nothing Then 

       '0: Only error messages are logged. 
       '1: All progress report messages are logged. 
       '2: All progress report messages and error messages are logged. 
       subscription.SynchronizationAgent.OutputVerboseLevel = 2 
       subscription.SynchronizationAgent.Output = "c:\createmerge.txt" 

       ' Synchronously start the Merge Agent for the subscription. 
       subscription.SynchronizationAgent.Synchronize() 

mais le syncronize jette l'erreur:

The subscription to publication 'My publication' could not be verified. Ensure that all Merge Agent command line parameters are specified correctly and that the subscription is correctly configured. If the Publisher no longer has information about this subscription, drop and recreate the subscription.

Sur le serveur, en utilisant "Moniteur de réplication", il montre mon abonnement comme "Unitialisé".

Je pense qu'un problème est que mon abonnement.HostName est faux. Les exemples Microsoft sur MSDN disent

"adventure-works\garrett1" 

mais on ne sait pas si l'aventure est usine le serveur, instance ou base de données et qui est Garrett1 (une connexion ou autre chose). Alors, que devrait-il être réellement? Comme je ne connais rien à la réplication et que je viens juste de suivre MSDN et quelques livres, j'apprécierais quelques pointeurs sur la prochaine étape.

Désolé c'est trop long!

Répondre

0

Ok, il y avait deux raisons pour lesquelles j'avais des problèmes.

Tout d'abord sur mon PC de développement, la machine avait été renommée à un certain point, donc la connexion à mon abonné local SQL était erronée. En second lieu, le "certificat auto-signé" sur IIS7 se résolvait en un nom interne et non le vrai nom qui pouvait être vu via HTTPS du monde extérieur.Nous avons obtenu un certificat de test pour le domaine correct et ça a bien fonctionné!

1

En fonction de the documentation, le paramètre Subscription.Hostname n'est pas essentiel pour que la publication fonctionne - c'est la valeur fournie par l'abonné pour HOST_NAME lorsque la publication de fusion est partitionnée. Voir here pour plus d'informations sur les publications filtrées.

Si vous êtes convaincu que vous avez correctly configured your environment pour soutenir la synchronisation web, vous allez avoir à déboguer ce une pièce à la fois.

Il peut être utile de commencer par configurer un abonnement non basé sur le Web pour une autre base de données sur l'éditeur afin de prouver que la publication fonctionne comme prévu. En supposant que cela fonctionne, essayez de configurer un abonnement non-Web sur une instance SQL 2005 Express, puis passez à tester la synchronisation Web.

0

Ok, voici quelques informations supplémentaires sur HOST_NAME() si vous êtes intéressé.

http://msdn.microsoft.com/en-us/library/ms152478%28v=SQL.110%29.aspx

Fondamentalement, vous l'utiliser pour passer une variable à l'éditeur avec une valeur de votre choix (qui surchargent la fonction HOST_NAME au niveau du serveur). Cela vous permet de filtrer les lignes, telles que Employee.ID = CONVERT (HOST_NAME() comme int) pour obtenir uniquement les lignes dont vous avez besoin à la souscription.