适用于:SQL Server
SQL Server 支持通过 Microsoft Host Integration Server 附带的 OLE DB 提供程序实现对 IBM Db2/AS 400、DB2/MVS 和 DB2/Universal Database 的推送订阅。
配置 IBM Db2 订阅服务器
若要配置 IBM Db2 订阅服务器,请按下列步骤进行操作:
在分发服务器上安装最新版本的 DB2 的 Microsoft OLE DB 提供程序:
如果你正在使用SQL Server Enterprise Edition,在SQL Server下载网页的相关下载部分,选择Microsoft SQL Server功能包最新版本的链接。 在 Microsoft SQL Server 功能包网页上,搜索 OLE DB Provider for DB2。
如果您使用的是 SQL Server 标准版,请安装包含提供商的最新版本 Microsoft 主机集成服务(HIS)服务器。
除了安装提供程序外,还要安装数据访问工具,该工具将在下一步中使用。 下载 SQL Server 企业版时,该工具会默认安装。 有关安装和使用数据访问工具的详细信息,请参阅访问接口文档或 HIS 文档。
为订阅者创建连接字符串。 你可以在任何文本编辑器中创建 连接字符串,但请使用数据访问工具。 在数据访问工具中创建字符串:
选择 启动、 程序、DB2的OLE DB提供商,然后选择 数据访问工具。
在 “数据访问工具”中,按照步骤提供 DB2 服务器的相关信息。 完成操作后,系统会创建一个通用数据链接(UDL)以及关联的连接字符串。 复制不使用 UDL,但会使用连接字符串。
访问连接字符串:右键单击数据访问工具中的 UDL 并选择 “显示连接字符串”。
连接字符串如下所示(为便于阅读,以下内容进行了换行):
Provider=DB2OLEDB;Initial Catalog=MY_SUBSCRIBER_DB;Network Transport Library=TCP;Host CCSID=1252; PC Code Page=1252;Network Address=MY_SUBSCRIBER;Network Port=50000;Package Collection=MY_PKGCOL; Default Schema=MY_SCHEMA;Process Binary as Character=False;Derive Parameters=False;Units of Work=RUW;DBMS Platform=DB2/NT; Persist Security Info=False;Connection Pooling=True;字符串中的大多数选项都取决于你正在配置的 DB2 服务器,但你应始终将
Derive Parameters和False选项设置为Process Binary as Character。 你需要为识别订阅数据库的选项提供一个数值Initial Catalog。 创建订阅时,请在“新建订阅向导”中输入连接字符串。创建快照发布或事务发布,将其启用于非 SQL Server 订阅服务器,然后为订阅服务器创建推送订阅。 有关详细信息,请参阅 为非 SQL Server 订阅者创建订阅。
(可选)为一个或多个项目指定自定义创建脚本。 在发布表时,会为该表创建一个
CREATE TABLE脚本。 对于非SQL Server订阅者,你用 Transact-SQL 方言创建脚本,分发代理将其翻译成更通用的SQL方言,然后再应用到订阅用户。 要指定自定义创建脚本,要么修改现有的 Transact-SQL 脚本,要么创建一个完整的脚本,使用DB2 SQL方言。 如果你创建 DB2 脚本,使用bypass_translation指令,这样分发代理会在订阅者处应用脚本而不进行翻译。你可以修改脚本,原因有很多,但最常见的是修改数据类型映射。 更多信息请参见本文中的“数据类型映射考虑”部分。 如果你修改 Transact-SQL 脚本,限制更改仅限于数据类型映射,且不要包含任何注释。 如果你需要更实质性的改动,可以创建一个 DB2 脚本。
修改文章脚本并将其用作自定义创建脚本
生成该出版物快照后,进入该出版物的快照文件夹。
找到与项目同名的
.sch文件,例如MyArticle.sch。使用记事本或其他文本编辑器打开此文件。
修改此文件并将其保存到其他目录。
执行
sp_changearticle,为 creation_script 属性指定文件路径和文件名。 有关详细信息,请参阅 sp_changearticle (Transact-SQL)。
创建文章脚本并将其用作自定义创建脚本
使用Db2 SQL方言创建文章脚本。 请确保文件的第一行为 bypass_translation,且该行不得包含任何其他内容。
执行 sp_changearticle,为 creation_script 属性指定文件路径和文件名。
IBM Db2 订阅者注意事项
除了文章《非 SQL Server 订阅者》中提到的考虑外,复制到 Db2 订阅者时还要考虑以下问题:
每个复制表的数据和索引被分配到一个 Db2 表空间。 Db2 表空间的页面大小控制表空间中表的最大列数和最大行大小。 应根据复制列的数量和表的最大行大小,确保与复制表关联的表空间是合适的。
如果表中的一个或多个主键列的数据类型为 DECIMAL(32-38, 0-38) 或 NUMERIC(32-38, 0-38),则不要使用事务复制将表发布到 Db2 订阅服务器。 事务复制通过使用主键来识别行。 由于这些数据类型映射到用户的 VARCHAR(41),这种方法可能导致失败。 你可以通过快照复制发布使用这些数据类型的主键的表。
如果要在订阅服务器上创建表,而不是由复制来创建表,请使用“仅复制支持”选项。 有关详细信息,请参阅 初始化事务订阅(不使用快照)。
SQL Server 允许比 Db2 更长的表名和列名:
将数据类型从SQL Server映射到IBM Db2
下表显示了将数据复制到运行 IBM Db2 的订阅服务器上时使用的数据类型映射。
| SQL Server 数据类型 | IBM Db2 数据类型 |
|---|---|
| bigint | DECIMAL(19,0) |
| binary(1-254) | CHAR(1-254) 用于 BIT 数据 |
| binary(255-8000) | VARCHAR(255-8000) FOR BIT DATA |
| bit | SMALLINT |
| char(1-254) | CHAR(1-254) |
| char(255-8000) | VARCHAR(255-8000) |
| date | 日期 |
| datetime | TIMESTAMP |
| datetime2(0-7) | VARCHAR(27) |
| datetimeoffset(0-7) | VARCHAR(34) |
| 十进制(1-31,0-31) | 十进制数(1-31, 0-31) |
| decimal(32-38、0-38) | VARCHAR(41) |
| float(53) | DOUBLE |
| float | FLOAT |
| 地理 | 图像 |
| geometry | 图像 |
| hierarchyid | 图像 |
| image | VARCHAR(0) FOR BIT DATA* |
| into | INT |
| money | DECIMAL(19,4) |
| nchar(1-4000) | VARCHAR(1-4000) |
| ntext | VARCHAR(0)* |
| numeric(1-31, 0-31) | DECIMAL(1-31,0-31) |
| numeric(32-38, 0-38) | VARCHAR(41) |
| nvarchar(1-4000) | VARCHAR(1-4000) |
| nvarchar(max) | VARCHAR(0)* |
| 真实 | REAL |
| smalldatetime | TIMESTAMP |
| smallint | SMALLINT |
| smallmoney | DECIMAL(10,4) |
| sql_variant | 不适用 |
| sysname | VARCHAR(128) |
| text | VARCHAR(0)* |
| time(0-7) | VARCHAR(16) |
| timestamp | CHAR(8) FOR BIT DATA |
| tinyint | SMALLINT |
| uniqueidentifier | CHAR(38) |
| varbinary(1-8000) | VARCHAR(1-8000) FOR BIT DATA |
| varchar(1-8000) | VARCHAR(1-8000) |
| varbinary(max) | VARCHAR(0) FOR BIT DATA* |
| varchar(max) | VARCHAR(0)* |
| xml | VARCHAR(0)* |
- 有关映射到 VARCHAR(0) 的详细信息,请参阅下一部分。
数据类型映射注意事项
复制到 DB2 订阅服务器时,请考虑下列数据类型映射问题:
当将 SQL Server 字符、varchar、binary 和 varbinary 分别映射到 Db2 字符、VARCHAR、CHAR 用于位数据和 VARCHAR 用于位数据时,复制设置 DB2 数据类型的长度与 SQL Server 类型相同。
这种方法允许在订阅者处成功创建生成的表,只要DB2页面大小约束足够大以容纳行的最大大小。 确保你用来访问 Db2 数据库的登录账户有权限访问足够大小的表空间,以便复制到 Db2 的表。
DB2 支持最大可达 32 千字节(KB)的 VARCHAR 列;因此,一些 SQL Server 的大对象列可以适当映射到 DB2 VARCHAR 列。 然而,复制用于 DB2 的 OLE DB 提供者不支持将 SQL Server 大型对象映射到 DB2 大型对象。 因此,SQL Server text、varchar(max)、ntext 和 nvarchar(max) 列在生成的 CREATE 脚本中被映射为 VARCHAR(0)。 在将脚本应用到订阅者之前,您必须将长度值 0 更改为合适的值。 如果你不更改数据类型长度,DB2在尝试在数据库用户创建表时触发错误604(错误604表示数据类型的精度或长度属性无效)。
根据你对复制源表的了解,判断是否适合将 SQL Server 大型对象映射到可变长度的 DB2 项,并在自定义创建脚本中指定合适的最大长度。 有关指定自定义创建脚本的信息,请参见本文“配置IBM Db2订阅者”部分的第5步。
注意
DB2类型的指定长度与其他列长度结合时,不能超过基于表数据分配到的DB2表空间的最大行大小。
如果没有合适的大对象列映射,可以考虑在文章中使用列过滤,避免该列被复制。 有关详细信息,请参阅筛选已发布数据。
当将 SQL Server nchar 和 nvarchar 复制到 DB2 CHAR 和 VARCHAR 时,复制对 DB2 类型使用相同的长度指定符,与 SQL Server 类型相同。 然而,数据类型长度可能对生成的 DB2 表来说过短。
在某些DB2环境中,SQL Server字符项不限于单字节字符;CHAR或VARCHAR项的长度必须考虑这一条件。 如果需要,你还必须考虑shift in和shift out字符。 如果你复制的是带有 nchar 和 nvarchar 列的表,可能需要在自定义创建脚本中为数据类型指定更大的最大长度。 有关指定自定义创建脚本的信息,请参见本文“配置IBM Db2订阅者”部分的第5步。