高级数据迁移
很多时间,要在异构数据库之间进行数据迁移或抽取,如果在 SQL 中提取 ORACLE 的数据,可以通过 ODBC 、 OLEDB 等多种方式,要从 ORACLE 提取 SQL 中的数据,大都是通过透明网关来实现的。
在异构数据抽取过程中,最好采用 SQL92 标准的语法编写 SQL 代码,同时要注意不同数据库之间数据类型的转换关系,如 ORACLE 的日期类型用 DATE 、 SQL 用 Datetime 等。
一 关于 ORACLE 的透明网关配置
ORACLE安装时( 9i ),将 TRANSPARENT GATEWAY FOR MSSQL 选中,在 ORACLE 主目录 BIN 中,有个 tg4msql.exe 程序,它是透明网关程序啦,同时在主目录中还有 tgrmsql 的一个目录, ORACLE_HOME g4msqladmin 目录中的 inittg4msql.ora 就是需要进行配置才能在 ORACLE 中连接 SQL 。
图 2.1 tg4msql
1 如何配置透明网关呢?打开 inittg4msql.ora:
#
# HS init parameters
# xzh 代表 SQL 服务名, pubs 代表要访问的 SQL 数据库
#
HS_FDS_CONNECT_INFO="SERVER=xzh;DATABASE=pubs"
HS_FDS_TRACE_LEVEL=OFF
HS_FDS_RECOVERY_ACCOUNT=RECOVER
HS_FDS_RECOVERY_PWD=RECOVER
2 监听的配置 oracle_home etworkadminListiner.ora
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = xzh)(PORT = 1521))
)
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = xzh)(PORT = 1527))
)
)
)
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = xzh.world)
(ORACLE_HOME = D:oracleora92)
(SID_NAME = xzh)
)
(SID_DESC =
(GLOBAL_DBNAME = tg4msql)
(PROGRAM = tg4msql)
(SID_NAME = tg4msql)
(ORACLE_HOME = D:oracleora92)
)
)
加亮代码是要在监听文件中新加部分, GLOBAL_DBNAME 、 SID_NAME 可以任意, PROGRM 必须指向 tg4msql 如图 2.1 所示。
3 本地服务文件的配置 oracle_home etworkadminTnsNames.ora
XZH =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = xzh)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = xzh.world)
)
)
TG4MSQL =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = xzh)(PORT = 1527))
)
(CONNECT_DATA =
(SID = tg4msql)
)
(HS = OK)
)
使用 SQL 的本地服务名为 TG4MSQL ,可以任意写, SID 必须是 Listiner.ora 中指定的那个 SID_NAME , PORT 也必须是监听中指定的 PORT ,主机 等都要符合一致。 到此为止,我们把透明网关大致已经配置好啦,如果要访问 SQL ,还要使用数据库链才方便。
4 在 SQL 中创建登录帐号 xzh 口令 xzh ,使用可以访问 PUBS 数据库。
CREATE DATABASE LINK sql CONNECT TO xzh IDENTIFIED BY xzh
USING ‘TG4MSQL’
这里的 USING ‘TG4MSQL’ 是 tnsnames.ora 中配置好的本地服务名, sql 是我们以后要引用的数据库链名。
SQL>SELECT * FROM sales@sql
如果有数据返回,表示我们访问 SQL 数据库的通道已经建成,请大胆使用吧,但对远程异构数据库不充许进行 DDL 操作。
SQL>CREATE TABLE all_users@tg4msql FRIN all_users;
*
ERROR 位于第 1 行 :
ORA-02021: 不允许对远程数据库进行 DDL 操作
二 SQL 访问 ORACLE 的方法
1 通过行集函数 OPENDATASOURCE
OPENDATASOURCE ( provider_name, init_string )
SELECT *
FROM OPENDATASOURCE(
'MSDAORA',
'Data Source=xzh.oracle;User ID=POS;Password=POS')..POS.A0325
MSDAORA是 OLEDB FOR ORACLE 的驱动,初始化字符串指定本地服务名、用户名、口令。然后引用表中数据时要以服务器 .. 用户名 . 表名。 注意一定是四部分组成,用户名与表名一定要大写。
SELECT * INTO PUBS.DBO.A0325 FROM
OPENDATASOURCE(
'MSDAORA',
'Data Source=xzh.oracle;User ID=POS;Password=POS' )..POS.A0325
--将 ORACLE 中 POS 模式的 A0325 导入 SQL 的 PUBS [末页] 选择页数 1 2