將SQLServer2005中的數據同步到Oracle中


        有時由於項目開發的需要,必須將SQLServer2005中的某些表同步到Oracle數據庫中,由其他其他系統來讀取這些數據。不同數據庫類型之間的數據同步我們可以使用鏈接服務器和SQLAgent來實現。假設我們這邊(SQLServer2005)有一個合同管理系統,其中有表contract contract_project是需要同步到一個MIS系統中的(Oracle9i)那么,我們可以按照以下幾步實現數據庫的同步。
1.
Oracle中建立對應的contract contract_project表,需要同步哪些字段我們就建那些字段到Oracle表中。
這里需要注意的是Oracle的數據類型和SQLServer的數據類型是不一樣的,那么他們之間是什么樣的關系拉?我們可以在SQLServer下運行:

clip_image002[248]SELECT *
clip_image002[249]FROM msdb.dbo.MSdatatype_mappings
clip_image002[250]
clip_image002[251]SELECT *
clip_image002[252]FROM msdb.dbo.sysdatatypemappings

來查看SQLServer和其他數據庫系統的數據類型對應關系。第一個SQL語句是看SQLOracle的類型對應,而第二個表則更詳細得顯示了各個數據庫系統的類型對應。根據第一個表和我們的SQLServer中的字段類型我們就可以建立好Oracle表了。
ORACLE bigint NUMBER 19 3 1
clip_image002[253]ORACLE binary BLOB NULL 0 1
clip_image002[254]ORACLE binary RAW -1 4 1
clip_image002[255]ORACLE bit NUMBER 1 3 1
clip_image002[256]ORACLE char CHAR -1 4 1
clip_image002[257]ORACLE char CLOB NULL 0 1
clip_image002[258]ORACLE char VARCHAR2 -1 4 1
clip_image002[259]ORACLE datetime DATE NULL 0 1
clip_image002[260]ORACLE decimal NUMBER -1 3 1
clip_image002[261]ORACLE double precision FLOAT NULL 0 1
clip_image002[262]ORACLE float FLOAT NULL 0 1
clip_image002[263]ORACLE image BLOB NULL 0 1
clip_image002[264]ORACLE int NUMBER 10 3 1
clip_image002[265]ORACLE money NUMBER 19 3 1
clip_image002[266]ORACLE nchar NCHAR -1 4 1
clip_image002[267]ORACLE nchar NCLOB NULL 0 1
clip_image002[268]ORACLE ntext NCLOB NULL 0 1
clip_image002[269]ORACLE numeric NUMBER -1 3 1
clip_image002[270]ORACLE nvarchar NCLOB NULL 0 1
clip_image002[271]ORACLE nvarchar NVARCHAR2 -1 4 1
clip_image002[272]ORACLE nvarchar(max) NCLOB NULL 0 1
clip_image002[273]ORACLE real REAL NULL 0 1
clip_image002[274]ORACLE smalldatetime DATE NULL 0 1
clip_image002[275]ORACLE smallint NUMBER 5 3 1
clip_image002[276]ORACLE smallmoney NUMBER 10 3 1
clip_image002[277]ORACLE sysname NVARCHAR2 128 4 1
clip_image002[278]ORACLE text CLOB NULL 0 1
clip_image002[279]ORACLE timestamp RAW 8 4 1
clip_image002[280]ORACLE tinyint NUMBER 3 3 1
clip_image002[281]ORACLE uniqueidentifier CHAR 38 4 1
clip_image002[282]ORACLE varbinary BLOB NULL 0 1
clip_image002[283]ORACLE varbinary RAW -1 4 1
clip_image002[284]ORACLE varbinary(max) BLOB NULL 0 1
clip_image002[285]ORACLE varchar CLOB NULL 0 1
clip_image002[286]ORACLE varchar VARCHAR2 -1 4 1
clip_image002[287]ORACLE varchar(max) CLOB NULL 0 1
clip_image002[288]ORACLE xml NCLOB NULL 0 1
clip_image002[289]ORACLE bigint NUMBER 19 3 1
clip_image002[290]ORACLE binary BLOB NULL 0 1
clip_image002[291]ORACLE binary RAW -1 4 1
clip_image002[292]ORACLE bit NUMBER 1 3 1
clip_image002[293]ORACLE char CHAR -1 4 1
clip_image002[294]ORACLE char CLOB NULL 0 1
clip_image002[295]ORACLE char VARCHAR2 -1 4 1
clip_image002[296]ORACLE datetime DATE NULL 0 1
clip_image002[297]ORACLE decimal NUMBER -1 3 1
clip_image002[298]ORACLE double precision FLOAT NULL 0 1
clip_image002[299]ORACLE float FLOAT NULL 0 1
clip_image002[300]ORACLE image BLOB NULL 0 1
clip_image002[301]ORACLE int NUMBER 10 3 1
clip_image002[302]ORACLE money NUMBER 19 3 1
clip_image002[303]ORACLE nchar CHAR -1 4 1
clip_image002[304]ORACLE nchar CLOB NULL 0 1
clip_image002[305]ORACLE ntext CLOB NULL 0 1
clip_image002[306]ORACLE numeric NUMBER -1 3 1
clip_image002[307]ORACLE nvarchar CLOB NULL 0 1
clip_image002[308]ORACLE nvarchar VARCHAR2 -1 4 1
clip_image002[309]ORACLE nvarchar(max) CLOB NULL 0 1
clip_image002[310]ORACLE real REAL NULL 0 1
clip_image002[311]ORACLE smalldatetime DATE NULL 0 1
clip_image002[312]ORACLE smallint NUMBER 5 3 1
clip_image002[313]ORACLE smallmoney NUMBER 10 3 1
clip_image002[314]ORACLE sysname VARCHAR2 128 4 1
clip_image002[315]ORACLE text CLOB NULL 0 1
clip_image002[316]ORACLE timestamp RAW 8 4 1
clip_image002[317]ORACLE tinyint NUMBER 3 3 1
clip_image002[318]ORACLE uniqueidentifier CHAR 38 4 1
clip_image002[319]ORACLE varbinary BLOB NULL 0 1
clip_image002[320]ORACLE varbinary RAW -1 4 1
clip_image002[321]ORACLE varbinary(max) BLOB NULL 0 1
clip_image002[322]ORACLE varchar CLOB NULL 0 1
clip_image002[323]ORACLE varchar VARCHAR2 -1 4 1
clip_image002[324]ORACLE varchar(max) CLOB NULL 0 1
clip_image002[325]ORACLE xml CLOB NULL 0 1
clip_image002[326]ORACLE bigint NUMBER 19 3 1
clip_image002[327]ORACLE binary BLOB NULL 0 1
clip_image002[328]ORACLE binary RAW -1 4 1
clip_image002[329]ORACLE bit NUMBER 1 3 1
clip_image002[330]ORACLE char CHAR -1 4 1
clip_image002[331]ORACLE char CLOB NULL 0 1
clip_image002[332]ORACLE char VARCHAR2 -1 4 1
clip_image002[333]ORACLE datetime DATE NULL 0 1
clip_image002[334]ORACLE decimal NUMBER -1 3 1
clip_image002[335]ORACLE double precision FLOAT NULL 0 1
clip_image002[336]ORACLE float FLOAT NULL 0 1
clip_image002[337]ORACLE image BLOB NULL 0 1
clip_image002[338]ORACLE int NUMBER 10 3 1
clip_image002[339]ORACLE money NUMBER 19 3 1
clip_image002[340]ORACLE nchar NCHAR -1 4 1
clip_image002[341]ORACLE nchar NCLOB NULL 0 1
clip_image002[342]ORACLE ntext NCLOB NULL 0 1
clip_image002[343]ORACLE numeric NUMBER -1 3 1
clip_image002[344]ORACLE nvarchar NCLOB NULL 0 1
clip_image002[345]ORACLE nvarchar NVARCHAR2 -1 4 1
clip_image002[346]ORACLE nvarchar(max) NCLOB NULL 0 1
clip_image002[347]ORACLE real REAL NULL 0 1
clip_image002[348]ORACLE smalldatetime DATE NULL 0 1
clip_image002[349]ORACLE smallint NUMBER 5 3 1
clip_image002[350]ORACLE smallmoney NUMBER 10 3 1
clip_image002[351]ORACLE sysname NVARCHAR2 128 4 1
clip_image002[352]ORACLE text CLOB NULL 0 1
clip_image002[353]ORACLE timestamp RAW 8 4 1
clip_image002[354]ORACLE tinyint NUMBER 3 3 1
clip_image002[355]ORACLE uniqueidentifier CHAR 38 4 1
clip_image002[356]ORACLE varbinary BLOB NULL 0 1
clip_image002[357]ORACLE varbinary RAW -1 4 1
clip_image002[358]ORACLE varbinary(max) BLOB NULL 0 1
clip_image002[359]ORACLE varchar CLOB NULL 0 1
clip_image002[360]ORACLE varchar VARCHAR2 -1 4 1
clip_image002[361]ORACLE varchar(max) CLOB NULL 0 1
clip_image002[362]ORACLE xml NCLOB NULL 0 1

