【问题标题】:Merge Replication fails to replicate UD type合并复制无法复制 UD 类型
【发布时间】:2018-08-07 06:40:22
【问题描述】:

我有一个包含一些用户定义类型的数据库。据我了解,合并复制将自动包含已使用的 UD 类型。其中一种类型是在函数中使用的表变量。在发布者站点上工作正常,但在订阅者站点上它无法同步。为什么会这样?

  • 我试图只复制一个使用该类型的函数,并且成功了。之后复制工作正常。

  • 当我尝试对另一个系统进行相同的配置时,它一开始就失败了,就像在以前的系统上进行的最初尝试一样,但现在即使我尝试复制一个过程,我仍然得到相同的错误。

错误如下:

架构脚本“some name.sch”无法传播到 订阅者。

当我追踪错误时:

找不到数据类型 dbo.someName

【问题讨论】:

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


    【解决方案1】:

    我认为本论坛中 Hilary Cotter 的回答应该对您有所帮助:

    Transactional Replication and User Defined Data Types

    我会在这里引用它以防链接损坏:

    您可以选择通过预快照脚本复制用户定义的数据类型。

    您还可以选择将用户定义的数据类型复制为基本数据类型。这是文章属性对话框的转换数据类型部分。默认情况下它是 false,您可能希望将其设置为 true 以将它们转换为基本数据类型。例如,如果您的用户数据类型为 varchar(11) (即 EXEC sp_addtype ssn, 'VARCHAR(11)', 'NOT NULL') ,它将被复制为 varchar(11) 而不是 ssn。

    预快照脚本的第一个选项可通过发布属性 -> 快照访问。我假设您需要在那里提供一个脚本,该脚本将检查给定的用户定义类型是否在订阅服务器中不存在,然后创建它,否则跳过:

    第二个建议的解决方案可通过单个文章属性访问:

    看看,如果以上帮助你解决你的问题。当然,还有一种解决方案是在订阅者处手动创建缺少的 UDT。

    【讨论】:

    • 感谢您的回答,我会尝试第一种方法,我会告诉您。关于 3ed 选项,我可以手动创建类型吗?既然是订阅者,我可以更改架构吗?
    • @Manos,如果给定的类型没有明确标记为复制文章,而只是被复制的另一个表的依赖项,我认为您应该能够在订阅者上手动创建该 UDT。如果 SQL Server 不允许您这样做,您应该尝试前 2 个选项,或者作为最后的手段,删除订阅,创建 UDT 并恢复订阅。但这只是最后的手段,您应该注意不要丢失未同步的数据。
    • 当我在快照之前包含一个创建查询时,如果类型不存在,一切正常。如果类型存在并且我包含 drop/create 语句,则复制失败...知道为什么吗?另外,我尝试了 3ed 的方式,它奏效了。但我无法理解一些事情。我编写了来自发布者的所有类型的脚本,并在订阅者上创建了它们。在成功创建(我全部展示)之后,其中一些在复制过程中被标记为缺失,我必须一个一个地创建......对此有什么想法吗?
    • @Manos,类型可能丢失,因为复制代理在过去尝试删除并重新创建它们,因为单个文章的 Action if name is in use 属性。看看你在那里有什么价值。可能是Drop existing object and create new one. 所以它试图删除一些,而对于其他代理有错误并且无法完成删除命令。对于 pre-snapshot 脚本,请尝试将其设为 CREATE-only-if-not-exists,因为其他一些限制可能会阻止 drop 实现,就像我之前的句子中 Agent 无法做到一样。
    猜你喜欢
    • 2018-05-05
    • 2015-08-12
    • 2018-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-26
    • 2011-01-05
    • 2017-12-17
    相关资源
    最近更新 更多