SQL Server 复制中的重大更改

本主题介绍 SQL Server 复制中的重大更改。这些更改可能导致基于 SQL Server 的早期版本的应用程序、脚本或功能无法继续使用。在进行升级时可能会遇到这些问题。有关详细信息,请参阅使用升级顾问来准备升级

在 SQL Server 2005 和 SQL Server 2008 中所做的重大更改

本部分介绍 SQL Server 2005 或 SQL Server 2008 在复制功能方面所做的重大更改。

影响所有复制类型的重大更改

以下重大更改适用于所有复制类型。

功能

说明

复制脚本所需的更改

与 SQL Server 2000 相比,复制代理的安全模式已发生更改。有关安全模式的详细信息,请参阅复制代理安全性模式。如果您是 SQL Server 2005 中的 sysadmin 固定服务器角色的成员,当运行用 SQL Server 2000 或 SQL Server 7.0 创建的复制脚本时,脚本可以正确执行。如果您是 dbo 固定数据库角色或其他角色的成员,则脚本会失败,必须升级。有关升级脚本的信息,请参阅如何升级复制脚本(复制 Transact-SQL 编程)。虽然不需要升级由 sysadmin 角色的成员执行的脚本,但为了利用安全性增强功能,建议对其进行升级。

复制代理的本地连接

升级到 SQL Server 2005 时,所有使用 SQL Server 身份验证的本地连接都改为使用 Windows 身份验证。本地连接是指代理与它所在的同一台计算机上运行的 SQL Server 实例之间建立的连接。例如,请求订阅的合并代理在订阅服务器上运行,因此它与订阅服务器建立的连接是本地连接。

在 SQL Server 的早期版本中,默认情况下代理是在 SQL Server 代理服务帐户的上下文中运行。升级后,在此帐户的上下文中建立本地连接。SQL Server 2005 可以细粒度控制复制代理运行并与数据库及其他资源建立 Windows 集成连接所用的每个帐户;可为每个代理指定不同的帐户。升级后,建议为每个代理指定不同的帐户。有关详细信息,请参阅升级复制数据库时的注意事项复制代理安全性模式

ActiveX 控件

所有 ActiveX 控件都标记为对脚本编写和初始化不安全。

SQL Server 2005 中没有快照代理 ActiveX 控件。请改用新的托管快照代理。有关详细信息,请参阅 SnapshotGenerationAgent如何创建初始快照(RMO 编程)

distributor_admin 帐户的密码

不再支持发布服务器和远程分发服务器之间的可信连接,因为这些连接不要求密码(在 SQL Server 2000 Service Pack 3 之前的版本中,默认情况下使用可信连接)。如果使用远程分发服务器,在升级到 SQL Server 2005 之前,请将可信连接转换成不可信连接(此问题不影响使用本地分发服务器的发布服务器)。有关 distributor_admin 帐户的详细信息,请参阅保护分发服务器的安全

确定所使用的连接类型

  • 在分发服务器上执行 sp_helpdistpublisher。如果受信任列中的值是 1,则必须更改为不可信连接。

更改为不可信连接

  1. 在分发服务器上执行 sp_changedistpublisher,为参数 @property 指定值 'trusted',为参数 @value 指定值 'False'。

    注意注意
    SQL Server 2000 联机丛书的某些版本没有将 'trusted' 列为 @property 的有效值。它对于所有 SQL Server 2000 版本都有效。
  2. 在发布服务器和分发服务器上都执行 sp_changedistributor_password,为参数 @password 指定一个强密码。

SQL Server Express 不包括 SQL Server 代理

如果升级到 SQL Server Express,则必须重新配置复制同步,因为 SQL Server Express 不包括 SQL Server 代理。

如果要使用请求订阅,则必须使用复制管理对象 (RMO)、Windows 同步管理器,或在命令行上运行复制代理,以此来同步这些订阅。有关详细信息,请参阅将数据复制到 SQL Server Express

如果要继续使用 SQL Server 代理来运行复制代理作业,则必须使用推送订阅或升级到其他版本的 SQL Server(除 SQL Server Express 和 SQL Server Compact 3.5 SP1 之外的所有版本都包括 SQL Server 代理)。使用推送订阅的情况下,分发代理或合并代理在分发服务器上运行,因此 SQL Server 代理是可用的(SQL Server Express 不能是分发服务器)。

Microsoft Access (Jet 4.0) 订阅服务器