2.建立鏈接服務器。我們將Oracle系統作為SQLServer的鏈接服務器加入到SQLServer中。

       SqlServer下數據庫鏈接的使用方法

       有時候我們希望在一個sqlserver下訪問另一個sqlserver數據庫上的數據,或者訪問其他oracle數據庫上的數據,要想完成這些操作,我們首要的是創建數據庫鏈接。

  數據庫鏈接能夠讓本地的一個sqlserver登錄用戶映射到遠程的一個數據庫服務器上,並且像操作本地數據庫一樣。那么怎么創建數據庫鏈接呢?我現在有兩種方法可以實現。

  第一種:在 sqlserver 企業管理器中,建立,這個比較簡單的,首先在 "服務器對象"節點下的數據庫鏈接節點 上點右鍵 ,在出現的菜單中點 新建數據庫鏈接 ,然后會彈出一個界面,需要我們填寫的有:鏈接服務器(這是一個名字,自己根據情況自行定義,以后就要通過他進行遠程訪問了),提供程序名稱(這個就是選擇數據驅動,根據數據庫類型來選擇,不能亂選,否則鏈接不上的),數據源(對於sqlserver就是遠程數據庫服務器的主機名或者IP,對於 oracle 就是在 oracle net config 中配置的別名),安全上下文用戶和口令(也就是遠程服務器的用戶和口令)。

  第二種:利用系統存儲過程

  創建一個sqlserversqlserver的數據庫鏈接:

