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

把Oracle數據庫移植到Microsoft SQL Server 7.0(2)

2022-06-13   來源: Oracle 

  安裝和配置Microsoft SQL Server
  
  了解了Oracle和SQL Server之間基本結構上的差異以後你就可以開始進行移植過程的第一步了SQL Server
   Query Analyzer將用來運行下面的腳本
  
   
  
  使用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
  
  
   
  
  定義數據庫對象
  
  Oracle數據庫對象(表視圖和索引)可以很容易的移植到Microsoft SQL Server上這是因為兩個數據
  庫都基本遵循SQL標准該標准承認對象定義把Oracle SQL的表索引和視圖的定義轉換為SQL Server
  的表索引和視圖的定義只需要做相對簡單的語法改變下表指出了Oracle和Microsoft SQL Server之間的
  數據庫對象的某些不同之處
  
  類別 Microsoft SQL Server Oracle
  列數
  行尺寸 byte 外加 byte用來指向每一個text或者image列 無限制 (每行只允許有一個long或者long
  raw)
  最大行數 無限制 無限制
  BLOB類型存儲 行中存儲一個byte 指針數據存儲在其他數據頁 每表一個long或者long raw 必須在
  行的結尾數據存儲在行的同一個塊裡
  分簇表索引 每表一個 每表一個(indexorganized tables)
  未分簇的表索引 每表 無限制
  在單一索引中的最大索引列數
  索引中列值的最大長度 bytes ? block
  表名約定 [[[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腳本或者程序開始的該腳本或者程序用來創建你的數據庫對象拷貝你的腳本或
  者程序並且進行如下修改這些修改將在本部分的其他地方加以討論該例子是從示例應用程序腳本
  Oratablesql和Sstablesql中截取的
  
  確保數據庫對象標識遵循Microsoft SQL Server命名法則你可能只需要修改索引的名字
  修改數據存儲參數使之能在SQL Server下工作如果你使用RAID就不需要任何存儲參數了
  修改Oracle約束定義使之能在SQL Server中工作如果需要的話創建一個觸發器以支持外部鍵DELETE
   CASCADE語句如果表跨數據庫的話使用觸發器來增強外部鍵的關系
  修改CREATE INDEX語句以利用分簇的索引
  使用數據轉換服務來創建新的CREATE TABLE語句回顧該語句注意Oracle數據類型是如何映射到SQL
  Server數據類型上的
  清除所有的CREATE SEQUENCE語句在CREATE TABLE或者ALTER TABLE語句中使用同等列來替換順序的使用
  如果需要的話修改CREATE VIEW語句
  清除所有對同義字的引用
  評估對Microsoft SQL Server臨時表的使用和其在你的應用程序中的用處
  把所有的Oracle的CREATE TABLE…AS SELECT命令改為SQL Server的SELECT…INTO語句
  評估潛在的對用戶定義規則數據類型和缺省的使用
   
  
  數據對象標識符
  
  下表比較了Oracle和Microsoft SQL Server是如何處理對象標識符的在許多情況下當移植到SQL
  Server上時你不需要改變對象的名字
  
  Oracle Microsoft SQL 
   字符長度
  數據庫名稱最多個字符長度
  數據庫連接名稱最多個字符長度 Unicode字符長度
  臨時表名稱最多個字符
  標識符的名稱必須用字母包含文字數字的字符或者字符_ $ 和 #開頭 標識符名稱可以用字母
  數字字符或者_開頭實際上可以用任何字符開頭
  如果標識符用空格開頭或者包含了不是_@#或者$的字符你必須用[](定界符)包圍標識符名稱
  
  如果一個對象用下面這些字符開頭
  @ 則表明該對象是一個本地變量
  # 則該對象是一個本地臨時對象
  ## 則該對象是一個全局臨時對象
  
  表空間名必須唯一 數據庫名必須唯一
  標識符名在用戶賬號(計劃Schema)范圍內必須唯一 標識符名在數據庫用戶賬號范圍內必須唯一
  列名在表和視圖范圍內必須唯一 列名在表和視圖范圍內必須唯一
  索引名在用戶賬號(Schema)范圍內必須唯一 索引名在數據庫表名范圍內必須唯一
  
   
  
  修飾表名
  
  當訪問存在於你的用戶賬號中的表時該表可以簡單的通過未經限制的表名來選中訪問其他Oracle計劃
  中的表就需要把該計劃的名字作為前綴加到表名上兩者之間用點號()隔開Oracle同義字可以提供
  更高的位置透明度
  
  涉及到表時Microsoft SQL Server采用一種不同的方法因為一個SQL Server登錄賬號可以在多個數據
  庫中用同一個名字創建一個表所以采用下面的方法來訪問表和視圖[[數據庫名字]所有者名字]表名]
  
  用……訪問一個表 Oracle Microsoft SQL Server
  你的用戶賬號 SELECT *
  FROM STUDENT SELECT * FROM USER_DBSTUDENT_
  ADMINSTUDENT
  其他模式(schema) 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就查詢ENDUSER
  STUDENT表如果找到SQL Server就在USER_DBENDUSERSTUDENT表上做要求的數據庫操作如果在
  ENDUSER數據庫賬號下沒有找到該表SQL Server就為該數據庫以dbo賬號搜尋USER_DBDBOSTUDENT如果
  還是找不到該表SQL Server就返回一個錯誤消息指出該表不存在
  如果另一個用戶例如DEPT_ADMIN擁有該表則該表必須以數據庫用戶名作為前綴(DEPT_ADMINSTUDENT)
  另外數據庫名字缺省為在當前上下文中的數據庫名字
  如果被引用的表在另一個數據庫中則數據庫名必須作為引用的一部分例如要訪問在OTHERDB數據庫中由
  ENDUSER擁有的表STUDENT就需要用OTHER_DBENDUSERSTUDENT來引用
  可以在數據庫和表名之間加兩個點號來省略對象的所有者名例如如果應用程序引用STUDENT_DBSTUDENT
  SQL Server就做如下搜
From:http://tw.wingwit.com/Article/program/Oracle/201311/18155.html
    推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.