SQL Server 2008通过Web同步复制到SQL Express 2005

时间:2010-11-26 15:41:58

标签: sql-server sql-server-2008 replication merge-replication

我有一台SQL 2008 R2服务器。 我使用向导创建了一个出版物,似乎没问题。 “系统数据库”部分中有一个“分发”数据库,其中没有很多。 (不确定是否已存在或者“发布向导”是否已创建它。) 我已经设置了网络同步,并可以通过IIS7和自签名证书访问relisapi.dll。

我的ASP.NET网站的安装程序安装了SQL Express 2005。 我写了一个小网站来测试订阅和初始同步的创建。 我没有“创建一个初始”数据库,因为我假设第一次同步会从服务器中取出所有内容。

以下代码似乎有效,因为订阅是在SQL Express&在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()

然后我运行这段代码:

        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会抛出错误:

  

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

在服务器上,使用“复制监视器”,它将我的订阅显示为“Unitialized”。

我认为一个问题是我的subscription.HostName错了。 MSDN上的Microsoft示例说

"adventure-works\garrett1"

但目前尚不清楚冒险作品是服务器,实例还是数据库,谁是garrett1(登录或其他)。那应该是什么呢?

由于我对复制一无所知,而且我一直在关注MSDN和一些书籍,所以我会指出下一步的指示。

对不起,这太久了!

3 个答案:

答案 0 :(得分:1)

基于the documentationSubscription.Hostname的设置对于使发布工作并不重要 - 它是订阅者在合并发布分区时为HOST_NAME提供的价值。有关筛选出版物的详细信息,请参阅here

如果您确信自己有correctly configured your environment支持网络同步,那么您将不得不一次调试这一部分。

首先,可以通过为发布者上的另一个数据库设置非基于Web的订阅来证明该发布是按预期工作的。假设有效,请尝试在SQL 2005 Express实例上设置非Web订阅,然后继续测试Web同步。

答案 1 :(得分:0)

好的,我遇到麻烦有两个原因。

首先在我的开发PC上,机器已经在某个时候被重命名,因此与本地用户SQL的连接是错误的。

其次,IIS7上的“自签名证书”正在解析为内部名称,而不是通过外部HTTPS可以看到的真实姓名。我们获得了正确域名的测试证书,并且工作正常!

答案 2 :(得分:0)

好的,如果你有兴趣的话,还有关于HOST_NAME()的更多信息。

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

基本上,您使用它将变量传递给发布者,并使用您选择的值(这会使服务器上的HOST_NAME函数重载)。这允许您过滤行,例如Employee.ID = CONVERT(HOST_NAME()为int),以仅获取子语句中所需的行。