将SQLSERVER中的数据同步到ORACLE中
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
如何将SQLServer2005中的数据同步到Oracle中
有时由于项目开发的需要,必须将SQLServer2005中的某些表同步到Oracle数据库中,由其他其他系统来读取这些数据。
不同数据库类型之间的数据同步我们可以使用链接服务器和SQLAgent来实现。
假设我们这边(SQLServer2005)有一个合同管理系统,其中有表contract 和contract_project是需要同步到一个MIS系统中的(Oracle9i)那么,我们可以按照以下几步实现数据库的同步。
1.在Oracle中建立对应的contract 和contract_project表,需要同步哪些字段我们就建那些字段到O racle表中。
这里需要注意的是Oracle的数据类型和SQLServer的数据类型是不一样的,那么他们之间是什么样的关系拉?我们可以在SQLServer下运行:
SELECT*
FROM msdb.dbo.MSdatatype_mappings
SELECT*
FROM msdb.dbo.sysdatatypemappings
来查看SQLServer和其他数据库系统的数据类型对应关系。
第一个SQL语句是看SQL转Oracle的类型对应,而第二个表则更详细得显示了各个数据库系统的类型对应。
根据第一个表和我们的SQLServer中的字段类型我们就可以建立好Oracle表了。
ORACLE bigint NUMBER1931
ORACLE binary BLOB NULL01
ORACLE binary RAW-141
ORACLE bit NUMBER131
ORACLE char CHAR-141
ORACLE char CLOB NULL01
ORACLE char VARCHAR2-141
ORACLE datetime DATE NULL01
ORACLE decimal NUMBER-131
ORACLE double precision FLOAT NULL01
ORACLE float FLOAT NULL01
ORACLE image BLOB NULL01
ORACLE int NUMBER1031
ORACLE money NUMBER1931
ORACLE nchar NCHAR-141
ORACLE nchar NCLOB NULL01
ORACLE ntext NCLOB NULL01
ORACLE numeric NUMBER-131
ORACLE nvarchar NCLOB NULL01
ORACLE nvarchar NVARCHAR2 -141
ORACLE nvarchar(max) NCLOB NULL01
ORACLE real REAL NULL01
ORACLE smalldatetime DATE NULL01
ORACLE smallint NUMBER531
ORACLE smallmoney NUMBER1031
ORACLE sysname NVARCHAR2 12841
ORACLE text CLOB NULL01
ORACLE timestamp RAW841
ORACLE tinyint NUMBER331
ORACLE uniqueidentifier CHAR3841
ORACLE varbinary BLOB NULL01
ORACLE varbinary RAW-141
ORACLE varbinary(max) BLOB NULL01
ORACLE varchar CLOB NULL01
ORACLE varchar VARCHAR2-141
ORACLE varchar(max) CLOB NULL01
ORACLE xml NCLOB NULL01
ORACLE bigint NUMBER1931
ORACLE binary BLOB NULL01
ORACLE binary RAW-141
ORACLE bit NUMBER131
ORACLE char CHAR-141
ORACLE char CLOB NULL01
ORACLE char VARCHAR2-141
ORACLE datetime DATE NULL01
ORACLE decimal NUMBER-131
ORACLE double precision FLOAT NULL01
ORACLE float FLOAT NULL01
ORACLE image BLOB NULL01
ORACLE int NUMBER1031
ORACLE money NUMBER1931
ORACLE nchar CHAR-141
ORACLE nchar CLOB NULL01
ORACLE ntext CLOB NULL01
ORACLE numeric NUMBER-131
ORACLE nvarchar CLOB NULL01
ORACLE nvarchar VARCHAR2-141
ORACLE nvarchar(max) CLOB NULL01
ORACLE real REAL NULL01
ORACLE smalldatetime DATE NULL01
ORACLE smallint NUMBER531
ORACLE smallmoney NUMBER1031
ORACLE sysname VARCHAR212841
ORACLE text CLOB NULL01
ORACLE timestamp RAW841
ORACLE tinyint NUMBER331
ORACLE uniqueidentifier CHAR3841
ORACLE varbinary BLOB NULL01
ORACLE varbinary RAW-141
ORACLE varbinary(max) BLOB NULL01
ORACLE varchar CLOB NULL01
ORACLE varchar VARCHAR2-141
ORACLE varchar(max) CLOB NULL01
ORACLE xml CLOB NULL01
ORACLE bigint NUMBER1931
ORACLE binary BLOB NULL01
ORACLE binary RAW-141
ORACLE bit NUMBER131
ORACLE char CHAR-141
ORACLE char CLOB NULL01
ORACLE char VARCHAR2-141
ORACLE datetime DATE NULL01
ORACLE decimal NUMBER-131
ORACLE double precision FLOAT NULL01
ORACLE float FLOAT NULL01
ORACLE image BLOB NULL01
ORACLE int NUMBER1031
ORACLE money NUMBER1931
ORACLE nchar NCHAR-141
ORACLE nchar NCLOB NULL01
ORACLE ntext NCLOB NULL01
ORACLE numeric NUMBER-131
ORACLE nvarchar NCLOB NULL01
ORACLE nvarchar NVARCHAR2 -141
ORACLE nvarchar(max) NCLOB NULL01
ORACLE real REAL NULL01
ORACLE smalldatetime DATE NULL01
ORACLE smallint NUMBER531
ORACLE smallmoney NUMBER1031
ORACLE sysname NVARCHAR2 12841
ORACLE text CLOB NULL01
ORACLE timestamp RAW841
ORACLE tinyint NUMBER331
ORACLE uniqueidentifier CHAR3841
ORACLE varbinary BLOB NULL01
ORACLE varbinary RAW-141
ORACLE varbinary(max) BLOB NULL01
ORACLE varchar CLOB NULL01
ORACLE varchar VARCHAR2-141
ORACLE varchar(max) CLOB NULL01
ORACLE xml NCLOB NULL01
2.建立链接服务器。
我们将Oracle系统作为SQLServer的链接服务器加入到SQLServer中。
具体做法参见我以前的文章/studyzy/archive/2006/12/08/690307.htm l SqlServer下数据库链接的使用方法
有时候我们希望在一个sqlserver下访问另一个sqlserver数据库上的数据,或者访问其他oracle数据库上的数据,要想完成这些操作,我们首要的是创建数据库链接。
数据库链接能够让本地的一个sqlserver登录用户映射到远程的一个数据库服务器上,并且像操作本地数据库一样。
那么怎么创建数据库链接呢?我现在有两种方法可以实现。
第一种:在sqlserver企业管理器中,建立,这个比较简单的,首先在"服务器对象"节点下的“数据库链接”节点上点右键,在出现的菜单中点“新建数据库链接”,然后会弹出一个界面,需要我们填写的有:链接服务器(这是一个名字,自己根据情况自行定义,以后就要通过他进行远程访问了),提供程序名称(这个就是选择数据驱动,根据数据库类型来选择,不能乱选,否则链接不上的),数据源(对于sqlserver就是远程数据库服务器的主机名或者IP,对于oracle就是在oracle net config 中配置的别名),安全上下文用户和口令(也就是远程服务器的用户和口令)。
第二种:利用系统存储过程
创建一个sqlserver对sqlserver的数据库链接:
exec sp_addlinkedserver 'link_northsnow','','SQLOLEDB','远程服务器主机名或域名或ip地址' exec sp_addlinkedsrvlogin 'link_northsnow','false',null,'用户名','用户口令' 创建一个sqlserver对Oracle的数据库链接:
exec sp_addlinkedserver 'link_ora', 'Oracle', 'MSDAORA', 'oracle数据库服务器别名'
exec sp_addlinkedsrvlogin 'link_ora', false, 'sa', '用户名', '用户口令'
有了数据库链接我们就可以使用了。
对于sqlserver和oracle中的使用方法是有区别的。
对于sqlserver:
create view v_lhsy_user as select * from link_northsnow.lhsy.dbo.sys_user
select * from v_lhsy_user
其中lhsy为远程的数据库名
sys_user为表名
对于oracle:
create view vvv as select * from link_ora..NORTHSNOW.SYS_USER
select * from vvv;
其中northsnow为远程oracle数据库服务器的一个用户名,SYS_USER为该用户在该服务器上的一个表,要非常注意的是:数据库链接(link_ora)后面有两个点(..),再往后面必须全部大写,查询的对象一般为表格或者视图,不能查询同义词。
要想删除数据库链接,也有两种方法,
一种是在企业管理器中操作,这个简单。
另一种是用系统存储过程:
exec sp_dropserver 数据库链接名称,'droplogins'
3.使用SQL语句通过链接服务器将SQLServer数据写入Oracle中。
比如我们建立了链接服务器MIS,而Oracle中在MIS用户下面建立了表contract_project,那么我们的SQL语句就是:
DELETE FROM MIS..MIS.CONTRACT_PROJECT
--清空Oracle表中的数据
INSERT into MIS..MIS.CONTRACT_PROJECT--将SQLServer中的数据写到Oracle中
SELECT contract_id,project_code,actual_money
FROM contract_project
如果报告成功,那么我们的数据就已经写入到Oracle中了。
用
SELECT*
FROM MIS..MIS.CONTRACT_PROJECT
查看Oracle数据库中是否已经有数据了。
4.建立SQLAgent,将以上同步SQL语句作为执行语句,每天定时同步两次。
这样我们的同步就完成了。
这里需要注意的是MIS..MIS.CONTRACT_PROJECT 这里必须要大写,如果是小写的话会造成同步失败。