国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數據庫 > Oracle > 正文

oracle到sqlserver的數據轉換資料

2024-08-29 13:37:13
字體:
來源:轉載
供稿:網友

  Microsoft Corporation
  
  摘要:本文是為希望將其應用程序轉為 Microsoft SQL Server 應用程序的 Oracle 應用程序開發人員所寫的。文中講述了成功地進行轉換所需要的工具、過程和技巧。并突出強調了創建高性能、高并發性 SQL Server 應用程序的基本設計原則。
  
  本文的目標讀者應該具有:
  
  堅實的 Oracle RDBMS 基礎知識背景。
  全面的數據庫治理知識。
  熟悉 Oracle SQL 和 PL/SQL 語言。
  實際使用 C/C++ 編程語言的知識。
  sysadmin 固定服務器角色的成員身份。
  本文假定,您熟悉與 Oracle RDBMS 有關的術語、概念和工具。有關 Oracle RDBMS 及其體系結構的具體信息,請參見 Oracle 7 Server Concepts Manual(Oracle 7 Server概念手冊)。至于使用 Oracle 腳本和示例,還假定您熟悉 Oracle Server Manager 和 Oracle SQL*Plus 工具。有關這些工具的具體信息,請參見 Oracle 文檔。
  
  目錄
  
  開發和應用程序平臺
  概述
  本文組織結構
  體系結構和術語
  安裝和配置 Microsoft SQL Server
  定義數據庫對象
  實施數據完整性和業務規則
  事務、鎖定和并發性
  死鎖
  SQL 語言支持
  游標的實現
  優化 SQL 語句
  使用 ODBC
  開發和治理數據庫復制
  遷移數據和應用程序
  數據庫示例
  
  開發和應用程序平臺
  
  為了清楚和便于表述,假定開發和應用程序平臺是 Microsoft Visual Studio 6.0 版、Microsoft Windows NT 4 (Service Pack 4)、SQL Server 7.0 和 Oracle 7.3。Oracle 7.3 使用 Visigenic Software ODBC 驅動程序(2.00.0300 版);SQL Server 7.0 使用 Microsoft Corporation ODBC 驅動程序(3.70 版)。Microsoft SQL Server 7.0 包括用于 Oracle 的 OLE DB 驅動程序,但在本章中不予具體討論。
  
  概述
  
  應用程序遷移過程似乎很復雜。兩種 RDBMS 之間有很多體系結構方面的差異。描述 Oracle 體系結構的詞匯和術語在 Microsoft SQL Server 中,其含義經常完全不同。此外,Oracle 和 SQL Server 都有許多專有的 SQL-92 標準擴展。
  
  從應用程序開發人員的角度來看,Oracle 和 SQL Server 治理數據的方式是相似的。但是,Oracle 和 SQL Server 之間內部的差異是相當大的,假如治理得當,它對遷移應用程序造成的影響就會微乎其微。
  
  開發人員面臨的最嚴重遷移問題是:SQL-92 SQL 語言標準的實現和每種 RDBMS 提供的擴展。一些開發人員只使用標準的 SQL 語言語句,并傾向于使其程序代碼盡可能通用。通常,這意味著把程序代碼限定在初級 SQL-92 標準,該標準在許多數據庫產品中均得到了一致的實現,其中包括 Oracle 和 SQL Server。
  
  這種方法可能給程序代碼帶來不必要的復雜性,并顯著影響程序性能。例如,Oracle 的 DECODE 函數是 Oracle 特有的非標準 SQL 擴展。Microsoft SQL Server 的 CASE 表達式已不止是初級 SQL-92 的擴展,并未在所有的數據庫產品上實現。
  
  假如不使用這兩個函數,則可以編程方式實現其功能,但可能需要從 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 驅動程序,在原本的、高性能的驅動程序中提供全面的級別 2 支持。
  
  假如程序只使用核心 ODBC API,它可能放棄了一些數據庫帶有的功能和性能。再者,并不是所有原本的 SQL 擴展都可以用 ODBC 轉義序列表示,例如 Oracle DECODE 和 SQL Server CASE 表達式就是這樣。
  
  此外,通過編寫 SQL 語句使用數據庫優化程序也是通常的做法。在 Oracle 中用來提高性能的技巧和方法,在 SQL Server 中并不一定最好。ODBC 接口無法將技巧從一個 RDBMS 轉化到另一個 RDBMS 中。
  
  ODBC 并不禁止應用程序使用數據庫特有的功能,也不禁止優化性能,但是應用程序需要一些數據庫特有的代碼部分。有了 ODBC,要使程序結構和絕大部分程序代碼在多個數據庫上保持一致,就變得十分簡單。
  
  OLE DB 是下一代的數據訪問技術。Microsoft SQL Server 7.0 利用了 SQL Server 自身組件中的 OLE DB。此外,應用程序開發人員在 SQL Server 新的開發過程中,應考慮使用 OLE DB。Microsoft 在 SQL Server 7.0 中加入了用于 Oracle 7.3 的 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 7.3 和 Microsoft SQL 7.0 之間相關差異的概述。此外,還包括轉換時要考慮的因素、SQL Server 7.0 的優勢以及多個示例。
  
  體系結構和術語
  
  要成功地遷移,開始之前應該了解與 Microsoft SQL Server 7.0 有關的基礎體系結構和術語。本節中的許多例子均取自 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 7.0 數據庫均維護其自身的系統編錄,它包含下列信息:
  
  數據庫對象(表、索引、存儲過程、視圖、觸發器等等)。
  約束。
  用戶和權限。
  用戶定義的數據類型。
  復制定義。
  數據庫使用的文件。
  
  在 master 數據庫中,SQL Server 還加入了一個集中系統編錄,它包括系統編錄以及有關每個數據庫的一些信息:
  
  數據庫名稱和每個數據庫的主文件位置。
  SQL Server 登錄帳戶。
  系統消息。
  數據庫配置值。
  遠程和/或鏈接的服務器。
  當前活動信息。
  系統存儲過程。
  
  與 Oracle 中的 SYSTEM 表空間一樣,要訪問任何其它數據庫,SQL Server master 數據庫必須可用。因此,當 master 數據庫做重大修改后,應對該數據庫進行備份以防止數據庫出現故障,這一點非常重要。數據庫治理員也可以鏡像構成 master 數據庫的文件。
  
  Oracle RDBMS 由表空間組成,而表空間又是由數據文件組成的。表空間數據文件被格式化為稱為“塊”的內部單元。塊的大小是 DBA 在 Oracle 數據庫首次創建時設定的,其范圍從 512 到 8192 字節。在 Oracle 表空間中創建一個對象時,用戶用稱為“擴展盤區”的單位定義其大小(初始擴展盤區、下一擴展盤區、最小擴展盤區和最大擴展盤區)。Oracle 擴展盤區大小是可變的,但必須包括至少五個連續的塊。
  
  在數據庫一級中,Microsoft SQL Server 使用文件組來控制表和索引的物理存儲。文件組是一個或多個文件的邏輯容器,文件組中包含的數據按比例填充到所有屬于該組的文件中。
  
  假如沒有定義和使用文件組,數據庫對象就會被放在一個默認文件組中,該文件組是數據庫創建過程中隱式定義的。文件組答應:
  
  把大型表分布在多個文件上,以提高 I/O 吞吐量。
  把索引存儲在不同的文件上,而不是它們各自的表上,從而進一步提高了 I/O 吞吐量和磁盤并發性。
  將 text、ntext、image 列(大對象)從表中存儲到不同的文件上。
  把數據庫對象放在特定的磁盤上。
  備份和恢復文件組中單個表或一組表。
  
  SQL Server 將文件格式化為稱為“頁”的內部單元。頁大小是固定的,為 8192 字節 (8 KB)。擴展盤區由頁組成,其大小也是固定的,由 8 個連續的頁組成。在 SQL Server 數據庫中創建表或索引時,會自動給其分配一個頁。與分配一個整個擴展盤區相比,它可更有效地存儲較小的表和索引。
  
  對于大多數 Microsoft SQL Server 安裝來說,不需要 Oracle 類型的段。相反,SQL Server 可以使用基于硬件的 RAID 或基于 Windows NT 軟件的 RAID,更好地分布數據或將數據條帶化。基于 Windows NT 軟件的 RAID 或基于硬件的 RAID 可以設定條帶集,它包括多個磁盤驅動器,看起來就像一個邏輯驅動器一樣。假如數據庫文件在此條帶集上創建,磁盤子系統就負責把 I/O 負載分布到多個磁盤上。建議治理員使用 RAID,把數據分布到多個物理磁盤上。
  
  SQL Server 推薦的 RAID 配置是 RAID 1(鏡像)或 RAID 5(帶有一個額外的奇偶校驗驅動器的條帶集,用作冗余)。也建議使用 RAID 10(帶有奇偶校驗的條帶集的鏡像),但是它比前兩種配置昂貴得多。條帶集非常適于分布數據庫文件上經常隨機產生的 I/O。
  
  假如不能選擇 RAID,文件組則是一個有吸引力的替代選擇,它提供與 RAID 相同的一些優點。此外,對于可能跨越多個物理 RAID 陣列的大型數據庫,文件組是一個很吸引人的方法,它以一種可控的方式,將 I/O 進一步分布到多個 RAID 陣列上。
  
  對于有序 I/O,必須優化事務日志文件,并加以保存,防止單點失敗。因此,對于事務日志,建議使用 RAID 1(鏡像)。這個驅動器的大小至少要和聯機重做日志和回滾段表空間的總計大小一樣。應創建一個或多個日志文件,來占用該邏輯驅動器上定義的所有空間。與存儲在文件組中的數據不同,事務日志項目總是按順序地寫入,并且不是按比例填充的。
  
  有關 RAID 的具體信息,請參見 SQL Server Books Online、Windows NT Server 文檔和 Microsoft Windows NT 資源工具包。
  
  每次啟動時,Oracle RDBMS 執行自動恢復。它檢驗表空間文件的內容是否與聯機重做日志文件一致。假如不一致,Oracle 將聯機重做日志文件內容應用到表空間文件(前滾),并刪除回滾段中發現的任何未提交的事務(回滾)。假如 Oracle 不能從聯機重做日志文件中得到它所需要的信息,它就會查詢存檔重做日志文件。
  
  每次啟動時,Microsoft SQL Server 7.0 還通過檢查系統中的每個數據庫,進行自動數據恢復。它首先檢查 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 7.0 的默認配置是,事務日志自動增長,直到用盡了所有磁盤空間或達到最大配置尺寸為止。當事務日志變得太“滿”時,它就會產生一個錯誤,并且在備份或截斷之前,禁止對數據進一步修改。其它數據庫不受影響。可以使用 BACKUP LOG 或備份向導備份事務日志。
  
  文件或文件組備份
  
  SQL Server 可以備份文件或文件組。有關具體信息,請參見 SQL Server Books Online。
  
  可以在數據庫使用過程中對它進行備份,這樣就可以對必須連續運行的系統進行備份。SQL Server 7.0 的備份處理和內部數據結構已進行了改進,這樣,可將備份的數據傳輸率提高到最大,同時對事務吞吐量的影響降至最小。
  
  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 95 或 Windows 98 操作系統的客戶配置默認的 Net-Library 和服務器連接信息。除非在 ODBC 數據源配置過程中更改,或在 ODBC 連接字符串中明確寫明,所有的 ODBC 客戶應用程序均使用相同的默認 Net-Library 和服務器連接信息。有關 Net-Libraries 的具體信息,請參見 SQL Server Books Online。
  
  要將 Oracle 應用程序完全遷移到 Microsoft SQL Server 7.0,必須了解 SQL Server 數據庫安全性和角色的實現。
  
  登錄帳戶
  
  登錄帳戶答應用戶訪問 SQL Server 數據或治理選項。登錄帳戶只答應用戶登錄到 SQL Server,并查看答應 guest(來賓)訪問的數據庫。(guest 帳戶不是默認建立的,必須單獨創建。)
  
  SQL Server 提供兩種類型的登錄安全性:Windows NT 身份驗證模式(也稱為集成模式)和 SQL Server 身份驗證模式(也稱為標準模式)。SQL Server 7.0 也支持標準和集成安全的組合,稱為混合模式。
  
  驗證登錄連接時,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 7.0 中,默認情況下,sa SQL Server 身份驗證模式登錄帳戶是該角色的成員;這就如同當 SQL Server 安裝在 Windows NT 計算機上,它就是本地 Administrators 組成員一樣。 sysadmin 角色的成員可以添加或刪除 Windows NT 用戶和組,以及 SQL Server 登錄。該角色的成員通常有下列職責:
  
  安裝 SQL Server。
  配置服務器和客戶。
  創建數據庫。*
  設置登錄權限和用戶權限。*
  向 SQL Server 數據庫導入數據和從中導出數據。*
  備份和恢復數據庫。*
  實現和維護復制。
  計劃無值守操作。*
  監視和優化 SQL Server 性能。*
  分析系統問題。
  *這些項目可以委派給其他安全角色或用戶。
  
  在 SQL Server 7.0 中,沒有對 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 5,創建一個可容納所有數據的邏輯驅動器。通過計算 Oracle 系統、臨時表空間和應用程序表空間所使用的全部文件空間,來預估空間大小。
  使用基于 Windows NT 軟件的 RAID 或基于硬件的 RAID 1,來創建用于存放事務日志的第二個邏輯驅動器。此驅動器大小應至少和聯機重做與回滾段表空間之和一樣大。
  使用 SQL Server Enterprise Manager,創建一個與 Oracle 應用程序表空間名稱相同的數據庫。(示例應用程序使用的數據庫名稱為 USER_DB。)將數據和事務日志的文件位置分別指定為步驟 1 和 2 創建的磁盤。假如使用多個 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 ENDUSER1, ENDUSER1
  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 ENDUSER1, ENDUSER1, 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-92 標準,該標準是一個關于對象定義的標準。將 Oracle SQL 表、索引和視圖定義轉換為 SQL Server 表、索引和視圖定義,只需要進行相對簡單的語法更改即可。下表著重闡述了,Oracle 和 Microsoft SQL Server 數據庫對象之間的一些差異。 類別
  Microsoft SQL Server
  Oracle
  
  列數
  
  1024
  
  254
  
  行大小
  
  8060 字節,加 16 字節指向每個 text 或 image 列
  
  沒有限制(但每行只答應一個 long 或 long raw)
  
  最大行數
  
  沒有限制
  
  沒有限制
  
  BLOB 類型存儲
  
  和行一起存儲的 16 字節指針。數據存儲在其它數據頁上。
  
  每表一個 long 或 long raw。必須在行尾。數據存儲在與行相同的塊上。
  
  聚集的表索引
  
  每表一個
  
  每表一個(索引組織的表)
  
  非聚集的表索引
  
  每表 249 個
  
  沒有限制
  
  單索引中索引的最大列數
  
  16
  
  16
  
  索引中列值的最大長度
  
  900 字節
  
  1/2 塊
  
  表命名規則
  
  [[[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
  
  1-30 個字符長。
  數據庫名稱:最多 8 個字符長。
  數據庫鏈接名稱:最多 128 個字符長。
  
  1-128 個 Unicode 字符長。
  臨時表名稱:最多 116 個字符長。
  
  標識符名稱必須以字母開頭,并包含字母、數字字符或 _、$、和 # 字符。
  
  標識符名稱可以以字母數字字符或 _ 開頭,并且幾乎可包含任何字符。
  
  假如標識符以空格開始,并包含除 _、@、# 或 $ 以外的字符,則必須使用 [](分隔符)將標識符名稱括起來。
  
  假如對象開始字符是:
  
  @ 它是一個局部變量。
  # 它是一個局部臨時對象。
  ## 它是一個全局臨時對象。
  
  表空間名稱必須唯一。
  
  數據庫名稱必須唯一。
  
  在用戶帳戶(架構)中,標識符名稱必須是唯一的。
  
  在數據庫用戶帳戶中,標識符名稱必須是唯一的。
  
  在表或視圖中,列名必須是唯一的。
  
  在表或視圖中,列名必須是唯一的。
  
  在用戶架構中,索引名稱必須是唯一的。
  
  在數據庫表名稱中,索引名稱必須是唯一的。
  
  當訪問 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 登錄帳戶可在多個數據庫中擁有名稱相同的表。例如,ENDUSER1 帳戶擁有下列數據庫對象:USER_DB.ENDUSER1.STUDENT 和 OTHER_DB.ENDUSER1.STUDENT。限定符是數據庫用戶名,而不是 SQL Server 登錄名,因為它們并不一定相同。
  
  同時,這些數據庫中的其他用戶可以擁有相同名稱的對象:
  
  USER_DB.DBO.STUDENT
  USER_DB.DEPT_ADMIN.STUDENT
  USER_DB.STUDENT_ADMIN.STUDENT
  OTHER_DB.DBO.STUDENT
  
  因此,建議把所有者名稱作為數據庫對象引用的一部分。假如應用程序有多個數據庫,建議把數據庫名稱也作為引用的一部分。假如查詢跨多個服務器,也將服務器名稱加到引用中。
  
  每個 SQL Server 連接都有一個當前的數據庫上下文,它是在登錄時使用 USE 語句設定的。例如,假定下列場景:
  
  一個用戶,使用 ENDUSER1 帳戶,登錄到 USER_DB 數據庫。用戶請求 STUDENT 表。SQL Server 查找 ENDUSER1.STUDENT 表。假如找到該表,則 SQL Server 在 USER_DB.ENDUSER1.STUDENT 上執行請求的數據庫操作。
假如在 ENDUSER1 數據庫帳戶中沒有找到該表,SQL Server 則在此數據庫的 dbo 帳戶中查找 USER_DB.DBO.STUDENT。假如該表仍沒有找到,SQL Server 就會返回一個錯誤信息,指出該表不存在。
  
  假如另一個用戶,例如 DEPT_ADMIN,擁有這個表,表名稱前面一定加上數據庫用戶的名稱( DEPT_ADMIN.STUDENT)。否則,數據庫名稱默認為當前在上下文中的數據庫。
  
  假如引用的表在另一個數據庫中,該數據庫名稱必須用作引用的一部分。例如,在 OTHERDB 數據庫中,要訪問 ENDUSER1 擁有的 STUDENT 表時,就要使用 OTHER_DB.ENDUSER1.STUDENT。
  
  可用兩個英文句點將數據庫和表的名稱分隔開,省略對象的所有者名稱。例如,假如應用程序引用 STUDENT_DB..STUDENT,SQL Server 進行如下查詢:
  
  STUDENT_DB.current_user.STUDENT
  STUDENT_DB.DBO.STUDENT
  
  假如用戶一次只使用一個數據庫,在對象的引用中省略數據庫名稱,這樣,在其它數據庫中使用該應用程序就變得簡單了。所有對象引用隱式訪問當前使用的數據庫。假如在同一服務器上,要維護一個測試數據庫和一個生產數據庫,這是很有用的。
  
  因為 Oracle 和 SQL Server 均支持標識 RDBMS 對象的 SQL-92 初級規則,所以,CREATE TABLE 語法是相似的。 Oracle
  Microsoft SQL Server
  
  CREATE TABLE
  [schema.]table_name
  (
  {col_name column_properties
  [default_eXPression] [constraint [constraint
  [...constraint]]] [[,] constraint]}
  [[,] {next_col_name next_constraint}...]
  )
  [Oracle Specific Data Storage Parameters]
  
  CREATE TABLE [server.][database.][owner.] table_name
  (
  {col_name column_properties[constraint
  [constraint [...constraint]]] [[,] 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 VARCHAR2(4) NOT NULL,
  DNAME VARCHAR2(30) NOT NULL,
  CONSTRAINT DEPT_DEPT_PK
  PRIMARY KEY (DEPT)
  USING INDEX TABLESPACE USER_DATA
  PCTFREE 0 STORAGE (INITIAL 10K NEXT 10K
  MINEXTENTS 1 MAXEXTENTS UNLIMITED),
  CONSTRAINT DEPT_DNAME_UNIQUE
  UNIQUE (DNAME)
  USING INDEX TABLESPACE USER_DATA
  PCTFREE 0 STORAGE (INITIAL 10K NEXT 10K
  MINEXTENTS 1 MAXEXTENTS UNLIMITED)
  )
  PCTFREE 10 PCTUSED 40
  TABLESPACE USER_DATA
  STORAGE (INITIAL 10K NEXT 10K
  MINEXTENTS 1 MAXEXTENTS UNLIMITED
  FREELISTS 1)
  
  CREATE TABLE USER_DB.DEPT_ADMIN.DEPT (
  DEPT VARCHAR(4) NOT NULL,
  DNAME VARCHAR(30) NOT NULL,
  CONSTRAINT DEPT_DEPT_PK
  PRIMARY KEY CLUSTERED (DEPT),
  CONSTRAINT DEPT_DNAME_UNIQUE
  UNIQUE NONCLUSTERED (DNAME)
  )

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 盘锦市| 庆云县| 新晃| 榆中县| 金堂县| 南昌市| 安西县| 石楼县| 肥乡县| 迭部县| 城固县| 镇江市| 雷波县| 大石桥市| 准格尔旗| 宾川县| 鞍山市| 乡城县| 阿拉尔市| 宜兴市| 会同县| 和静县| 喀喇| 库尔勒市| 屏东县| 林周县| 广东省| 颍上县| 新昌县| 海伦市| 壶关县| 琼结县| 南丰县| 阿尔山市| 杂多县| 泗洪县| 双流县| 高唐县| 滕州市| 蓬安县| 海安县|