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

首頁 > 數據庫 > SQL Server > 正文

Oracle 數據庫向 MS SQL Server 7.0 的遷移(3)

2024-08-31 00:52:03
字體:
來源:轉載
供稿:網友

  死鎖
  當一個進程鎖定另一個進程需要的頁或表,而后者又鎖定了前者所需要的頁時,死鎖就發生了。死鎖也稱為“僵局”。SQL Server 自動檢測并處理死鎖。假如發現了死鎖,服務器就會終止處于“僵局”的用戶進程。
  
   Oracle 數據庫向 MS SQL Server 7.0 的遷移(3)(圖一)
  
  每次數據修改后,程序代碼都應檢測消息編號 1205,它用于指示死鎖。假如返回了這個消息編號,則發生了死鎖,并且事務被回滾。在這種情況下,應用程序必須重新啟動事務。
  
  使用一些簡單的技巧,就可以避免死鎖:
  
  應用程序的各個部分均使用相同的順序訪問表。
  在每個表上使用聚集索引,來實施顯式行排序。
  使事務保持簡短。
  有關具體信息,請參見 Microsoft Knowledge Base 文章:Detecting and Avoiding Deadlocks in Microsoft SQL Server(Microsoft SQL Server 死鎖的檢測和避免)。
  
  在 Oracle 中,要執行遠程事務,必須能夠使用數據庫鏈接,來訪問遠程數據庫節點。在 SQL Server 中,則必須能夠訪問一個“遠程服務器”。遠程服務器是在網絡上運行 SQL Server 的一個服務器,用戶可使用本地服務器對它進行訪問。當一個服務器被設置為遠程服務器時,用戶無須顯式登錄,就可以使用其上的系統過程和存儲過程。
  
  遠程服務器是成對設置的。必須對兩個服務器進行配置,使之均將對方作為遠程服務器。必須使用 sp_addlinkedserver 系統存儲過程或 SQL Server EnterPRise Manager,把每個服務器的名稱加入它的伙伴名稱中。
  
  設置遠程服務器之后,使用 sp_addremotelogin 系統存儲過程或 SQL Server Enterprise Manager,為必須訪問遠程服務器的用戶設定遠程登錄 ID。這一步完成之后,必須授予此執行存儲過程的權限。
  
  然后,使用 EXECUTE 語句,運行遠程服務器上的過程。以下示例執行了遠程服務器 STUDSVR1 上的 validate_student 存儲過程,并把指示成功或失敗的返回狀態存儲在 @retvalue1 中:
  
  DECLARE @retvalue1 int
  EXECUTE @retvalue = STUDSVR1.student_db.student_admin.validate_student '111111111'
  
  
  有關具體信息,請參見 SQL Server Books Online。
  
  假如在兩個或多個網絡數據庫節點上對表進行更改,Oracle 就會自動啟動一個分布式事務。SQL Server 分布式事務則使用包含在 SQL Server 中的 Microsoft 分布式事務處理協調器 (MS DTC) 的兩階段提交服務。
  
  默認情況下,必須指示 SQL Server 參與分布式事務。可以使用以下方法之一,使 SQL Server 開始參與 MS DTC 事務:
  
  使用 BEGIN DISTRIBUTED TRANSACTION 語句。這個語句開始一個新的 MS DTC 事務。
  使用直接調用 DTC 事務接口的客戶應用程序。
  在此例中,請注重對本地表 GRADE 和遠程表 CLASS(使用 class_name 過程)的分布式更新:
  
  BEGIN DISTRIBUTED TRANSACTION
  UPDATE STUDENT_ADMIN.GRADE
  SET GRADE = 'B+' WHERE SSN = '111111111' AND CCODE = '1234'
  DECLARE @retvalue1 int
  EXECUTE @retvalue1 = CLASS_SVR1.dept_db.dept_admin.class_name '1234', 'Basketweaving'
  COMMIT TRANSACTION
  GO
  
  
  假如應用程序不能完成此事務,應用程序就會使用 ROLLBACK TRANSACTION 語句取消它。假如應用程序失敗或參與的資源治理器失敗,MS DTC 就會取消此事務。MS DTC 不支持分布式保存點或 SAVE TRANSACTION 語句。假如一個 MS DTC 事務終止或回滾,整個事務被回滾到分布式事務的起始處,無論有多少個保存點都是如此。
  
  Oracle 和 MS DTC 兩階段提交機制在操作上是類似的。在 SQL Server 兩階段提交的第一階段中,事務治理器請求每個參加的資源治理器為提交做預備。假如任何資源治理器不能預備,則事務治理器向事務所涉及的每個人廣播終止決定。
  
  假如所有資源治理器都可以成功地預備,則事務治理器廣播提交決定。這是提交過程的第二階段。當資源治理器在預備時,它不知道事務將被提交還是被終止。MS DTC 有一個有序日志,這樣就可以永久保存提交或終止決定。假如資源治理器或事務治理器失敗,它們重新連接時,就可重新處理有疑問的事務。
  
  SQL 語言支持
  這一部分概述了 Transact-SQL 和 PL/SQL 語言語法之間的相同點和不同點,并給出轉換策略。

  
  要將 Oracle DML 語句和 PL/SQL 程序遷移到 SQL Server 時,請按下列步驟執行:
  
  驗證所有 SELECT、INSERT、UPDATE 和 DELETE 語句的語法是有效的。進行任何必要的修改。
  把所有外部聯接改為 SQL-92 標準外部聯接語法。
  用相應 SQL Server 函數替代 Oracle 函數。
  檢查所有的比較運算符。
  用“+”字符串串聯運算符代替“”字符串串聯運算符。
  用 Transact-SQL 程序代替 PL/SQL 程序。
  把所有 PL/SQL 游標改為非游標 SELECT 語句或 Transact-SQL 游標。
  用 Transact-SQL 過程代替 PL/SQL 過程、函數和包。
  把 PL/SQL 觸發器轉換為 Transact-SQL 觸發器。
  使用 SET SHOWPLAN 語句,優化查詢性能。
  SELECT 語句
  Oracle 和 Microsoft SQL Server 使用的 SELECT 語句語法類似。
  
   Oracle 數據庫向 MS SQL Server 7.0 的遷移(3)(圖二)
  
  SQL Server 不支持 Oracle 特定的基于開銷的優化程序提示,它必須被刪除。建議使用的技術是,使用 SQL Server 基于開銷的優化程序。有關具體信息,請參見本章后面的“SQL 語句優化”。
  
  SQL Server 不支持 Oracle 的 START WITHUCONNECT BY 子句。在 SQL Server 中,可以創建完成相同任務的存儲過程替代它。
  
  SQL Server 不支持 Oracle 的 INTERSECT 和 MINUS 集合運算符。可使用 SQL Server EXISTS 和 NOT EXISTS 子句,實現相同的結果。
  
  在下面示例中,使用 INTERSECT 運算符,用于查找學生登記的所有課程的代碼和名稱。注重,EXISTS 運算符是如何代替 INTERSECT 運算符的。返回的數據是相同的。
  
   Oracle 數據庫向 MS SQL Server 7.0 的遷移(3)(圖三)
  
  Transact-SQL values_list 參數提供了 SQL-92 標準要害字 DEFAULT,但 Oracle 不支持。此要害字指定了,執行插入操作時使用列的默認值。假如指定列的默認值不存在,則插入 NULL。假如該列不答應 NULL,則返回一個錯誤消息。假如該列數據類型定義為 timestamp,則插入下一個有序值。
  
  標識符列不能使用 DEFAULT 要害字。要生成下一個序列號,擁有 IDENTITY 屬性的列不能列在 column_list 或 values_clause 中。不需使用 DEFAULT 要害字,來獲取列的默認值。正如在 Oracle 中,假如列沒有在 column_list 中引用,并且它有默認值,則默認值存放在列中。這是遷移時可使用的最兼容的方法。
  
  一個有用的 Transact_SQL 選項 (EXECute procedure_name) 是,執行一個過程并將其結果用管道輸出到目標表或視圖中。Oracle 不答應這樣做。
  
  UPDATE 語句
  因為 Transact SQL 支持 Oracle UPDATE 命令使用的絕大多數語法,所以只需要極少的修改。
  
   Oracle 數據庫向 MS SQL Server 7.0 的遷移(3)(圖四)
   Oracle 數據庫向 MS SQL Server 7.0 的遷移(3)(圖五)
  在 SQL Server 中,此語句只能由表的所有者執行。在 Oracle 中,假如是表的所有者或擁有 DELETE TABLE 系統權限,就可以執行此命令。
  
  Oracle TRUNCATE TABLE 命令可以有選擇地釋放表中行所占用的存儲空間。SQL Server TRUNCATE TABLE 語句總是收回表數據及其相關索引所占用的空間。
  
  標識符列和時間戳列中數據的處理
  Oracle 序列是與任何給定的表或列均不直接相關的數據庫對象。列和序列之間的關系是在應用程序中實現的,即通過編程的方法將序列值賦給列。因此,Oracle 使用序列時,并不實施任何規則。但是,在 Microsoft SQL Server 標識符列中,值不能被更新,并且不能使用 DEFAULT 要害字。
  
  默認情況下,數據不能直接插入到標識符列。標識符列自動給表中插入的每個新行生成一個唯一的序列號。可以使用下列 SET 語句改寫這種默認設置:
  
  SET IDENTITY_INSERT table_name ON
  
  
  將 IDENTUTY_INSERT 設為 ON,用戶就可以向新行的標識符列插入任何值。要防止出現有重復號碼的條目,必須為該列創建唯一索引。這條語句的目的是,答應用戶給無意中刪除的行重新創建一個值。@@IDENTITY 函數可用來獲取上一個標識值。
  
  TRUNCATE TABLE 語句將標識符列重置為其起始 SEED 值。
