有時由於項目開發的需要,必須將SQLServer2005中的某些表同步到Oracle數據庫中,由其他其他系統來讀取這些數據。不同數據庫類型之間的數據同步我們可以使用鏈接服務器和SQLAgent來實現。假設我們這邊(SQLServer2005)有一個合同管理系統,其中有表contract 和contract_project是需要同步到一個MIS系統中的(Oracle9i)那么,我們可以按照以下幾步實現數據庫的同步。
1.在Oracle中建立對應的contract 和 contract_project表,需要同步哪些字段我們就建那些字段到Oracle表中。
這里需要注意的是Oracle的數據類型和SQLServer的數據類型是不一樣的,那么他們之間是什么樣的關系拉?我們可以在SQLServer下運行:
SELECT *
FROM msdb.dbo.MSdatatype_mappings![]()
SELECT *
FROM msdb.dbo.sysdatatypemappings
來查看SQLServer和其他數據庫系統的數據類型對應關系。第一個SQL語句是看SQL轉Oracle的類型對應,而第二個表則更詳細得顯示了各個數據庫系統的類型對應。根據第一個表和我們的SQLServer中的字段類型我們就可以建立好Oracle表了。
ORACLE bigint NUMBER 19 3 1
ORACLE binary BLOB NULL 0 1
ORACLE binary RAW -1 4 1
ORACLE bit NUMBER 1 3 1
ORACLE char CHAR -1 4 1
ORACLE char CLOB NULL 0 1
ORACLE char VARCHAR2 -1 4 1
ORACLE datetime DATE NULL 0 1
ORACLE decimal NUMBER -1 3 1
ORACLE double precision FLOAT NULL 0 1
ORACLE float FLOAT NULL 0 1
ORACLE image BLOB NULL 0 1
ORACLE int NUMBER 10 3 1
ORACLE money NUMBER 19 3 1
ORACLE nchar NCHAR -1 4 1
ORACLE nchar NCLOB NULL 0 1
ORACLE ntext NCLOB NULL 0 1
ORACLE numeric NUMBER -1 3 1
ORACLE nvarchar NCLOB NULL 0 1
ORACLE nvarchar NVARCHAR2 -1 4 1
ORACLE nvarchar(max) NCLOB NULL 0 1
ORACLE real REAL NULL 0 1
ORACLE smalldatetime DATE NULL 0 1
ORACLE smallint NUMBER 5 3 1
ORACLE smallmoney NUMBER 10 3 1
ORACLE sysname NVARCHAR2 128 4 1
ORACLE text CLOB NULL 0 1
ORACLE timestamp RAW 8 4 1
ORACLE tinyint NUMBER 3 3 1
ORACLE uniqueidentifier CHAR 38 4 1
ORACLE varbinary BLOB NULL 0 1
ORACLE varbinary RAW -1 4 1
ORACLE varbinary(max) BLOB NULL 0 1
ORACLE varchar CLOB NULL 0 1
ORACLE varchar VARCHAR2 -1 4 1
ORACLE varchar(max) CLOB NULL 0 1
ORACLE xml NCLOB NULL 0 1
ORACLE bigint NUMBER 19 3 1
ORACLE binary BLOB NULL 0 1
ORACLE binary RAW -1 4 1
ORACLE bit NUMBER 1 3 1
ORACLE char CHAR -1 4 1
ORACLE char CLOB NULL 0 1
ORACLE char VARCHAR2 -1 4 1
ORACLE datetime DATE NULL 0 1
ORACLE decimal NUMBER -1 3 1
ORACLE double precision FLOAT NULL 0 1
ORACLE float FLOAT NULL 0 1
ORACLE image BLOB NULL 0 1
ORACLE int NUMBER 10 3 1
ORACLE money NUMBER 19 3 1
ORACLE nchar CHAR -1 4 1
ORACLE nchar CLOB NULL 0 1
ORACLE ntext CLOB NULL 0 1
ORACLE numeric NUMBER -1 3 1
ORACLE nvarchar CLOB NULL 0 1
ORACLE nvarchar VARCHAR2 -1 4 1
ORACLE nvarchar(max) CLOB NULL 0 1
ORACLE real REAL NULL 0 1
ORACLE smalldatetime DATE NULL 0 1
ORACLE smallint NUMBER 5 3 1
ORACLE smallmoney NUMBER 10 3 1
ORACLE sysname VARCHAR2 128 4 1
ORACLE text CLOB NULL 0 1
ORACLE timestamp RAW 8 4 1
ORACLE tinyint NUMBER 3 3 1
ORACLE uniqueidentifier CHAR 38 4 1
ORACLE varbinary BLOB NULL 0 1
ORACLE varbinary RAW -1 4 1
ORACLE varbinary(max) BLOB NULL 0 1
ORACLE varchar CLOB NULL 0 1
ORACLE varchar VARCHAR2 -1 4 1
ORACLE varchar(max) CLOB NULL 0 1
ORACLE xml CLOB NULL 0 1
ORACLE bigint NUMBER 19 3 1
ORACLE binary BLOB NULL 0 1
ORACLE binary RAW -1 4 1
ORACLE bit NUMBER 1 3 1
ORACLE char CHAR -1 4 1
ORACLE char CLOB NULL 0 1
ORACLE char VARCHAR2 -1 4 1
ORACLE datetime DATE NULL 0 1
ORACLE decimal NUMBER -1 3 1
ORACLE double precision FLOAT NULL 0 1
ORACLE float FLOAT NULL 0 1
ORACLE image BLOB NULL 0 1
ORACLE int NUMBER 10 3 1
ORACLE money NUMBER 19 3 1
ORACLE nchar NCHAR -1 4 1
ORACLE nchar NCLOB NULL 0 1
ORACLE ntext NCLOB NULL 0 1
ORACLE numeric NUMBER -1 3 1
ORACLE nvarchar NCLOB NULL 0 1
ORACLE nvarchar NVARCHAR2 -1 4 1
ORACLE nvarchar(max) NCLOB NULL 0 1
ORACLE real REAL NULL 0 1
ORACLE smalldatetime DATE NULL 0 1
ORACLE smallint NUMBER 5 3 1
ORACLE smallmoney NUMBER 10 3 1
ORACLE sysname NVARCHAR2 128 4 1
ORACLE text CLOB NULL 0 1
ORACLE timestamp RAW 8 4 1
ORACLE tinyint NUMBER 3 3 1
ORACLE uniqueidentifier CHAR 38 4 1
ORACLE varbinary BLOB NULL 0 1
ORACLE varbinary RAW -1 4 1
ORACLE varbinary(max) BLOB NULL 0 1
ORACLE varchar CLOB NULL 0 1
ORACLE varchar VARCHAR2 -1 4 1
ORACLE varchar(max) CLOB NULL 0 1
ORACLE xml NCLOB NULL 0 1
2.建立鏈接服務器。我們將Oracle系統作為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語句就是:
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 這里必須要大寫,如果是小寫的話會造成同步失敗。
