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

SQL實戰新手入門:會話

2013-11-13 12:43:13  來源: SQL語言 

  章 多用戶環境

  數據庫並不是一個孤島可以想象這樣的場景一個或多個用戶都在訪問數據庫所有的修改和保存都按照一種正確的順序執行不會陷入混亂在現實中創建數據庫通常都是為了實現多人共享數據即使對於桌面型數據庫Microsoft Access和OpenOffice BASE也可以通過網絡進行共享RDBMS服務器本身就是專門設計用於支持多用戶環境的

  當一個以上的用戶訪問同一個數據集時一些新的問題就產生了哪些數據應該對於每一個用戶都可見呢?誰的修改應該具有優先權?在執行一個較長的數據庫過程期間用什麼保證數據的修改不會丟失?為了找到這些問題(以及很多其他問題)的答案下面將介紹會話事務和鎖的概念

  上面的這些問題可以用RDBMS的術語重新表述為

  事務為潛在的數據一致性問題提供了解決方案

  鎖用於處理數據的並發性問題

  會話代表了事務和鎖存在的上下文環境

   會話

  在RDBMS服務器和訪問它的一個用戶之間發生的任何通信過程都是發生在一個會話的上下文環境中可以將會話視為一個唯一的通道它僅為你打開供你訪問數據或者在桌面型數據庫的情形下例如Microsoft Access和OpenOffice BASE就是專屬於你自己的一個數據文件的副本當你連接到數據庫並通過認證時RDBMS將為你自動創建一個會話

  在多用戶環境中令人擔憂的問題之一就是數據的完整性當一個客戶端應用程序建立了一個到RDBMS服務器的連接時稱為打開了一個會話會話就是該應用程序與服務器進行通信的私有通道在會話期間用戶可能修改了一些首選項(例如默認語言或默認數據格式)這些設置僅影響到當前這個特定的用戶環境並且僅僅只在該會話期間有效各種RDBMS對會話的實現細節和會話的默認行為可能有所差異但這些基本的原則是保持一致的

  本書中使用的工具都是客戶端在會話上下文中訪問RDBMS服務器的例子對於桌面型數據庫則有所不同例如Microsoft Access文件它既可以作為數據存儲使用也可以包含很多通常與應用程序相關的對象例如表單報表等(有很多辦法可以將這些功能劃分到前端和後端文件中)對於Microsoft Access會話就是打開的mdb/accdb文件的一個本地副本在使用完之後必須將其合並回文件(關於這一話題的更多內容請參考有關Microsoft Access的專業出版物)

  OpenOffice BASE的架構與Microsoft Access不同從本質上講OpenOfficeBASE被設計為一個桌面型的通道為任何支持JDBC驅動程序的數據庫提供一個前端它內置的HSQLDB數據庫引擎是一個默認的選擇嵌入版本的OpenOffice BASE並未設計用於多用戶環境

  RDBMS為各自的RDBMS服務器都提供了一些命令行工具這是所有RDBMS的共同特性所有RDBMS都提供了一個圖形化的用戶界面(GUI)另外還有很多第三方工具關於這些工具的更多信息請參考附錄C和附錄D的內容

  SQL標准定義了很多參數可以使用這些參數來連接數據庫並在會話期間保持這些參數RDBMS已經實現了其中絕大部分參數盡管在某些元素的實現上使用了私有的語法但是只是語法形式的不同本質是一樣的

  在Oracle中為了建立一個數據庫連接用戶必須具有系統特權CREATESESSION;要想修改會話的參數用戶必須具有ALTER SESSION特權在初始時會話的所有默認參數都是從一個特殊的Oracle配置文件中加載的只有數據庫管理員或者具有必要特權的人才能修改這個配置文件一旦連接建立之後(即創建了會話)用戶就可以根據自己的偏好和工作的要求修改會話的參數

  IBM DB為會話環境提供了非常少的用戶控制它提供了一個SET SESSION AUTHORIZATION語句(遵循SQL標准)和一個等效的SET SESSION_USER語句用於修改會話的上下文

  SETPASSTHRU語句為會話提供了最直接的控制它可以為將SQL數據直接提交到數據庫打開和關閉一個會話另外在會話期間創建的全局臨時表將使用SESSION組件作為限定的模式(在臨時表的名稱與某個永久表的名稱相同的情況下避免在訪問表時出現歧義)

  當客戶端終止了一個會話自發地終止會話或異常地終止會話為會話設置的所有參數都將消失此外對於所有懸而未決的事務在客戶端自發地終止會話的情況下將執行一個隱式的提交在會話異常終止的情況下將執行一個回滾

  數據庫管理員(DBA)可以殺死或斷開一個會話但在各個RDBMS中執行該命令的語法存在一定的差別

  試一試修改會話參數

  Microsoft SQL Server 提供了大量的語句可以修改當前會話的設置這些語句並不是SQL標准的一部分實際上它們是TransactSQL方言的一部分下面的例子將修改其中一個設置ANSI_NULLS並查看該設置對查詢輸出的影響

  () 打開Microsoft SQL Server Management Studio Express連接到LIBRARY數據庫

  ()下面的語句用於從LIBRARY數據庫的PHONE表中獲取所有BK_PRICE字段不為NULL的記錄

  SET ANSI_NULLS ON

  GO

  SELECT bk_title

  FROM books

  WHERE bk_price <> NULL

  GO

  ( row(s) affected)

  () 盡管實際上可以料想到LIBRARY數據庫中的所有圖書都具有相應的價格表中一定存在滿足這一條件的記錄但是該查詢卻沒有返回任何記錄

  () 清除查詢窗格中的內容輸入新的SQL批語句如下所示

  SET ANSI_NULLS OFF

  GO

  SELECT bk_title

  FROM books

  WHERE bk_price<> NULL

  GO

  BK_TITLE

  

  SQL Bible

  

  Steppenwolf

  示例說明

  由於NULL並不是一個特殊的值它是一個表示缺少值的占位符因此對NULL值應該區別對待SQL標准強制要求凡是涉及NULL值的比較操作總是返回FALSE把MicrosoftSQL Server 的ANSI_NULLS參數調整為ON將指示數據庫遵循這一標准但Oracle /g和IBM DB 都沒有類似於ANSI_NULLS這樣的設置

  如果使用更為標准的ISNULL語法就可以完全避免這一情況

  SELECT bk_title

  FROM books

  WHERE bk_price IS NOT NULL

  在所有RDBMS中上面這個查詢都可以返回正確的結果

       返回目錄SQL實戰新手入門

       編輯推薦

       Oracle索引技術

       高性能MySQL

       數據倉庫與數據挖掘培訓視頻教程


From:http://tw.wingwit.com/Article/program/SQL/201311/16452.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.