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 Transact
SQL 語言功能相似
但語法不同
各 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 DB
Microsoft 在 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 定義的表空間(可選)
兩個或多個在線重做日志
存檔的重做日志(可選)
各種其它文件(控制文件
Init
ora 等等)
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 吞吐量和磁盤並發性
將 text
ntext
image 列(大對象)從表中存儲到不同的文件上
把數據庫對象放在特定的磁盤上
備份和恢復文件組中單個表或一組表
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 Online
Windows 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 或 Transact
SQL(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 Manager
Transact
SQL sp_addumpdevice 存儲過程或相應的 SQL
DMO 命令創建的
盡管可以手動進行備份
但是
建議使用 SQL Server Enterprise Manager 和/或 Database Maintenance Plan Wizard 計劃定期備份或基於數據庫活動的備份
通過在完全數據庫備份(設備)中應用事務日志備份和/或差異備份
可以將數據庫恢復到某個時點
數據庫恢復使用備份中包含的信息來覆蓋數據
可以使用 SQL Server Enterprise Manager
Transact
SQL (RESTORE DATABASE) 或 SQL
DMO 進行恢復
正如可以關閉 Oracle 歸檔文件來覆蓋自動備份一樣
在 Microsoft SQL Server 中
db_owner 固定數據庫角色的成員可以在每次出現檢查點時
強制事務日志清除其內容
這一操作可以使用 SQL Server Enterprise Manager(在檢查點處截斷日志)
Transact
SQL(sp_dboption 存儲過程)或 SQL
DMO 來完成
Oracle SQL*Net 支持 Oracle 數據庫服務器及其客戶之間的網絡連接
它使用透明網絡底層 (TNS) 數據流協議進行通信
並允許用戶運行多個不同的網絡協議
而不必編寫專用的代碼
核心 Oracle 數據庫軟件產品並不包括 SQL*Net
有了 Microsoft SQL Server
Net
Libraries(網絡庫)通過使用表格格式數據流 (TDS) 協議
支持客戶和服務器之間的網絡連接
它們允許同時連接運行命名管道
TCP/IP 套接字或其它進程間通信 (IPC) 機制的客戶
SQL Server CD
ROM 包括所有的客戶 Net
Libraries
因此不需要再另行購買
SQL Server Net
Library 選項可在安裝後進行更改
客戶網絡實用工具為運行 Windows NT
Windows
或 Windows
操作系統的客戶配置默認的 Net
Library 和服務器連接信息
除非在 ODBC 數據源配置過程中更改
或在 ODBC 連接字符串中明確寫明
所有的 ODBC 客戶應用程序均使用相同的默認 Net
Library 和服務器連接信息
有關 Net
Libraries 的詳細信息
請參見 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_owner
db_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 腳本或程序入手
只要復制這個腳本或程序
並進行下列修改即可
每個更改均在本節的其它部分進行了討論
該例取自腳本示例程序腳本 Oratable
sql 和 Sstable
sql
確保數據庫對象標識符符合 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_DB
STUDENT_
ADMIN
STUDENT
其它架構
SELECT * FROM STUDENT_ADMIN
STUDENT
SELECT * FROM OTHER_DB
STUDENT_
ADMIN
STUDENT
以下是命名 Microsoft SQL Server 表和視圖的指導原則
使用數據庫名和用戶名是可選的
當只按名稱來引用表時(例如
STUDENT)
SQL Server 在當前數據庫的當前用戶帳戶中查找該表
如果沒有找到
它就會在該數據庫中查找保留用戶名 dbo 擁有的相同名稱的一個對象
在數據庫的用戶帳戶中
表名稱必須唯一
一個 SQL Server 登錄帳戶可在多個數據庫中擁有名稱相同的表
例如
ENDUSER
帳戶擁有下列數據庫對象
USER_DB
ENDUSER
STUDENT 和 OTHER_DB
ENDUSER
STUDENT
限定符是數據庫用戶名
而不是 SQL Server 登錄名
因為它們並不一定相同
同時
這些數據庫中的其他用戶可以擁有相同名稱的對象
USER_DB
DBO
STUDENT
USER_DB
DEPT_ADMIN
STUDENT
USER_DB
STUDENT_ADMIN
STUDENT
OTHER_DB
DBO
STUDENT
因此
建議把所有者名稱作為數據庫對象引用的一部分
如果應用程序有多個數據庫
建議把數據庫名稱也作為引用的一部分
如果查詢跨多個服務器
也將服務器名稱加到引用中
每個 SQL Server 連接都有一個當前的數據庫上下文
它是在登錄時使用 USE 語句設定的
例如
假定下列場景
一個用戶
使用 ENDUSER
帳戶
登錄到 USER_DB 數據庫
用戶請求 STUDENT 表
SQL Server 查找 ENDUSER
STUDENT 表
如果找到該表
則 SQL Server 在 USER_DB
ENDUSER
STUDENT 上執行請求的數據庫操作
如果在 ENDUSER
數據庫帳戶中沒有找到該表
SQL Server 則在此數據庫的 dbo 帳戶中查找 USER_DB
DBO
STUDENT
如果該表仍沒有找到
SQL Server 就會返回一個錯誤信息
指出該表不存在
如果另一個用戶
例如 DEPT_ADMIN
擁有這個表
表名稱前面一定加上數據庫用戶的名稱( DEPT_ADMIN
STUDENT)
否則
數據庫名稱默認為當前在上下文中的數據庫
如果引用的表在另一個數據庫中
該數據庫名稱必須用作引用的一部分
例如
在 OTHERDB 數據庫中
要訪問 ENDUSER
擁有的 STUDENT 表時
就要使用 OTHER_DB
ENDUSER
STUDENT
可用兩個英文句點將數據庫和表的名稱分隔開
省略對象的所有者名稱
例如
如果應用程序引用 STUDENT_DB
STUDENT
SQL Server 進行如下查詢
STUDENT_DB
current_user
STUDENT
STUDENT_DB
DBO
STUDENT
如果用戶一次只使用一個數據庫
在對象的引用中省略數據庫名稱
這樣
在其它數據庫中使用該應用程序就變得簡單了
所有對象引用隱式訪問當前使用的數據庫
如果在同一服務器上
要維護一個測試數據庫和一個生產數據庫
這是很有用的
因為 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_ADMIN
DEPT (
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_DB
DEPT_ADMIN
DEPT (
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