Jet 是 Access 使用的基础数据库,在 SQL Server 2000 中,复制支持对 Jet 数据库的订阅。未来版本将不支持这些订阅。

建议改用 SQL Server Express。Access 可以将 SQL Server 数据库用作后端,SQL Server 数据库不受此问题的影响。有关详细信息,请参阅将数据复制到 SQL Server Express

事务复制的重大更改

以下重大更改适用于事务复制。

功能

说明

从备份中初始化事务订阅1

若要在 SQL Server 2008 中从备份初始化订阅,用户必须是 dbcreator 服务器角色的成员之一。在 SQL Server 2005 中,只需具有 db_owner 数据库角色的成员身份。

有关如何从备份初始化订阅的详细信息,请参阅初始化事务订阅(不使用快照)

排队更新订阅的消息队列选项

利用排队更新订阅,将订阅服务器中的更改写入队列;然后,队列读取器代理从该队列中读取更改并将其传递到发布服务器。在 SQL Server 2000 中,订阅可以使用 SQL Server 队列或消息队列对更改进行排队。队列的类型是用 sp_addpublication 的 @queue_type 参数指定的,允许的值为 sql 和 msmq(消息队列)。在 SQL Server 2005 中,只允许使用 sql 值。在升级期间,将修改使用消息队列的现有发布从而可以使用 SQL Server 队列。如果某些应用程序依赖于使用消息队列的排队更新,将需要重写这些应用程序以适应 SQL Server 队列。有关排队更新订阅的详细信息,请参阅事务复制的可更新订阅

如果在升级 SQL Server 时消息队列服务处于运行之中,则升级过程将删除现有的消息队列订阅队列。

重要说明重要提示
在 Windows 2000 和 Windows XP 中,还必须运行 Microsoft 分布式事务处理协调器 (MSDTC) 服务,因为在这些平台上消息队列需要使用 MSDTC。

如果未运行消息队列服务,请在升级完成后手动删除这些队列。有关删除队列的详细信息,请参阅 Windows 文档。

更改为调用格式以更新订阅

默认情况下,在事务复制中使用一组存储过程将更改应用到订阅服务器。每个过程都具有一种“调用格式”。此格式确定如何向过程传递参数以及向订阅服务器发送多少数据。在 SQL Server 2000 中,默认格式为 CALL。在 SQL Server 2005 和 SQL Server 2008 中,默认格式为 VCALL。

此更改只影响已自定义的存储过程所在的拓扑。升级后,您必须更改自定义过程的签名,使其包括其他参数。否则,分发代理将失败。

1 此问题只会对 SQL Server 2008 和更高版本带来影响。

合并复制的重大更改

以下重大更改适用于合并复制。

功能

说明

从 SQL Server Express 发布

SQL Server MSDE 可以用作合并发布的发布服务器。SQL Server Express 可替代 MSDE,但不能用作发布服务器。它可以订阅合并发布、事务发布和快照发布。具有更新订阅的合并复制和事务复制均允许将更改从订阅服务器传播回发布服务器。有关复制到 SQL Server Express 的详细信息,请参阅将数据复制到 SQL Server Express

批处理更改

在早期版本的 SQL Server 中,合并代理所做的更改是逐行执行的。在 SQL Server 2005 中,为提高性能,更改是成批执行的;因此,可以在一个语句内插入、更新或删除多行。如果发布数据库或订阅数据库中任何已发布的表都有触发器,请确保这些触发器可以处理插入、更新和删除多行的操作。有关详细信息,请参阅DML 触发器的多行注意事项

冲突表的重新创建

升级到 SQL Server 2005 时重新创建冲突表,将 DBO 作为表的所有者。如果 SQL Server 2000 中的其他用户拥有某些表,则可能需要修改应用程序。

合并复制会以 conflict_PublicationName_ArticleName 命令格式为发布中的每个项目创建一个冲突表。升级时重新创建所有元数据表,并在 DBO 架构中创建所有冲突表。

分配的新标识范围

对于使用自动标识范围管理的表,复制可能在升级过程中分配新标识范围。如果某些表分配给订阅服务器的标识范围大于分配给发布服务器的标识范围,则复制会给发布服务器分配与订阅服务器的相等的范围。

若要确定用于每个项目的范围,请在发布数据库中执行 sp_helpmergearticle,并检查 pub_identity_range 列和 identity_range 列。

请参阅

概念