exec sp_addlinkedserver  'link_northsnow','','SQLOLEDB','遠程服務器主機名或域名或ip地址'
exec sp_addlinkedsrvlogin 'link_northsnow','false',null,'
用戶名','用戶口令
'

  創建一個sqlserverOracle的數據庫鏈接:

exec sp_addlinkedserver 'link_ora', 'Oracle', 'MSDAORA', 'oracle數據庫服務器別名'
exec sp_addlinkedsrvlogin 'link_ora', false, 'sa', '
用戶名', '用戶口令
'

  有了數據庫鏈接我們就可以使用了。對於sqlserveroracle中的使用方法是有區別的。

  對於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語句就是:

clip_image002[363]DELETE FROM MIS..MIS.CONTRACT_PROJECT
clip_image002[364]--
清空Oracle表中的數據
clip_image002[365]INSERT into MIS..MIS.CONTRACT_PROJECT--
SQLServer中的數據寫到Oracle

clip_image002[366]SELECT contract_id,project_code,actual_money
clip_image002[367]FROM contract_project

clip_image002[368]

如果報告成功,那么我們的數據就已經寫入到Oracle中了。用

clip_image002[369]SELECT *
clip_image002[370]FROM MIS..MIS.CONTRACT_PROJECT

查看Oracle數據庫中是否已經有數據了。
4.
建立SQLAgent,將以上同步SQL語句作為執行語句,每天定時同步兩次。
這樣我們的同步就完成了。
這里需要注意的是MIS..MIS.CONTRACT_PROJECT 這里必須要大寫,如果是小寫的話會造成同步失敗。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM