0

我有一个 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()

但是同步会引发错误:

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

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

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

"adventure-works\garrett1"

但目前尚不清楚 Adventure-works 是服务器、实例还是数据库,以及 garrett1 是谁(登录名或其他)。那么这实际上应该是什么?

由于我对复制一无所知,而且我一直在关注 MSDN 和一些书籍,因此我希望得到一些关于下一步该去哪里的指示。

对不起,这么久!

4

3 回答 3

1

根据文档,设置Subscription.Hostname对于使发布正常工作并不重要 - 它是订阅者HOST_NAME在合并发布被分区时提供的值。有关过滤的出版物的更多信息,请参见此处

如果您确信您已正确配置您的环境以支持 Web 同步,那么您将不得不一次调试这一部分。

从为发布者上的另一个数据库设置非基于 Web 的订阅开始,以证明发布按预期工作可能是值得的。假设可行,请尝试在 SQL 2005 Express 实例上设置非 Web 订阅,然后继续测试 Web 同步。

于 2010-11-26T16:30:36.937 回答
0

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

首先在我的开发 PC 上,机器在某个时候被重命名,所以到我的本地订阅者 SQL 的连接是错误的。

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

于 2010-12-02T11:50:27.257 回答
0

好的,如果您有兴趣,这里有一些关于 HOST_NAME() 的更多信息。

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

基本上,您使用它将具有您选择的值的变量传递给发布者(这会在服务器上重载 HOST_NAME 函数)。这允许您过滤行,例如 Employee.ID = CONVERT(HOST_NAME() as int) 以仅在订阅时获取您需要的行。

于 2010-12-22T16:08:15.593 回答