熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Oracle >> 正文

oracle到sqlserver的數據轉換資料

2013-11-13 16:11:35  來源: Oracle 

  Microsoft Corporation
  
  摘要本文是為希望將其應用程序轉為 Microsoft SQL Server 應用程序的 Oracle 應用程序開發人員所寫的文中講述了成功地進行轉換所需要的工具過程和技巧並突出強調了創建高性能高並發性 SQL Server 應用程序的基本設計原則
  
  本文的目標讀者應該具有
  
  堅實的 Oracle RDBMS 基礎知識背景
  全面的數據庫管理知識
  熟悉 Oracle SQL 和 PL/SQL 語言
  實際使用 C/C++ 編程語言的知識
  sysadmin 固定服務器角色的成員身份
  本文假定您熟悉與 Oracle RDBMS 有關的術語概念和工具有關 Oracle RDBMS 及其體系結構的詳細信息請參見 Oracle Server Concepts Manual(Oracle Server概念手冊)至於使用 Oracle 腳本和示例還假定您熟悉 Oracle Server Manager 和 Oracle SQL*Plus 工具有關這些工具的詳細信息請參見 Oracle 文檔
  
  目錄
  
  開發和應用程序平台
  概述
  本文組織結構
  體系結構和術語
  安裝和配置 Microsoft SQL Server
  定義數據庫對象
  實施數據完整性和業務規則
  事務鎖定和並發性
  死鎖
  SQL 語言支持
  游標的實現
  優化 SQL 語句
  使用 ODBC
  開發和管理數據庫復制
  遷移數據和應用程序
  數據庫示例
  
  開發和應用程序平台
  
  為了清楚和便於表述假定開發和應用程序平台是 Microsoft Visual Studio Microsoft Windows NT (Service Pack )SQL Server 和 Oracle Oracle 使用 Visigenic Software ODBC 驅動程序( 版)SQL Server 使用 Microsoft Corporation ODBC 驅動程序( 版)Microsoft SQL Server 包括用於 Oracle 的 OLE DB 驅動程序但在本章中不予詳細討論
  
  概述
  
  應用程序遷移過程似乎很復雜兩種 RDBMS 之間有很多體系結構方面的差異描述 Oracle 體系結構的詞匯和術語在 Microsoft SQL Server 中其含義常常完全不同此外Oracle 和 SQL Server 都有許多專有的 SQL 標准擴展
  
  從應用程序開發人員的角度來看Oracle 和 SQL Server 管理數據的方式是相似的但是Oracle 和 SQL Server 之間內部的差異是相當大的如果管理得當它對遷移應用程序造成的影響就會微乎其微
  
  開發人員面臨的最嚴峻遷移問題是SQL SQL 語言標准的實現和每種 RDBMS 提供的擴展一些開發人員只使用標准的 SQL 語言語句並傾向於使其程序代碼盡可能通用通常這意味著把程序代碼限定在初級 SQL 標准該標准在許多數據庫產品中均得到了一致的實現其中包括 Oracle 和 SQL Server
  
  這種方法可能給程序代碼帶來不必要的復雜性並顯著影響程序性能例如Oracle 的 DECODE 函數是 Oracle 特有的非標准 SQL 擴展Microsoft SQL Server 的 CASE 表達式已不止是初級 SQL 的擴展並未在所有的數據庫產品上實現
  
  如果不使用這兩個函數則可以編程方式實現其功能但可能需要從 RDBMS 檢索更多的數據
  
  此外SQL 語言的過程擴展也可能帶來困難Oracle PL/SQL 和 SQL Server TransactSQL 語言功能相似但語法不同各 RDBMS 及其過程擴展之間不存在精確的對等關系因此您可能會放棄使用存儲程序例如過程和觸發器這是令人遺憾的因為這些程序能夠提供極好的性能和安全性而這些用任何其它方式均無法實現
  
  使用專用的開發接口也會帶來其它的問題使用 Oracle OCI(Oracle 調用接口)轉換程序通常需要大量的資源投入當開發的應用程序可能使用多個 RDBMS 時應考慮使用開放式數據庫連接 (ODBC) 接口
  
  ODBC 是專為使用多種數據庫管理系統而設計的ODBC 提供一致的應用程序編程接口 (API)它通過數據庫特有驅動程序的服務與不同的數據庫一同工作
  
  一致的 API 是指不論程序與 Oracle 還是與 SQL Server 交互它在建立連接執行命令和檢索結果時所調用的函數是相同的
  
  ODBC 還定義了一個標准調用級接口並使用標准轉義序列指定執行公用任務的 SQL 函數但該函數在不同的數據庫中語法不同不需要修改任何程序代碼ODBC 驅動程序就可以自動地把 ODBC 語法轉換成原本的 Oracle 或 Microsoft SQL Server SQL 語法在某些情況中最好的方法是編寫一個程序使 ODBC 在運行時進行轉換
  
  ODBC 並不是一個神奇的解決方案不能對所有的數據庫均實現完全的數據庫獨立性完備的功能以及較高的性能不同的數據庫和第三方廠商提供不同級別的 ODBC 支持一些驅動程序只實現了映射在其它接口庫頂層的核心 API 函數其它驅動程序例如 Microsoft SQL Server 驅動程序在原本的高性能的驅動程序中提供全面的級別 支持
  
  如果程序只使用核心 ODBC API它可能放棄了一些數據庫帶有的功能和性能再者並不是所有原本的 SQL 擴展都可以用 ODBC 轉義序列表示例如 Oracle DECODE 和 SQL Server CASE 表達式就是這樣
  
  此外通過編寫 SQL 語句使用數據庫優化程序也是通常的做法在 Oracle 中用來提高性能的技巧和方法在 SQL Server 中並不一定最好ODBC 接口無法將技巧從一個 RDBMS 轉化到另一個 RDBMS 中
  
  ODBC 並不禁止應用程序使用數據庫特有的功能也不禁止優化性能但是應用程序需要一些數據庫特有的代碼部分有了 ODBC要使程序結構和絕大部分程序代碼在多個數據庫上保持一致就變得十分簡單
  
  OLE DB 是下一代的數據訪問技術Microsoft SQL Server 利用了 SQL Server 自身組件中的 OLE DB此外應用程序開發人員在 SQL Server 新的開發過程中應考慮使用 OLE DBMicrosoft 在 SQL Server 中加入了用於 Oracle 的 OLE DB 提供程序
  
  OLE DB 是 Microsoft 的一個戰略性系統級編程接口用於管理整個組織內的數據OLE DB 是建立在 ODBC 功能之上的一個開放規范ODBC 是為訪問關系型數據庫而專門開發的OLE DB 則用於訪問關系型和非關系型信息源例如主機 ISAM/VSAM 和層次數據庫電子郵件和文件系統存儲文本圖形和地理數據以及自定義業務對象
  
  OLE DB 定義了一組 COM 接口對各種數據庫管理系統服務進行封裝並允許創建軟件組件實現這些服務OLE DB 組件包括數據提供程序(包含和表現數據)數據使用者(使用數據)和服務組件(處理和傳送數據例如查詢處理器和游標引擎)
  
  OLE DB 接口有助於平滑地集成組件這樣OLE DB 組件廠商就可以快速地向市場提供高質量 OLE DB 組件此外OLE DB 包含了一個連接 ODBC 的橋梁對現用的各種 ODBC 關系型數據庫驅動程序提供一貫的支持
  
  本文組織結構
  
  為了幫助您實現從 Oracle 向 SQL Server 的逐步遷移每節都包括一個 Oracle 和 Microsoft SQL 之間相關差異的概述此外還包括轉換時要考慮的因素SQL Server 的優勢以及多個示例
  
  體系結構和術語
  
  要成功地遷移開始之前應該了解與 Microsoft SQL Server 有關的基礎體系結構和術語本節中的許多例子均取自 Oracle 和 SQL Server 應用程序示例(附在文中)
  
  在 Oracle 中數據庫指整個 Oracle RDBMS 環境並包括以下組件
  
  Oracle 數據庫進程和緩沖區(實例)
  包含一個集中系統編錄的 SYSTEM 表空間
  其它由 DBA 定義的表空間(可選)
  兩個或多個在線重做日志
  存檔的重做日志(可選)
  各種其它文件(控制文件Initora 等等)
  
  Microsoft SQL Server 數據庫從邏輯上將數據應用程序和安全機制分離這一點與表空間非常相似Oracle 支持多個表空間SQL Server 則支持多個數據庫表空間還可用於支持數據的物理存放SQL Server 使用文件組提供相同的功能
  
  Microsoft SQL Server 還默認安裝下列數據庫
  
  model 數據庫是所有新創建的用戶數據庫的模板
  tempdb 數據庫與 Oracle 臨時表空間相似它用於臨時工作存儲和排序操作與 Oracle 臨時表空間不同的是用戶可以創建臨時表並在用戶注銷時自動刪除
  msdb 支持 SQL Server 代理及其計劃的作業警報和復制信息
  pubs 和 Northwind 數據庫作為培訓示例數據庫提供
  有關默認數據庫的詳細信息請參見 SQL Server Books Online
  
  每個 Oracle 數據庫均在一個集中系統編錄或數據字典上運行它駐留在 SYSTEM 表空間中每個 Microsoft SQL Server 數據庫均維護其自身的系統編錄它包含下列信息
  
  數據庫對象(表索引存儲過程視圖觸發器等等)
  約束
  用戶和權限
  用戶定義的數據類型
  復制定義
  數據庫使用的文件
  
  在 master 數據庫中SQL Server 還加入了一個集中系統編錄它包括系統編錄以及有關每個數據庫的一些信息
  
  數據庫名稱和每個數據庫的主文件位置
  SQL Server 登錄帳戶
  系統消息
  數據庫配置值
  遠程和/或鏈接的服務器
  當前活動信息
  系統存儲過程
  
  與 Oracle 中的 SYSTEM 表空間一樣要訪問任何其它數據庫SQL Server master 數據庫必須可用因此當 master 數據庫做重大修改後應對該數據庫進行備份以防止數據庫出現故障這一點非常重要數據庫管理員也可以鏡像構成 master 數據庫的文件
  
  Oracle RDBMS 由表空間組成而表空間又是由數據文件組成的表空間數據文件被格式化為稱為的內部單元塊的大小是 DBA 在 Oracle 數據庫首次創建時設定的其范圍從 字節在 Oracle 表空間中創建一個對象時用戶用稱為擴展盤區的單位定義其大小(初始擴展盤區下一擴展盤區最小擴展盤區和最大擴展盤區)Oracle 擴展盤區大小是可變的但必須包括至少五個連續的塊
  
  在數據庫一級中Microsoft SQL Server 使用文件組來控制表和索引的物理存儲文件組是一個或多個文件的邏輯容器文件組中包含的數據按比例填充到所有屬於該組的文件中
  
  如果沒有定義和使用文件組數據庫對象就會被放在一個默認文件組中該文件組是數據庫創建過程中隱式定義的文件組允許
  
  把大型表分布在多個文件上以提高 I/O 吞吐量
  把索引存儲在不同的文件上而不是它們各自的表上從而進一步提高了 I/O 吞吐量和磁盤並發性
  將 textntextimage 列(大對象)從表中存儲到不同的文件上
  把數據庫對象放在特定的磁盤上
  備份和恢復文件組中單個表或一組表
  
  SQL Server 將文件格式化為稱為的內部單元頁大小是固定的 字節 ( KB)擴展盤區由頁組成其大小也是固定的 個連續的頁組成在 SQL Server 數據庫中創建表或索引時會自動給其分配一個頁與分配一個整個擴展盤區相比它可更有效地存儲較小的表和索引
  
  對於大多數 Microsoft SQL Server 安裝來說不需要 Oracle 類型的段相反SQL Server 可以使用基於硬件的 RAID 或基於 Windows NT 軟件的 RAID更好地分布數據或將數據條帶化基於 Windows NT 軟件的 RAID 或基於硬件的 RAID 可以設定條帶集它包括多個磁盤驅動器看起來就像一個邏輯驅動器一樣如果數據庫文件在此條帶集上創建磁盤子系統就負責把 I/O 負載分布到多個磁盤上建議管理員使用 RAID把數據分布到多個物理磁盤上
  
  SQL Server 推薦的 RAID 配置是 RAID (鏡像)或 RAID (帶有一個額外的奇偶校驗驅動器的條帶集用作冗余)也建議使用 RAID (帶有奇偶校驗的條帶集的鏡像)但是它比前兩種配置昂貴得多條帶集非常適於分布數據庫文件上常常隨機產生的 I/O
  
  如果不能選擇 RAID文件組則是一個有吸引力的替代選擇它提供與 RAID 相同的一些優點此外對於可能跨越多個物理 RAID 陣列的大型數據庫文件組是一個很吸引人的方法它以一種可控的方式將 I/O 進一步分布到多個 RAID 陣列上
  
  對於有序 I/O必須優化事務日志文件並加以保存防止單點失敗因此對於事務日志建議使用 RAID (鏡像)這個驅動器的大小至少要和聯機重做日志和回滾段表空間的總計大小一樣應創建一個或多個日志文件來占用該邏輯驅動器上定義的所有空間與存儲在文件組中的數據不同事務日志項目總是按順序地寫入並且不是按比例填充的
  
  有關 RAID 的詳細信息請參見 SQL Server Books OnlineWindows NT Server 文檔和 Microsoft Windows NT 資源工具包
  
  每次啟動時Oracle RDBMS 執行自動恢復它檢驗表空間文件的內容是否與聯機重做日志文件一致如果不一致Oracle 將聯機重做日志文件內容應用到表空間文件(前滾)並刪除回滾段中發現的任何未提交的事務(回滾)如果 Oracle 不能從聯機重做日志文件中得到它所需要的信息它就會查詢存檔重做日志文件
  
  每次啟動時Microsoft SQL Server 還通過檢查系統中的每個數據庫進行自動數據恢復它首先檢查 master 數據庫然後啟動恢復系統中所有其它數據庫的線程對於每個 SQL Server 數據庫自動恢復機制均檢查事務日志如果事務日志包含任何未提交的事務該事務被回滾然後恢復機制在事務日志中查找已提交但還未寫到數據庫的事務如果找到再次執行這些事務前滾
  
  每個 SQL Server 事務日志均有 Oracle 回滾段與 Oracle 聯機重做日志的組合功能每個數據庫都有自已的事務日志它記錄了對數據庫所作的全部更改並且由數據庫的所有用戶共享當一個事務開始且發生數據修改時就會在日志中記錄一個 BEGIN TRANSACTION 事件(以及修改事件)在自動故障恢復過程中這個事件用於確定事務的起始點在收到每個數據修改語句時先將更改寫入事務日志然後再寫入數據庫有關詳細信息請參見本章後面的事務鎖定和並發性一節
  
  SQL Server 有一個自動檢查點機制確保完成的事務被定期地從 SQL Server 磁盤緩存寫入事務日志文件檢查點功能將自上一個檢查點之後修改過的任何已被緩存的頁面寫入數據庫在數據庫上對這些被緩存過的頁面(稱為髒頁)標出檢查點以確保所有完成的事務均被寫到磁盤中這個過程縮短了從系統故障(如停電)進行恢復所用的時間通過使用 SQL Server Enterprise Manager 或 TransactSQL(sp_configure 系統存儲過程)修改恢復間隔設置可對此設置進行修改
  
  Microsoft SQL Server 給備份數據提供了以下幾個選項
  
  完全數據庫備份
  
  要進行完全數據庫備份請使用 BACKUP DATABASE 語句或備份向導
  
  差異備份
  
  當完成完全數據庫備份後使用 BACKUP DATABASE WITH DIFFERENTIAL 語句或備份向導只定期備份更改的數據和索引頁
  
  事務日志備份
  
  Microsoft SQL Server 中的事務日志與各自數據庫關聯在備份或被截斷之前事務日志都是不斷填充的SQL Server 的默認配置是事務日志自動增長直到用盡了所有磁盤空間或達到最大配置尺寸為止當事務日志變得太滿它就會產生一個錯誤並且在備份或截斷之前禁止對數據進一步修改其它數據庫不受影響可以使用 BACKUP LOG 或備份向導備份事務日志
  
  文件或文件組備份
  
  SQL Server 可以備份文件或文件組有關詳細信息請參見 SQL Server Books Online
  
  可以在數據庫使用過程中對它進行備份這樣就可以對必須連續運行的系統進行備份SQL Server 的備份處理和內部數據結構已進行了改進這樣可將備份的數據傳輸率提高到最大同時對事務吞吐量的影響降至最小
  
  Oracle 和 SQL Server 均需要特定的日志文件格式在 SQL Server 中這些文件稱為備份設備它們是使用 SQL Server Enterprise ManagerTransactSQL sp_addumpdevice 存儲過程或相應的 SQLDMO 命令創建的
  
  盡管可以手動進行備份但是建議使用 SQL Server Enterprise Manager 和/或 Database Maintenance Plan Wizard 計劃定期備份或基於數據庫活動的備份
  
  通過在完全數據庫備份(設備)中應用事務日志備份和/或差異備份可以將數據庫恢復到某個時點數據庫恢復使用備份中包含的信息來覆蓋數據可以使用 SQL Server Enterprise ManagerTransactSQL (RESTORE DATABASE) 或 SQLDMO 進行恢復
  
  正如可以關閉 Oracle 歸檔文件來覆蓋自動備份一樣在 Microsoft SQL Server 中db_owner 固定數據庫角色的成員可以在每次出現檢查點時強制事務日志清除其內容這一操作可以使用 SQL Server Enterprise Manager(在檢查點處截斷日志)TransactSQL(sp_dboption 存儲過程)或 SQLDMO 來完成
  
  Oracle SQL*Net 支持 Oracle 數據庫服務器及其客戶之間的網絡連接它使用透明網絡底層 (TNS) 數據流協議進行通信並允許用戶運行多個不同的網絡協議而不必編寫專用的代碼核心 Oracle 數據庫軟件產品並不包括 SQL*Net
  
  有了 Microsoft SQL ServerNetLibraries(網絡庫)通過使用表格格式數據流 (TDS) 協議支持客戶和服務器之間的網絡連接它們允許同時連接運行命名管道TCP/IP 套接字或其它進程間通信 (IPC) 機制的客戶SQL Server CDROM 包括所有的客戶 NetLibraries因此不需要再另行購買
  
  SQL Server NetLibrary 選項可在安裝後進行更改客戶網絡實用工具為運行 Windows NTWindows 或 Windows 操作系統的客戶配置默認的 NetLibrary 和服務器連接信息除非在 ODBC 數據源配置過程中更改或在 ODBC 連接字符串中明確寫明所有的 ODBC 客戶應用程序均使用相同的默認 NetLibrary 和服務器連接信息有關 NetLibraries 的詳細信息請參見 SQL Server Books Online
  
  要將 Oracle 應用程序完全遷移到 Microsoft SQL Server 必須了解 SQL Server 數據庫安全性和角色的實現
  
  登錄帳戶
  
  登錄帳戶允許用戶訪問 SQL Server 數據或管理選項登錄帳戶只允許用戶登錄到 SQL Server並查看允許 guest(來賓)訪問的數據庫(guest 帳戶不是默認建立的必須單獨創建
  
  SQL Server 提供兩種類型的登錄安全性Windows NT 身份驗證模式(也稱為集成模式)和 SQL Server 身份驗證模式(也稱為標准模式)SQL Server 也支持標准和集成安全的組合稱為混合模式
  
  驗證登錄連接時Windows NT 身份驗證模式使用 Windows NT 內的安全機制並且依賴用戶的 Windows NT 安全憑據用戶不需要輸入 SQL Server 的登錄 ID 或密碼 他們的登錄信息直接從網絡連接中獲取此時一個條目被寫入 syslogin 表並在 Windows NT 和 SQL Server 之間進行驗證這稱為一個信任連接就像兩個 Windows NT 服務器之間的信任關系一樣它與 Oracle 用戶帳戶相關的 IDENTIFIED EXTERNALLY 選項作用相似
  
  SQL Server 身份驗證模式要求用戶在請求訪問 SQL Server 時輸入登錄 ID 和密碼這稱為非信任連接它與 Oracle 用戶帳戶相關的 IDENTIFIED BY PASSWORD 選項作用類似使用標准安全模型登錄過程只提供對 SQL Server 數據庫引擎的訪問而不提供對用戶數據庫的訪問
  
  有關這些安全機制的詳細信息請參見 SQL Server Books Online
  
  角色和權限
  
  Microsoft SQL Server 和 Oracle 均使用權限來實施數據庫安全性SQL Server 語句級權限用於限制創建新的數據庫對象(類似於 Oracle 系統級權限)
  
  SQL Server 還提供對象級權限與 Oracle 一樣對象級所有權被授予對象的創建者並且不能被轉讓在其他數據庫用戶訪問對象前必須給他們授予對象級權限sysadmin 固定服務器角色db_owner 固定數據庫角色或 db_securityadmin 固定數據庫角色的成員也可以將一個用戶對象上的權限授予其他用戶
  
  可以將 SQL Server 語句級和對象級權限直接授予數據庫用戶帳戶而管理數據庫角色的權限通常要簡單得多SQL Server 角色用於授予或撤銷一組數據庫用戶的權限(與 Oracle 角色非常相似)角色是與特定數據庫相關的數據庫對象對於每種安裝均有相關的專有固定服務器角色可用於整個數據庫固定服務器角色的一個例子是 sysadmin當 SQL Server 登錄時可以添增 Windows NT 組或數據庫用戶可以給 Windows NT 組或 Windows NT 用戶授予權限
  
  數據庫可以有任意數量的角色或 Windows NT 組在每個數據庫中均可找到默認角色 public並且該角色不能被刪除public 角色和 Oracle 中 PUBLIC 帳戶的作用相似每個數據庫用戶始終是 public 角色的一個成員除了 public 角色之外數據庫用戶還可以是任何數量角色的成員Windows NT 用戶和組也可以是任何數量角色的成員並且始終是 public 角色的成員
  
  數據庫用戶和 guest 帳戶
  
  在 Microsoft SQL Server 中要使用數據庫及其對象用戶登錄帳戶必須被授權登錄帳戶可以使用下列方法訪問數據庫
  
  登錄帳戶可被指定為數據庫用戶
  
  登錄帳戶可使用數據庫中的 guest 帳戶
  
  可以將 Windows NT 組登錄映射為一個數據庫角色然後作為該組成員的各 Windows NT 帳戶可以連接到該數據庫
  
  db_ownerdb_accessadmin 角色或 sysadmin 固定服務器角色的成員創建數據庫用戶帳戶角色帳戶可以包括以下幾個參數SQL Server 登錄 ID數據庫用戶名(可選)和最多一個角色名(可選)數據庫用戶名不需和用戶的登錄 ID 相同如果沒有提供數據庫用戶名則用戶的登錄 ID 和數據庫用戶名是相同的如果沒有提供角色名則數據庫用戶只是 public 角色的成員創建數據庫用戶之後可根據需要賦予該用戶相應的角色
  
  db_owner 或 db_accessadmin 角色的成員還可以創建 guest 帳戶guest 帳戶允許任何有效的 SQL Server 登錄帳戶訪問數據庫即便沒有數據庫用戶帳戶也可以默認情況下guest 帳戶繼承授予 public 角色的任何權限但是這些權限可以更改使其高於或低於 public 角色的權限
  
  與 SQL Server 登錄一樣Windows NT 用戶帳戶或組帳戶可被授權訪問數據庫當作為組成員的 Windows NT 用戶連接到該數據庫時此用戶就獲得授予 Windows NT 組的權限如果他是多個 Windows NT 組(已授權訪問數據庫)的成員則該用戶可收到所有這些組的組合權限
  
  sysadmin 角色
  
  Microsoft SQL Server sysadmin 固定服務器角色成員的權限與 Oracle DBA 的權限相似在 SQL Server 默認情況下sa SQL Server 身份驗證模式登錄帳戶是該角色的成員這就如同當 SQL Server 安裝在 Windows NT 計算機上它就是本地 Administrators 組成員一樣 sysadmin 角色的成員可以添加或刪除 Windows NT 用戶和組以及 SQL Server 登錄該角色的成員通常有下列職責
  
  安裝 SQL Server
  配置服務器和客戶
  創建數據庫*
  設置登錄權限和用戶權限*
  向 SQL Server 數據庫導入數據和從中導出數據*
  備份和恢復數據庫*
  實現和維護復制
  計劃無值守操作*
  監視和優化 SQL Server 性能*
  分析系統問題
  *這些項目可以委派給其他安全角色或用戶
  
  在 SQL Server 沒有對 sysadmin 固定服務器角色成員的權限進行限制因此該角色的成員可以訪問 SQL Server 特定實例上的任何數據庫及其所有對象(包括數據)與 Oracle DBA 一樣有一些命令和系統過程只有 sysadmin 角色的成員可以使用
  
  db_owner 角色
  
  盡管在使用上Microsoft SQL Server 數據庫與 Oracle 表空間類似但各個的管理方式不同每個 SQL Server 數據庫都是一個自包含的管理域每個數據庫均被指派一個數據庫所有者 (dbo)該用戶始終是 db_owner 固定數據庫角色的一個成員其他用戶也可以是 db_owner 角色的成員作為該角色成員的任何用戶都有能力管理與其數據庫有關的管理任務(Oracle 則不同一個 DBA 可管理所有表空間的管理任務)這些任務包括
  
  管理數據庫訪問
  更改數據庫選項(只讀單用戶等等)
  備份和恢復數據庫內容
  授予和撤銷數據庫權限
  創建和刪除數據庫對象
  
  db_owner 角色的成員在其數據庫中具有所有權限授予該角色的大多數權限可以分給幾個固定數據庫角色或被授予數據庫用戶要在數據庫中擁有 db_owner 權限不需要有服務器范圍內的 sysadmin 權限
  
  安裝和配置 Microsoft SQL Server
  
  搞清了 Oracle 和 SQL Server 之間基本的結構差異之後就可以開始進行遷移過程的第一步應使用 SQL Server 查詢分析器運行以下腳本
  
  使用基於 Windows NT 軟件的 RAID 或基於硬件的 RAID 創建一個可容納所有數據的邏輯驅動器通過計算 Oracle 系統臨時表空間和應用程序表空間所使用的全部文件空間來預估空間大小
  使用基於 Windows NT 軟件的 RAID 或基於硬件的 RAID 來創建用於存放事務日志的第二個邏輯驅動器此驅動器大小應至少和聯機重做與回滾段表空間之和一樣大
  使用 SQL Server Enterprise Manager創建一個與 Oracle 應用程序表空間名稱相同的數據庫(示例應用程序使用的數據庫名稱為 USER_DB)將數據和事務日志的文件位置分別指定為步驟 創建的磁盤如果使用多個 Oracle 表空間不必甚至不建議創建多個 SQL Server 數據庫RAID 會為您分布數據
  創建 SQL Server 登錄帳戶
  USE MASTER
  EXEC SP_ADDLOGIN STUDENT_ADMIN STUDENT_ADMIN
  EXEC SP_ADDLOGIN DEPT_ADMIN DEPT_ADMIN
  EXEC SP_ADDLOGIN ENDUSER ENDUSER
  GO
  
  向數據庫中添加角色
  USE USER_DB
  EXEC SP_ADDROLE DATA_ADMIN
  EXEC SP_ADDROLE USER_LOGON
  GO
  
  給角色授予權限
  GRANT CREATE TABLE CREATE TRIGGER CREATE VIEW
  CREATE PROCEDURE TO DATA_ADMIN
  GO
  
  把登錄帳戶添加為數據庫用戶帳戶
  EXEC SP_ADDUSER ENDUSER ENDUSER USER_LOGON
  EXEC SP_ADDUSER DEPT_ADMIN DEPT_ADMIN DATA_ADMIN
  EXEC SP_ADDUSER STUDENT_ADMIN STUDENT_ADMIN DATA_ADMIN
  GO
  
  此插圖給出了此步驟完成後的 SQL Server 和 Oracle 環境
  
  定義數據庫對象
  
  Oracle 數據庫對象(表視圖和索引)可以很方便地遷移到 Microsoft SQL Server因為每種 RDBMS 都嚴格遵循 SQL 標准該標准是一個關於對象定義的標准將 Oracle SQL 表索引和視圖定義轉換為 SQL Server 表索引和視圖定義只需要進行相對簡單的語法更改即可下表著重闡述了Oracle 和 Microsoft SQL Server 數據庫對象之間的一些差異 類別
  Microsoft SQL Server
  Oracle
  
  列數
  
  
  
  
  
  行大小
  
   字節 字節指向每個 text 或 image 列
  
  沒有限制(但每行只允許一個 long 或 long raw)
  
  最大行數
  
  沒有限制
  
  沒有限制
  
  BLOB 類型存儲
  
  和行一起存儲的 字節指針數據存儲在其它數據頁上
  
  每表一個 long 或 long raw必須在行尾數據存儲在與行相同的塊上
  
  聚集的表索引
  
  每表一個
  
  每表一個(索引組織的表)
  
  非聚集的表索引
  
  每表
  
  沒有限制
  
  單索引中索引的最大列數
  
  
  
  
  
  索引中列值的最大長度
  
   字節
  
  /
  
  表命名規則
  
  [[[server]database]owner]
  table_name
  
  [schema]table_name
  
  視圖命名規則
  
  [[[server]database]owner]
  table_name
  
  [schema]table_name
  
  索引命名規則
  
  [[[server]database]owner]
  table_name
  
  [schema]table_name
  
  假定您從用來創建數據庫對象的 Oracle SQL 腳本或程序入手只要復制這個腳本或程序並進行下列修改即可每個更改均在本節的其它部分進行了討論該例取自腳本示例程序腳本 Oratablesql 和 Sstablesql
  
  確保數據庫對象標識符符合 Microsoft SQL Server 命名規則可能只需要更改索引名稱
  
  修改數據存儲參數使之用於 SQL Server如果使用 RAID則不需要存儲參數
  
  修改 Oracle 約束定義使之用於 SQL如有必要則創建觸發器以支持外鍵 DELETE CASCADE 語句如果表跨幾個數據庫則使用觸發器強制外鍵關系
  
  修改 CREATE INDEX 語句以使用聚集索引
  
  使用數據轉換服務創建新的 CREATE TABLE 語句檢查該語句注意 Oracle 數據類型與 SQL Server 數據類型是如何對應的
  
  刪除所有 CREATE SEQUENCE 語句在 CREATE TABLE 或 ALTER TABLE 語句中使用標識符列替代序列的使用
  
  如有必要修改 CREATE VIEW 語句
  
  刪除任何對同義詞的引用
  
  評估 Microsoft SQL Server 臨時表的使用及其在應用程序中的用途
  
  把 Oracle 的所有 CREATE TABLEUAS SELECT 命令改成 SQL Server 的 SELECTUINTO 語句
  
  評估用戶定義的規則數據類型和默認值的潛在用途
  
  下面圖表比較了Oracle 和 Microsoft SQL Server 處理對象標識符的方式在大多數情況下向 SQL Server 遷移時不需要更改對象名稱 Oracle
  Microsoft SQL Server
  
   個字符長
  數據庫名稱最多 個字符長
  數據庫鏈接名稱最多 個字符長
  
   個 Unicode 字符長
  臨時表名稱最多 個字符長
  
  標識符名稱必須以字母開頭並包含字母數字字符或 _$和 # 字符
  
  標識符名稱可以以字母數字字符或 _ 開頭並且幾乎可包含任何字符
  
  如果標識符以空格開始並包含除 _@# 或 $ 以外的字符則必須使用 [](分隔符)將標識符名稱括起來
  
  如果對象開始字符是
  
  @ 它是一個局部變量
  # 它是一個局部臨時對象
  ## 它是一個全局臨時對象
  
  表空間名稱必須唯一
  
  數據庫名稱必須唯一
  
  在用戶帳戶(架構)中標識符名稱必須是唯一的
  
  在數據庫用戶帳戶中標識符名稱必須是唯一的
  
  在表或視圖中列名必須是唯一的
  
  在表或視圖中列名必須是唯一的
  
  在用戶架構中索引名稱必須是唯一的
  
  在數據庫表名稱中索引名稱必須是唯一的
  
  當訪問 Oracle 用戶帳戶中的表時僅按其不合格的名稱來選定它訪問其它 Oracle 架構中的表時在表名稱前加上架構名稱和一個英文句點 ()Oracle 同義詞可提供其它的位置透明性
  
  當 Microsoft SQL Server 引用表時使用了另一套命名規則因為 SQL Server 登錄帳戶可以在多個數據庫中使用同一名稱創建表所以可使用下列規則訪問表和視圖[[database_name]owner_name]table_name 訪問以下項中的表
  Oracle
  Microsoft SQL Server
  
  用戶帳戶
  
  SELECT *
  FROM STUDENT
  
  SELECT * FROM USER_DBSTUDENT_
  ADMINSTUDENT
  
  其它架構
  
  SELECT * FROM STUDENT_ADMINSTUDENT
  
  SELECT * FROM OTHER_DBSTUDENT_
  ADMINSTUDENT
  
  以下是命名 Microsoft SQL Server 表和視圖的指導原則
  
  使用數據庫名和用戶名是可選的當只按名稱來引用表時(例如STUDENT)SQL Server 在當前數據庫的當前用戶帳戶中查找該表如果沒有找到它就會在該數據庫中查找保留用戶名 dbo 擁有的相同名稱的一個對象在數據庫的用戶帳戶中表名稱必須唯一
  
  一個 SQL Server 登錄帳戶可在多個數據庫中擁有名稱相同的表例如ENDUSER 帳戶擁有下列數據庫對象USER_DBENDUSERSTUDENT 和 OTHER_DBENDUSERSTUDENT限定符是數據庫用戶名而不是 SQL Server 登錄名因為它們並不一定相同
  
  同時這些數據庫中的其他用戶可以擁有相同名稱的對象
  
  USER_DBDBOSTUDENT
  USER_DBDEPT_ADMINSTUDENT
  USER_DBSTUDENT_ADMINSTUDENT
  OTHER_DBDBOSTUDENT
  
  因此建議把所有者名稱作為數據庫對象引用的一部分如果應用程序有多個數據庫建議把數據庫名稱也作為引用的一部分如果查詢跨多個服務器也將服務器名稱加到引用中
  
  每個 SQL Server 連接都有一個當前的數據庫上下文它是在登錄時使用 USE 語句設定的例如假定下列場景
  
  一個用戶使用 ENDUSER 帳戶登錄到 USER_DB 數據庫用戶請求 STUDENT 表SQL Server 查找 ENDUSERSTUDENT 表如果找到該表則 SQL Server 在 USER_DBENDUSERSTUDENT 上執行請求的數據庫操作如果在 ENDUSER 數據庫帳戶中沒有找到該表SQL Server 則在此數據庫的 dbo 帳戶中查找 USER_DBDBOSTUDENT如果該表仍沒有找到SQL Server 就會返回一個錯誤信息指出該表不存在
  
  如果另一個用戶例如 DEPT_ADMIN擁有這個表表名稱前面一定加上數據庫用戶的名稱( DEPT_ADMINSTUDENT)否則數據庫名稱默認為當前在上下文中的數據庫
  
  如果引用的表在另一個數據庫中該數據庫名稱必須用作引用的一部分例如在 OTHERDB 數據庫中要訪問 ENDUSER 擁有的 STUDENT 表時就要使用 OTHER_DBENDUSERSTUDENT
  
  可用兩個英文句點將數據庫和表的名稱分隔開省略對象的所有者名稱例如如果應用程序引用 STUDENT_DBSTUDENTSQL Server 進行如下查詢
  
  STUDENT_DBcurrent_userSTUDENT
  STUDENT_DBDBOSTUDENT
  
  如果用戶一次只使用一個數據庫在對象的引用中省略數據庫名稱這樣在其它數據庫中使用該應用程序就變得簡單了所有對象引用隱式訪問當前使用的數據庫如果在同一服務器上要維護一個測試數據庫和一個生產數據庫這是很有用的
  
  因為 Oracle 和 SQL Server 均支持標識 RDBMS 對象的 SQL 初級規則所以CREATE TABLE 語法是相似的 Oracle
  Microsoft SQL Server
  
  CREATE TABLE
  [schema]table_name
  (
  {col_name column_properties
  [default_expression] [constraint [constraint
  [nstraint]]]| [[] constraint]}
  [[] {next_col_name | next_constraint}]
  )
  [Oracle Specific Data Storage Parameters]
  
  CREATE TABLE [server][database][owner] table_name
  (
  {col_name column_properties[constraint
  [constraint [nstraint]]]| [[] constraint]}
  [[] {next_col_name | next_constraint}]
  )
  [ON filegroup_name]
  
  Oracle 數據庫對象名稱不區分大小寫在 Microsoft SQL Server 中取決所選的安裝選項數據庫對象名可以是區分大小寫的
  
  SQL Server 第一次安裝時默認的排序次序是字典順序不區分大小寫(可以使用 SQL Server 安裝程序設定不同的配置)因為 Oracle 對象名稱始終是唯一的所以把數據庫對象遷移到 SQL Server不應有任何問題建議在 Oracle 和 SQL Server 中所有的表和列名都使用大寫以避免用戶在區分大小寫的 SQL Server 上安裝時出現問題
  
  有了 Microsoft SQL Server使用 RAID 通常可簡化數據庫對象的存放與 Oracle 索引組織的表一樣SQL Server 聚集索引被集成到表的結構中 Oracle
  Microsoft SQL Server
  
  CREATE TABLE DEPT_ADMINDEPT (
  DEPT VARCHAR() NOT NULL
  DNAME VARCHAR() NOT NULL
  CONSTRAINT DEPT_DEPT_PK
  PRIMARY KEY (DEPT)
  USING INDEX TABLESPACE USER_DATA
  PCTFREE STORAGE (INITIAL K NEXT K
  MINEXTENTS MAXEXTENTS UNLIMITED)
  CONSTRAINT DEPT_DNAME_UNIQUE
  UNIQUE (DNAME)
  USING INDEX TABLESPACE USER_DATA
  PCTFREE STORAGE (INITIAL K NEXT K
  MINEXTENTS MAXEXTENTS UNLIMITED)
  )
  PCTFREE PCTUSED
  TABLESPACE USER_DATA
  STORAGE (INITIAL K NEXT K
  MINEXTENTS MAXEXTENTS UNLIMITED
  FREELISTS )
  
  CREATE TABLE USER_DBDEPT_ADMINDEPT (
  DEPT VARCHAR() NOT NULL
  DNAME VARCHAR() NOT NULL
  CONSTRAINT DEPT_DEPT_PK
  PRIMARY KEY CLUSTERED (DEPT)
  CONSTRAINT DEPT_DNAME_UNIQUE
  UNIQUE NONCLUSTERED (DNAME)
  )
From:http://tw.wingwit.com/Article/program/Oracle/201311/17953.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.