Kulvir Singh Bhogal,IBM Software Services for WebSphere, Austin, TX
Sridhar Reddy Varakala, 研究生,University of Texas at Arlington
2003 年 11 月 如果您对信息集成感兴趣,但是没有时间去学习基本知识,那么作者 Kulvir Bhogal 将就 DB2 Information Integrator 集成和更新 Oracle 数据库的数据的能力给您提供一个简洁明了的介绍。
当今企业的异构性质
我们需要面对的是,许多企业的运作实际上是差别很大的。在很多情况下,这种差别是由公司合并导致的,但有时也可以把它归结为政治,像风一样变换不定的政治。在前一种情况下,公司合并常常试图将完全不同的 IT 工场组合起来,希望这些完全不同的设置会神奇地一起工作。事实证明:这种差别可以成为那些试图支持这些合并的 IT 工场的最头疼的事情。
幸运的是,您可以使用 IBM® DB2® Information Integrator™的联邦服务器能力来提供一种创建各种后端信息源的单一抽象视图的方法。比方说,您有包括 Oracle、Microsoft®、SQL Server、Sybase 和 IBM DB2 Universal Database™ 在内的各种后端。您甚至可能在 Documentum 或 Lotus® Notes 数据库中有重要的内容。DB2 Information Integrator 的功能很广泛,它允许您在用新的方法从这些源中组合以及合并数据时保留当前信息存储。多个来自不同供应商的异构数据库以这种方法连接起来,从而提供单一的应用程序接口。
使用 DB2 Information Integrator 的联邦服务器能力,我们可以设置 IBM DB2 以使我们能够实时整合来自不同后端的数据、更新这些数据并将更新在后端上反映出来。
我们将要做的事情
在本文中,我们将给您介绍一个很简单的业务方案,以使您能亲自感受 DB2 Information Integrator 的某些强大的能力。为了使方案变得比较简单,我们只集中讨论关系能力并且将讨论限制在两个 DBMS 后端系统上。尤其是,我们将使用 IBM DB2 Information Integrator V8.1 将 Oracle 9i Database (V9.2) 中的数据与 IBM DB2 UDB 8.1 数据库中的数据连接起来。
我们的业务方案
一家名为 Big Auto Rental Inc. 的公司刚刚买下了一家名为 Little Car Rental Co. 的公司。作为业务接管的一部分,Big Auto Rental Inc. 同意 Little Car Rental 的 IT 基础结构仍将保持不变。然而,为了业务的正常运作,在 Little Car Rental Co. 有租借业务的客户必须出现在 Big Auto Rental Inc. 的系统中。
Big Auto Rental Co. 使用 IBM DB2 8.1 UDB Enterprise Edition 来存储数据,而 Little Car Rental Co. 使用的却是 Oracle 9i Standard Edition V9.2。在我们的设置中,我们将 DB2 8.1, DB2 Information Integrator 和 Oracle 9i 放在同一个物理框架中运行。相应地,您可能必须 修改我们的方案以模拟分布式(更实际的)环境。
我们将开始说明如何使用 IBM DB2 Information Integrator 来将汽车租赁公司的数据“连接起来”。
准备 Oracle — 模拟 Little Car Rental Co. 的设置
Little Car Rental Co. 的设置很简单,只包括一个驻留在 Oracle 9i 数据库中的表。表的结构如下所示:
| LITTLECARRENTTABLE(在 Oracle 中) |
| RENTALNUMBER |
DECIMAL (6,0) NOT NULL PRIMARY KEY |
| RENTALCHARGES |
DECIMAL (6,2) NOT NULL |
| CUSTOMERNAME |
CHARACTER(30) NOT NULL |
让我们使用 Oracle 的 SQL Plus 实用程序来创建一个用户,该用户具有创建和填充上面所描述的表的权限。在使用具有创建另一个用户的权限的帐户连接至 Oracle 之后,我们发出命令:
SQL> CREATE USER oracleuser IDENTIFIED BY oraclepass;
SQL> GRANT RESOURCE TO oracleuser;
|
通过发出以上命令,我们有效地给予我们的新用户(oracleuser)以下系统权限:
CREATE CLUSTER CREATE INDEXTYPE CREATE OPERATOR CREATE PROCEDURE CREATE SEQUENCE CREATE TABLE CREATE TRIGGER CREATE TYPE
如果您不熟悉 Oracle 的语法,您可能想访问 http://sqlzoo.net/站点,以便能跟上我们的步伐,理解本文所使用的语法。
下一步,我们给予 oracleuser 连接至名为 oracle 的数据库的权限(该数据库是我们在 Oracle 安装过程中创建的):
SQL> GRANT CREATE SESSION TO oracleuser;
|
下一步,我们连接至我们在 Oracle 安装过程中创建的数据库(在我们的例子中,它名为 oracle ):
SQL> CONN oracleuser/oraclepass@ORACLE.THINKER
|
在上面的语法中, ORACLE.THINKER 是我们的 Net Service Name 的名称,它是我们在安装过程中指定的。
您可以通过查看名为 tnsnames.ora 的文件来确认您的 Net Service Name,在缺省情况下,该文件位于 c:\oracle\ora92\network\admin 目录下。下面的 图 1显示了您特别感兴趣的项的屏幕快照,从中,您可以知道如何获取您的 Net Service Name。
图 1. 获取您的 Net Service Name
下一步,我们创建我们的表:
SQL> CREATE TABLE LITTLECARRENTTABLE(
RENTALNUMBER DECIMAL(6,0) NOT NULL PRIMARY KEY,
RENTALCHARGES DECIMAL(6,2) NOT NULL,
CUSTOMERNAME CHARACTER (30) NOT NULL);
|
我们用一些样本记录来填充这个表:
SQL> INSERT INTO LITTLECARRENTTABLE VALUES(1008,154.90,'Kulvir Bhogal');
SQL> INSERT INTO LITTLECARRENTTABLE VALUES(1012,68.00,'Sridhar Varakala');
SQL> INSERT INTO LITTLECARRENTTABLE VALUES(1015,360.00,'Barbara Lewis');
|
准备 DB2 — 模拟 Big Auto Rental Inc. 的设置
现在我们要花点时间来用 DB2 UDB 模拟 Big Auto Rental Inc. 的设置。这家公司的设置的数据模型如下所示:
| BIGCARRENTTABLE(在 DB2 通用数据库中) |
| CAR_ID |
INTEGER NOT NULL PRIMARY KEY |
| ACCOUNT_BALANCE |
DECIMAL (6,2) NOT NULL |
| CUSTOMER |
VARCHAR(30) NOT NULL |
如您所见,Big Auto 的数据库设置也比较简单。我们将使用 DB2 命令行处理器(Command Line Processor)来创建我们的表并用一些样本数据来填充它:
db2 => CREATE DB BGAUTODB
db2 => CONNECT TO BGAUTODB USER DB2ADMIN USING db2admin
db2 => CREATE TABLE BIGCARRENTTABLE(CAR_ID INTEGER NOT NULL
PRIMARY KEY, ACCOUNT_BALANCE DECIMAL (6,2) NOT NULL, CUSTOMER
VARCHAR(30) NOT NULL)
db2 => INSERT INTO BIGCARRENTTABLE VALUES(4567,234.50,'Richard Goldstein')
db2 => INSERT INTO BIGCARRENTTABLE VALUES(7867,670.50,'James W. Carey')
db2 => INSERT INTO BIGCARRENTTABLE VALUES(9044,342.17,'David Mark')
|
确保 DB2 Information Integrator 已就绪
现在,让我们来看看 DB2 Information Integrator 提供了什么功能。需要注意的一点是,在 DB2 Information Integrator 安装过程中,您需要选择正确的功能部件,这些功能部件和我们在联邦数据库设置中所要引入的数据库相对应。下面的 图 2显示了功能部件选择屏幕的屏幕快照。
图 2. 功能部件选择屏幕
安装 DB2 Information Integrator 之后,请确保位于 c:\Program Files\IBM\SQLLIB\cfg 目录(在缺省情况下)下的 db2dj.ini 文件中的环境变量 ORACLE_HOME 被设置为您的 Oracle 安装的 ORA92 文件夹。 图 3 显示了我们的 db2dj.ini 文件内容的屏幕快照:
图 3. db2dj.ini 文件的内容
另一件我们需要确保的事情是 Federated Database System Support 是启用状态 — 缺省值是为 DB2 Information Integrator 启用联邦支持。我们可以通过发出以下命令来检查该状态:
db2 => GET DATABASE MANAGER CONFIGURATION
|
下面 图 4 中的屏幕快照显示我们可以继续执行下一步了:
图 4. 可以继续执行
|
使用 DB2 Control Center
如果您想使用 DB2 Control Center(而不是 DB2 CLP)来创建联邦映射,那么您需要使用在 DB2 的安装过程中指定作为 DB2 Administrator 的用户来登录到 Windows。在我们的例子中,该用户是“db2admin”。您还需要给予该用户在 Oracle 数据库设置中的管理员权限。
|
创建包装器
我们需要创建包装器,它将告诉 DB2 数据库如何引用任何我们可能拥有的 Oracle 数据库。我们用以下语法执行此操作:
db2 => CREATE WRAPPER "FEDORACLELITTLE"
LIBRARY 'db2net8.dll'
|
在上面的语句中,我们定义了一个名为 FEDORACLELITTLE 的包装器;我们还指定了名为 db2net8.dll 的包装器库以访问 Oracle 数据源。
您还可以使用 DB2 Control Center 来执行该操作。要这么做,请右键单击 BGAUTODB 数据库的 Federated Database Objects 文件夹并选择 Create Wrapper(如 图 5所示)。
图 5. 使用 DB2 Control Center 来创建包装器
如 图 6 所示,指定 Wrapper name 为 FEDORACLELITTLE ,Library name 为 db2net8.dll 。
图 6. 指定包装器和库的名称
定义服务器
现在我们需要发出 CREATE SERVER 语句以在我们的联邦数据库设置中将 Oracle 数据源注册为服务器:
db2 => CREATE SERVER "fedoracle" TYPE ORACLE VERSION '9i'
WRAPPER "FEDORACLELITTLE" OPTIONS (NODE 'ORACLE.THINKER')
|
上述语法遵循下面这段一般形式的语法:
CREATE SERVER "
oraserver" TYPE
datasource VERSION '
x.y'
WRAPPER "
wrappername" OPTIONS (NODE '
net_service_name')
|
oraserver 是 Oracle 数据库相对于 DB2 联邦服务器的名称。
datasource 指的是我们配置要访问的数据源服务器的类型。在我们的例子中,我们使用的是 Oracle。
x.y 指的是我们要访问的 Oracle 数据库服务器的版本。
wrappername 指的是在本文的前面我们在 CREATE WRAPPER 语句中指定的名称。
net_service_name 指的是我们在前面看到的 tnsnames.ora 文件中出现的 Net Service Name。
如果您使用的是 Control Center,右键单击 FEDORACLELITTLE 包装器的 Server 文件夹并选择 Create...(如下所示):
如 图 8 所示,指定 Oracle 服务器的信息。ORACLE.THINKER 指的是我们在前面看到的 tnsnames.ora 文件中出现的 Net Service Name。
图 8. 指定 Oracle 服务器的信息
创建用户映射
我们的 DB2 用户需要知道如何像 Oracle 用户一样操作,以便可以和 Oracle 数据源交互。要实现该操作,我们发出以下语句:
db2 => CREATE USER MAPPING for "DB2ADMIN" SERVER
"fedoracle" OPTIONS(REMOTE_AUTHID 'oracleuser',
REMOTE_PASSWORD 'oraclepass')
|
在上面的语法中, oracleuser 和 oraclepass 是我们用来访问远程 Oracle 服务器的凭证。
如果使用的是 Control Center,右键单击 fedoracle(远程数据源的名称)下的 User Mappings 文件夹(如下所示)并选择 Create...。
下一步,选择您想映射的本地用户标识,并指定远程用户标识的用户标识和密码。我们选择将本地用户标识 DB2ADMIN 映射到 oracleuser (如 图 10所示)。
图 10. 创建用户映射
创建昵称
现在我们需要使用我们在前面部分刚刚创建的用户映射来将 DB2 映射到 Oracle 远程表:
db2 => CREATE NICKNAME "DB2ADMIN"."FEDLITTLECARRENTTABLE"
FOR "fedoracle"."ORACLEUSER"."LITTLECARRENTTABLE"
|
使用上面的语法,我们将名为 FEDLITTLECARRENTTABLE 的表映射到名为 LITTLECARRENTTABLE 的 Oracle 表。
如果您使用的是 DB2 Control Center,右键单击 Nicknames 文件夹并选择 Create...(如下所示):
在 图 12中,您可以创建过滤器以缩减允许您映射到昵称的远程表名。单击 OK。
图 12. 创建昵称
在 图 13 中我们选取了以下表: DB2ADMIN.LITTLECARRENTABLE
图 13. 选取映射到昵称的表
确保我们是联邦的
现在,我们准备访问我们的 Oracle 表,就如同是在访问本地 DB2 表。我们发出命令:
db2 => SELECT * FROM FEDLITTLECARRENTTABLE
|
图 14. Oracle 映射结果
现在让我们来做些联邦测试。使用 Oracle 的 SQL Plus 实用程序来执行插入:
SQL> INSERT INTO LITTLECARRENTTABLE VALUES(1000,360.00,'Oracle
Washere');
|
让我们回到 DB2 并执行插入:
db2 => INSERT INTO BIGCARRENTTABLE VALUES(1234,234.50,'DB2 Washere')
|
现在,我们可以在 图 15和 图 16 中看到,DB2 插入和 Oracle 插入都已成功地填充了 BIGCARRENTABLE 和 FEDLITTLECARRENTTABLE 表。
图 15. Big Car Rental 的内容列表
图 16. Little Car Rental 的内容列表
将它们合并起来
现在,我们可以创建一个视图来让我们看到两个公司的合并内容,从而有效地满足我们的业务需求:
db2 => CREATE VIEW CONSOLIDATED (CARID,ACCOUNT_BALANCE,CUSTOMER) AS
(SELECT CAR_ID,ACCOUNT_BALANCE,CUSTOMER FROM BIGCARRENTTABLE UNION
SELECT RENTALNUMBER,RENTALCHARGES,CUSTOMERNAME FROM
FEDLITTLECARRENTTABLE)
|
然后我们可以从联邦服务器上查询该视图:
db2=> select * from consolidated
|
结果如 图 17所示。
图 17. 最终的合并视图
扼要重述
在本文中,您已了解了如何将现有的 Oracle 数据库包装为 DB2 联邦数据库对象。使用一个视图,我们能够实时合并来自 DB2 和 Oracle 表的数据,从而能够满足我们的业务需求(如 图 18所示)。
图 18. 满足业务需求
结束语
许多公司使用多种软件产品。在这种情况下,我们可能看到许多的信息和内容存储。在许多情况下,弃用所有这些存储而使用集成数据库不是一个实用的方案。因为当今严峻的经济形势可能会限制 IT 预算,所以公司尽可能地使用其现有的 IT 基础结构来开展业务是极为重要的。在一个充满差别的世界里,DB2 Information Integrator 提供了很实用的功能。
作者简介
Kulvir Singh Bhogal是一名 WebSphere 顾问,他的工作是在美国实现 IBM 的电子商务战略。您可以通过 kbhogal@us.ibm.com 和 Kulvir 联系。 |
|
Sridhar Reddy Varakala是正在位于阿林顿(Arlington)的德克萨斯大学(University of Texas)攻读计算机科学(Computer Science)专业的硕士研究生。他的研究涉及开发 Event Condition Action 范式中的 Dynamic Rule Editor。您可以通过 varakalas@yahoo.com 和 Sridhar 联系。
|
|