Sql server 通过web同步将SQL Server 2008复制到SQL Express 2005

Sql server 通过web同步将SQL Server 2008复制到SQL Express 2005,sql-server,sql-server-2008,replication,merge-replication,Sql Server,Sql Server 2008,Replication,Merge Replication,我有一台SQL 2008 R2服务器。 我已经用向导创建了一个出版物,看起来还可以。 “系统数据库”部分中有一个“分发”数据库,但没有太多内容。(不确定这是否已经存在,或者是否是“发布向导”创建的。) 我已设置web sync,并可通过IIS7和自签名证书访问relisapi.dll 我的ASP.NET网站安装程序安装SQL Express 2005。 我写了一个小网站来测试订阅和初始同步的创建。 我不“创建初始”数据库,因为我认为第一次同步将从服务器上拉下所有内容 以下代码似乎可以工作,因为订

我有一台SQL 2008 R2服务器。 我已经用向导创建了一个出版物,看起来还可以。 “系统数据库”部分中有一个“分发”数据库,但没有太多内容。(不确定这是否已经存在,或者是否是“发布向导”创建的。) 我已设置web sync,并可通过IIS7和自签名证书访问relisapi.dll

我的ASP.NET网站安装程序安装SQL Express 2005。 我写了一个小网站来测试订阅和初始同步的创建。 我不“创建初始”数据库,因为我认为第一次同步将从服务器上拉下所有内容

以下代码似乎可以工作,因为订阅是在sqlexpress中创建的&在sql2008server中创建的

' 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()
然后我运行以下代码:

        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()
但syncronize会抛出错误:

无法验证对发布“我的发布”的订阅。确保正确指定了所有合并代理命令行参数,并正确配置了订阅。如果发布者不再具有有关此订阅的信息,请删除并重新创建订阅

在服务器上,使用“复制监视器”将我的订阅显示为“单元化”

我认为一个问题是我的subscription.HostName错误。微软在MSDN上的例子是

"adventure-works\garrett1"
但目前尚不清楚adventure works是服务器、实例还是数据库,谁是garrett1(登录或其他)。那么这到底应该是什么呢

由于我对复制一无所知,而且我一直在关注MSDN和一些书,所以我想特别指出下一步的方向

对不起,时间太长了

基于此,
Subscription.Hostname
的设置对于使发布正常运行并不重要-它是对合并发布进行分区时订阅者为
HOST\u NAME
提供的值。有关筛选发布的详细信息,请参阅

如果您确信必须支持web同步,则必须一次调试这一部分


可能值得先为发布服务器上的另一个数据库设置一个非基于web的订阅,以证明发布工作正常。假设可以,请尝试在SQL 2005 Express实例上设置非web订阅,然后继续测试web同步。

好的,我遇到问题的原因有两个

首先,在我的开发PC上,机器在某个时候被重命名,因此与本地订阅服务器SQL的连接是错误的


其次,IIS7上的“自签名证书”解析为内部名称,而不是外部世界通过HTTPS可以看到的真实名称。我们获得了正确域的测试证书,它运行良好

好的,如果您感兴趣,这里有一些关于主机名()的更多信息

基本上,您可以使用它向发布服务器传递一个变量,该变量的值由您选择(这会重载服务器上的HOST_NAME函数)。这允许您筛选行,例如Employee.ID=CONVERT(HOST_NAME()为int),以便仅在子选项处获取所需的行