将SQLServer2005中的数据同步到Oracle中

时间:2021-08-22 04:41:32

        有时由于项目开发的需要,必须将SQLServer2005中的某些表同步到Oracle数据库中,由其他其他系统来读取这些数据。不同数据库类型之间的数据同步我们可以使用链接服务器和SQLAgent来实现。假设我们这边(SQLServer2005)有一个合同管理系统,其中有表contract 和contract_project是需要同步到一个MIS系统中的(Oracle9i)那么,我们可以按照以下几步实现数据库的同步。
1.在Oracle中建立对应的contract 和 contract_project表,需要同步哪些字段我们就建那些字段到Oracle表中。
这里需要注意的是Oracle的数据类型和SQLServer的数据类型是不一样的,那么他们之间是什么样的关系拉?我们可以在SQLServer下运行:

将SQLServer2005中的数据同步到Oracle中SELECT*
将SQLServer2005中的数据同步到Oracle中
FROM msdb.dbo.MSdatatype_mappings
将SQLServer2005中的数据同步到Oracle中
将SQLServer2005中的数据同步到Oracle中
SELECT*
将SQLServer2005中的数据同步到Oracle中
FROM msdb.dbo.sysdatatypemappings

来查看SQLServer和其他数据库系统的数据类型对应关系。第一个SQL语句是看SQL转Oracle的类型对应,而第二个表则更详细得显示了各个数据库系统的类型对应。根据第一个表和我们的SQLServer中的字段类型我们就可以建立好Oracle表了。
ORACLE bigintNUMBER1931
将SQLServer2005中的数据同步到Oracle中ORACLE
binary BLOBNULL01
将SQLServer2005中的数据同步到Oracle中ORACLE
binaryRAW-141
将SQLServer2005中的数据同步到Oracle中ORACLE
bitNUMBER131
将SQLServer2005中的数据同步到Oracle中ORACLE
charCHAR-141
将SQLServer2005中的数据同步到Oracle中ORACLE
char CLOBNULL01
将SQLServer2005中的数据同步到Oracle中ORACLE
charVARCHAR2-141
将SQLServer2005中的数据同步到Oracle中ORACLE
datetime DATENULL01
将SQLServer2005中的数据同步到Oracle中ORACLE
decimalNUMBER-131
将SQLServer2005中的数据同步到Oracle中ORACLE
doubleprecisionFLOATNULL01
将SQLServer2005中的数据同步到Oracle中ORACLE
floatFLOATNULL01
将SQLServer2005中的数据同步到Oracle中ORACLE
image BLOBNULL01
将SQLServer2005中的数据同步到Oracle中ORACLE
intNUMBER1031
将SQLServer2005中的数据同步到Oracle中ORACLE
moneyNUMBER1931
将SQLServer2005中的数据同步到Oracle中ORACLE
ncharNCHAR-141
将SQLServer2005中的数据同步到Oracle中ORACLE
nchar NCLOBNULL01
将SQLServer2005中的数据同步到Oracle中ORACLE
ntext NCLOBNULL01
将SQLServer2005中的数据同步到Oracle中ORACLE numeric
NUMBER-131
将SQLServer2005中的数据同步到Oracle中ORACLE
nvarchar NCLOBNULL01
将SQLServer2005中的数据同步到Oracle中ORACLE
nvarchar NVARCHAR2-141
将SQLServer2005中的数据同步到Oracle中ORACLE
nvarchar(max) NCLOBNULL01
将SQLServer2005中的数据同步到Oracle中ORACLE
realREALNULL01
将SQLServer2005中的数据同步到Oracle中ORACLE
smalldatetime DATENULL01
将SQLServer2005中的数据同步到Oracle中ORACLE
smallintNUMBER531
将SQLServer2005中的数据同步到Oracle中ORACLE
smallmoneyNUMBER1031
将SQLServer2005中的数据同步到Oracle中ORACLE sysname NVARCHAR2
12841
将SQLServer2005中的数据同步到Oracle中ORACLE
text CLOBNULL01
将SQLServer2005中的数据同步到Oracle中ORACLE
timestampRAW841
将SQLServer2005中的数据同步到Oracle中ORACLE
tinyintNUMBER331
将SQLServer2005中的数据同步到Oracle中ORACLE
uniqueidentifierCHAR3841
将SQLServer2005中的数据同步到Oracle中ORACLE
varbinary BLOBNULL01
将SQLServer2005中的数据同步到Oracle中ORACLE
varbinaryRAW-141
将SQLServer2005中的数据同步到Oracle中ORACLE
varbinary(max) BLOBNULL01
将SQLServer2005中的数据同步到Oracle中ORACLE
varchar CLOBNULL01
将SQLServer2005中的数据同步到Oracle中ORACLE
varcharVARCHAR2-141
将SQLServer2005中的数据同步到Oracle中ORACLE
varchar(max) CLOBNULL01
将SQLServer2005中的数据同步到Oracle中ORACLE xml NCLOB
NULL01
将SQLServer2005中的数据同步到Oracle中ORACLE
bigintNUMBER1931
将SQLServer2005中的数据同步到Oracle中ORACLE
binary BLOBNULL01
将SQLServer2005中的数据同步到Oracle中ORACLE
binaryRAW-141
将SQLServer2005中的数据同步到Oracle中ORACLE
bitNUMBER131
将SQLServer2005中的数据同步到Oracle中ORACLE
charCHAR-141
将SQLServer2005中的数据同步到Oracle中ORACLE
char CLOBNULL01
将SQLServer2005中的数据同步到Oracle中ORACLE
charVARCHAR2-141
将SQLServer2005中的数据同步到Oracle中ORACLE
datetime DATENULL01
将SQLServer2005中的数据同步到Oracle中ORACLE
decimalNUMBER-131
将SQLServer2005中的数据同步到Oracle中ORACLE
doubleprecisionFLOATNULL01
将SQLServer2005中的数据同步到Oracle中ORACLE
floatFLOATNULL01
将SQLServer2005中的数据同步到Oracle中ORACLE
image BLOBNULL01
将SQLServer2005中的数据同步到Oracle中ORACLE
intNUMBER1031
将SQLServer2005中的数据同步到Oracle中ORACLE
moneyNUMBER1931
将SQLServer2005中的数据同步到Oracle中ORACLE
ncharCHAR-141
将SQLServer2005中的数据同步到Oracle中ORACLE
nchar CLOBNULL01
将SQLServer2005中的数据同步到Oracle中ORACLE
ntext CLOBNULL01
将SQLServer2005中的数据同步到Oracle中ORACLE numeric
NUMBER-131
将SQLServer2005中的数据同步到Oracle中ORACLE
nvarchar CLOBNULL01
将SQLServer2005中的数据同步到Oracle中ORACLE
nvarcharVARCHAR2-141
将SQLServer2005中的数据同步到Oracle中ORACLE
nvarchar(max) CLOBNULL01
将SQLServer2005中的数据同步到Oracle中ORACLE
realREALNULL01
将SQLServer2005中的数据同步到Oracle中ORACLE
smalldatetime DATENULL01
将SQLServer2005中的数据同步到Oracle中ORACLE
smallintNUMBER531
将SQLServer2005中的数据同步到Oracle中ORACLE
smallmoneyNUMBER1031
将SQLServer2005中的数据同步到Oracle中ORACLE sysname
VARCHAR212841
将SQLServer2005中的数据同步到Oracle中ORACLE
text CLOBNULL01
将SQLServer2005中的数据同步到Oracle中ORACLE
timestampRAW841
将SQLServer2005中的数据同步到Oracle中ORACLE
tinyintNUMBER331
将SQLServer2005中的数据同步到Oracle中ORACLE
uniqueidentifierCHAR3841
将SQLServer2005中的数据同步到Oracle中ORACLE
varbinary BLOBNULL01
将SQLServer2005中的数据同步到Oracle中ORACLE
varbinaryRAW-141
将SQLServer2005中的数据同步到Oracle中ORACLE
varbinary(max) BLOBNULL01
将SQLServer2005中的数据同步到Oracle中ORACLE
varchar CLOBNULL01
将SQLServer2005中的数据同步到Oracle中ORACLE
varcharVARCHAR2-141
将SQLServer2005中的数据同步到Oracle中ORACLE
varchar(max) CLOBNULL01
将SQLServer2005中的数据同步到Oracle中ORACLE xml CLOB
NULL01
将SQLServer2005中的数据同步到Oracle中ORACLE
bigintNUMBER1931
将SQLServer2005中的数据同步到Oracle中ORACLE
binary BLOBNULL01
将SQLServer2005中的数据同步到Oracle中ORACLE
binaryRAW-141
将SQLServer2005中的数据同步到Oracle中ORACLE
bitNUMBER131
将SQLServer2005中的数据同步到Oracle中ORACLE
charCHAR-141
将SQLServer2005中的数据同步到Oracle中ORACLE
char CLOBNULL01
将SQLServer2005中的数据同步到Oracle中ORACLE
charVARCHAR2-141
将SQLServer2005中的数据同步到Oracle中ORACLE
datetime DATENULL01
将SQLServer2005中的数据同步到Oracle中ORACLE
decimalNUMBER-131
将SQLServer2005中的数据同步到Oracle中ORACLE
doubleprecisionFLOATNULL01
将SQLServer2005中的数据同步到Oracle中ORACLE
floatFLOATNULL01
将SQLServer2005中的数据同步到Oracle中ORACLE
image BLOBNULL01
将SQLServer2005中的数据同步到Oracle中ORACLE
intNUMBER1031
将SQLServer2005中的数据同步到Oracle中ORACLE
moneyNUMBER1931
将SQLServer2005中的数据同步到Oracle中ORACLE
ncharNCHAR-141
将SQLServer2005中的数据同步到Oracle中ORACLE
nchar NCLOBNULL01
将SQLServer2005中的数据同步到Oracle中ORACLE
ntext NCLOBNULL01
将SQLServer2005中的数据同步到Oracle中ORACLE numeric
NUMBER-131
将SQLServer2005中的数据同步到Oracle中ORACLE
nvarchar NCLOBNULL01
将SQLServer2005中的数据同步到Oracle中ORACLE
nvarchar NVARCHAR2-141
将SQLServer2005中的数据同步到Oracle中ORACLE
nvarchar(max) NCLOBNULL01
将SQLServer2005中的数据同步到Oracle中ORACLE
realREALNULL01
将SQLServer2005中的数据同步到Oracle中ORACLE
smalldatetime DATENULL01
将SQLServer2005中的数据同步到Oracle中ORACLE
smallintNUMBER531
将SQLServer2005中的数据同步到Oracle中ORACLE
smallmoneyNUMBER1031
将SQLServer2005中的数据同步到Oracle中ORACLE sysname NVARCHAR2
12841
将SQLServer2005中的数据同步到Oracle中ORACLE
text CLOBNULL01
将SQLServer2005中的数据同步到Oracle中ORACLE
timestampRAW841
将SQLServer2005中的数据同步到Oracle中ORACLE
tinyintNUMBER331
将SQLServer2005中的数据同步到Oracle中ORACLE
uniqueidentifierCHAR3841
将SQLServer2005中的数据同步到Oracle中ORACLE
varbinary BLOBNULL01
将SQLServer2005中的数据同步到Oracle中ORACLE
varbinaryRAW-141
将SQLServer2005中的数据同步到Oracle中ORACLE
varbinary(max) BLOBNULL01
将SQLServer2005中的数据同步到Oracle中ORACLE
varchar CLOBNULL01
将SQLServer2005中的数据同步到Oracle中ORACLE
varcharVARCHAR2-141
将SQLServer2005中的数据同步到Oracle中ORACLE
varchar(max) CLOBNULL01
将SQLServer2005中的数据同步到Oracle中ORACLE xml NCLOB
NULL01

2.建立链接服务器。我们将Oracle系统作为SQLServer的链接服务器加入到SQLServer中。

       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语句就是:

将SQLServer2005中的数据同步到Oracle中DELETEFROM MIS..MIS.CONTRACT_PROJECT
将SQLServer2005中的数据同步到Oracle中
--清空Oracle表中的数据
将SQLServer2005中的数据同步到Oracle中
INSERTinto MIS..MIS.CONTRACT_PROJECT--将SQLServer中的数据写到Oracle中
将SQLServer2005中的数据同步到Oracle中
SELECT contract_id,project_code,actual_money
将SQLServer2005中的数据同步到Oracle中
FROM contract_project
将SQLServer2005中的数据同步到Oracle中

如果报告成功,那么我们的数据就已经写入到Oracle中了。用

将SQLServer2005中的数据同步到Oracle中SELECT*
将SQLServer2005中的数据同步到Oracle中
FROM MIS..MIS.CONTRACT_PROJECT

查看Oracle数据库中是否已经有数据了。
4.建立SQLAgent,将以上同步SQL语句作为执行语句,每天定时同步两次。
这样我们的同步就完成了。
这里需要注意的是MIS..MIS.CONTRACT_PROJECT 这里必须要大写,如果是小写的话会造成同步失败。