假如不想重置列的標識值,則不使用 TRUNCATE TABLE 語句,而使用不帶 WHERE 子句的 DELETE 語句。必須評估它對 Oracle 遷移造成的影響,因為 ORACLE SEQUENCE 在 TRUNCATE TABLE 命令之后不被重置。
  
  處理 timestamp 列時,只能執行插入和刪除。假如要更新一個 timestamp 列,會收到以下的錯誤信息:
  
  Msg 272, Level 16, State 1 Can't update a TIMESTAMP column.
  
  
  鎖定請求的行
  Oracle 使用 FOR UPDATE 子句來鎖定 SELECT 命令中指定的行。不需要在 Microsoft SQL Server 中使用對等的子句,因為這是默認行為。
  
  行合計和 COMPUTE 子句
  SQL Server COMPUTE 子句用于生成行合計函數(SUM、AVG、MIN、MAX 和 COUNT),它們在查詢結果中作為附加行出現。它答應查看一組結果的具體和匯總信息

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 合川市| 台州市| 沁阳市| 阆中市| 九台市| 波密县| 金昌市| 海兴县| 普宁市| 巴马| 张家川| 金溪县| 郧西县| 栾川县| 蕲春县| 女性| 前郭尔| 天全县| 奉化市| 呼图壁县| 开远市| 长泰县| 叶城县| 涪陵区| 长治市| 新化县| 临洮县| 天等县| 永昌县| 拜城县| 巧家县| 泸西县| 饶阳县| 天气| 温泉县| 萍乡市| 会同县| 星座| 尚志市| 得荣县| 奉节县|