<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 89,  comments - 98,  trackbacks - 0
    第一講??Sybase基礎知識

    一、客戶/服務器體系結構
    Sybase是一種建立在客戶/服務器體系結構上的數據庫管理系統
    ●什么是客戶/服務器體系結構?
    從硬件角度看,客戶/服務器體系結構是指將某項任務在兩臺或多臺機器之間進行分配,其中客戶機(Client)用來運行提供用戶接口和前端處理的應用程序,服務器機(Server)提供客戶機使用的各種資源和服務。
    從軟件角度看,客戶/服務器體系結構是把某項應用或軟件系統按邏輯功能劃分為客戶軟件部分和服務器軟件部分。客戶軟件部分一般負責數據的表示和應用,處理用戶界面,用以接收用戶的數據處理請求并將之轉換為對服務器的請求,要求服務器為其提供數據的存儲和檢索服務;服務器端軟件負責接收客戶端軟件發來的請求并提供相應服務。
    客戶/服務器融合了大型機的強大功能和中央控制以及PC機的低成本和較好的處理平衡。客戶/服務器為任務的集中/局部分布提供了一種新的方法,這種體系能夠使用戶對數據完整性、管理安全性進行集中控制。在緩解網絡交通和主機負荷以及滿足用戶需要方面,客戶/服務器體系提供了良好的解決方案。
    總之,客戶/服務器的工作模式是:客戶與服務器之間采用網絡協議(如TCP/IP、IPX/SPX)進行連接和通訊,由客戶端向服務器發出請求,服務器端響應請求,并進行相應服務。
    數據庫應用的客戶/服務器模式如下圖所示:








    二、訪問Sybase服務器的基本過程
    1.建立客戶與服務器之間的連接,包括網絡連接、客戶進程與服務器進程之間的連接;
    2.客戶端通過網絡發送SQL語句給服務器,用來查詢或操作服務器中的數據或數據庫對象;
    3.服務器接收到SQL語句后,對其進行語法分析、優化和編譯后執行;
    4.如果執行的語句產生一個結果集,服務器通過網絡把結果集返回給客戶;
    5.客戶端對收到的結果作相應的處理。
    在客戶/服務器體系,有兩種數據庫引擎結構,即多進程數據庫引擎和單進程、多線程引擎結構。
    多進程結構即多個可執行程序同時運行。每當用戶登錄到數據庫系統時實際上都啟動了數據庫引擎的一個獨立實例。存在起協調作用的進程協調進行之間的通訊以保證當多用戶訪問相同數據時數據的完整性。多進程數據庫引擎一般用在大型機數據庫上。
    單進程多線程數據庫引擎在原理上和多進程數據庫引擎類似,不同的是多線程數據庫引擎自己負責調度各應用程序占用CPU的時間,而不依賴于操作系統。這樣,多線程數據庫引擎自我保護的能力更強。
    Oracle?Server是一個真正的多進程數據庫引擎,Sybase數據庫管理系統采用的是單進程多線程的引擎結構。
    三、Sybase產品概述
    1.Sybase軟件的組成
    Sybase軟件可劃分為三個部分:一是進行數據管理與維護的聯機關系數據庫管理系統Sybase?SQL?Server;二是支持數據庫應用系統的建立和開發的一組前端工具軟件Sybase?SQL?Tools;三是可把異構環境下其他廠商的應用軟件和任何類型的數據連接在一起的接口軟件Open?Client/Open?Server。
    SQL?Server是個可編程的數據庫管理系統(DBMS),它是整個Sybase產品的核心軟件,起著數據管理、高速緩沖區管理、事務管理的作用。
    2.SQL?Server的基本特征
    SQL?Server是個關系數據庫管理系統,它具有如下一些基本特征:
    a.SQL?Server可以放在若干個磁盤設備上,初始安裝時所需的磁盤空間至少要17MB。
    b.SQL?Server支持多庫結構,也就是說Sybase系統中可以有多個數據庫。Sybase可以管理多個數據庫
    c.SQL?Server可以編譯和運行T-SQL語句,并可返回客戶程序所要求的結果。T-SQL語句是標準SQL的擴充,它除了有數據定義語句、數據操縱語句和數據控制語句之外,主要增加了流程控制語句。
    d.SQL?Server可以管理多個用戶并具有較高的事務吞吐量和較低的事務響應時間。
    客戶的應用程序可以存取Server中某一個或幾個數據庫的數據。
    四、SQL?Server的主要內容
    Sybase?SQL?Server是一個多庫結構的RDBMS,體系結構大致如下:








    1.數據庫
    服務器自身所使用的數據庫,也可以說是管理服務器和用戶數據庫數據庫。Sybase在安裝時,自動創建了四個系統數據庫
    master、model、tempdb、sybsystemprocs
    (1)?master數據庫
    它是管理和控制用戶數據庫以及維護服務器正常運行的核心數據庫,它保存了大量的系統信息,如服務器配置、用戶、設備等。
    在master數據庫中不允許普通用戶在其中創建數據庫對象,否則會使得master數據庫的事務日志很快變滿。如果事務日志用盡,就無法使用dump?transaction命令釋放master數據庫中的空間。
    (2)model數據庫
    它是為創建用戶數據庫而提供的模板。每當創建新的數據庫時,SQL?Server自動建立model數據庫的一份拷貝,并把它擴充到用戶所要求的大小,以此作為新用戶數據庫
    Model數據庫中包含每個用戶數據庫所要求的系統表。Model數據庫可以被修改以便定制新創建的。
    (3)tempdb數據庫
    它是個臨時數據庫,為服務器運行與處理提供一個共享的存儲區域,如group?by和order?by的中間結果就存放在這里。Tempdb的空間為服務器中所有數據庫的所有用戶所共享。
    每次重啟SQL?Server,服務器的一個自動進程都拷貝model數據庫到tempdb數據庫,并清除tempdb中原來的內容。因此tempdb中的用戶表都是臨時的。臨時表分為兩類:可共享的和不可共享的。不可共享的臨時表在由create?table中將符號#置于表名之前創立;可共享的臨時表通過create?table中指定表名前綴tempdb..而創立。不可共享的臨時表SQL?Server自動為其添加數字后綴名,且它只存在于當前會話中。
    (4)sybsystemprocs數據庫master數據庫
    它是專門用來保存系統命令(存儲過程)的數據庫,如sp_help、sp_configure、sp_helpdevice等。當任一數據庫用戶運行以sp_開頭的存儲過程時,SQL?Server按照以下順序查找:當前數據庫、sybsystemprocs數據庫、master數據庫
    2.用戶數據庫
    用戶數據庫是我們使用Sybase服務器的真正目的。要管理用戶數據,必須在Sybase中創建自己的數據庫,它是指用create?database命令創建的數據庫。不能存取master數據庫的用戶是無權創建新的數據庫的。
    數據庫中的主要內容——數據庫對象:
    表、視圖、臨時表
    索引、主鍵、外鍵
    缺省值、規則
    存儲過程、觸發器等
    五、Sybase的安裝與配置
    1.服務器端的安裝
    安裝建立SQL?Server以后,要建立放置數據庫、日志和索引的邏輯磁盤設備。數據庫、日志和索引的配置應注意以下原則;
    a.不要把任何用戶對象安裝在master數據庫中。
    b.日志應該保存在與數據庫分離的磁盤上。
    c.可以通過跨越多個設備分配工作優化I/O性能。
    2.客戶端的安裝
    3.需要立即更改的內容
    (1)更改sa的登錄口令;(2)命名服務器;(3)修改文件名(保證Sybase?Central正常啟動);(4)更改缺省設備;(5)增加tempdb的空間。
    4.創建用戶數據庫
    以下通過一個建立數據庫的腳本說明建立數據庫的過程:
    //創建數據庫設備,設備大小以頁(2K)為單位
    disk?init
    name=”test_dbdev”,
    physname=”c:\test\test_dbdev.dat”,
    vdevno=10,
    size=10240
    go
    disk?init
    name=”test_logdev”,
    phyname=”c:\test\test_logdev.dat”,
    vdevno=11,
    size=5120
    go
    //創建數據庫TEST_DB,其大小為20M,日志大小為10M
    create?database?TEST_DB
    on?test_dbdev=20
    log?on?test_logdev=10
    go
    //打開數據庫
    use?TEST_DB
    go
    5.系統管理的主要內容
    a.物理資源的管理
    b.用戶及其權限管理
    c.數據庫的備份與恢復
    6.SQL?Server的配置參數
    服務器配置是系統管理員的職責,正確的配置對系統性能有重大的影響。有兩個系統表存儲配置信息:sysconfigures和syscurconfigs;sysconfigures是永久性的,一旦系統運行,sysconfigures的信息就拷貝到syscurconfigs中。顯示配置和改變配置使用系統過程sp_configure。
    有兩種配置值:動態的和靜態的,動態值一旦改變立即生效,靜態值要在系統重啟動后才起作用。
    ?

    第二講??數據庫設備與存儲空間管理









    一、概述
    1.安裝初始化
    初始安裝SQL?Server時,安裝程序和腳本初始化主設備,并建立master、model、tempdb和sybsystemprocs數據庫系統數據庫、預定義設備和段按下列默認方式組織:
    a.master、model、tempdb數據庫安裝在主設備master上;
    b.sybsystemprocs數據庫安裝在安裝時選擇的設備上(sysprocsdev);
    c.為每個數據庫創建三個預定義段:system、default和logsegment;
    d.所有用戶創建數據庫的默認設備是master設備;
    e.如果選擇安裝了審計數據庫sybsecurity,它位于自己的設備上。
    2.設備與存儲管理考慮的主要問題
    (1)恢復
    物理磁盤崩潰時,磁盤鏡像或在單獨的物理設備上保存日志為數據庫恢復提供了兩種機制。
    (2)性能
    磁盤讀寫速度是I/O操作的瓶頸,正確地把數據庫對象放置到物理設備上有利于改進性能;
    把日志和數據庫對象置于單獨的設備上可以提高系統性能;
    把表放在一個硬盤上而把索引放在另一個硬盤上,由于把工作分置于兩個硬盤驅動器上,所以可以確保物理讀寫速度加快;
    磁盤鏡像會降低磁盤寫的速度。
    二、設備(Device)
    Sybase將數據庫中的所有數據存放在設備上。
    1.設備的概念
    設備是Sybase預先配置的專門存放數據庫的一塊連續的磁盤空間,并且它被映射到一操作系統文件或一原始磁盤分區上。它有兩個對應的名稱:邏輯名和物理名。NT僅支持設備映射到文件。
    設備與數據庫之間的關系:多對多關系。一個數據庫可以被創建或擴充到多個設備上,一個設備也可以被用來存放多個數據庫。不同的設備操作系統可以對其并行地讀寫,因此我們可以人為地將一個數據庫放置到多個數據庫設備上。
    設備的分類:Database?Device和Dump?Device。數據庫設備存放數據庫和事務日志,轉儲設備用來存放數據庫或日志的備份。
    2.設備的創建
    命令語法:
    DISK?INIT
    Name=’device_name’,
    Physname=’physical_name’,
    Vdevno=virtual_device_number
    Size=number_of_pages
    […….]
    舉例說明:
    DISK?INIT
    Name=’My_Device’,
    Physname=’D:\database\My_device.dat’,
    Vdevno=3
    Size=5000
    注釋:邏輯名、物理名、設備虛擬號、設備大小

    創建轉儲設備:
    sp_addumpdevice{‘disk’|’tape’}
    Logical_Name,
    Physical_Name,
    TapeSize

    3.默認設備
    在沒有指定設備的情況下,用戶創建的任何數據對象自動存放在默認設備上。
    初始安裝后,系統的主設備master被預指定為默認設備,因此要盡快創建自己的默認設備。確保以下設備不是默認設備:系統主設備、指定僅被日志使用的設備。
    Sp_diskdefault?設備名[,DefaultOn|DefaultOff]

    4.磁盤鏡像
    磁盤鏡像是出于數據庫安全性的考慮,當介質失敗時,磁盤鏡像能提供不間斷恢復。磁盤鏡像是磁盤上的數據的絕對拷貝。如果某一硬盤事故發生,則該被損壞的拷貝就自動變成離線狀態,因而所有的讀寫都被引向未被損壞的拷貝。
    Sybase的磁盤鏡像是在設備級上進行的,因此磁盤鏡像實質上是設備鏡像。當對某一設備進行鏡像操作時,Sybase自動創建一個附加設備,由鏡像處理程序將原設備上的所有數據拷貝到鏡像設備上。
    如果要使某一數據庫成為鏡像,被分配給該數據庫的每一設備都必須成鏡像。Master設備在服務器中地位特殊,如果它損壞了,SQL?Server將崩潰。因此,如果有可能總是要鏡像Master設備(在另一磁盤上)。
    鏡像命令語法:
    Disk?Mirror
    Name=’device_name’,//被鏡像的設備
    Mirror=’physical_name’
    [,writes=serial|noserial]
    5.刪除設備
    sp_dropdevice?logical_name[,delfile]
    含有數據庫的設備不允許刪除。
    三、創建與使用段
    ????段(Segment)是數據庫設備上磁盤空間的邏輯組合,它可以看作是指向一個或多個數據庫設備的標簽。利用段可以控制數據庫對象的存放位置,可以將數據庫對象分類存放到不同的段上。
    設備與段之間的關系:多對多關系。一個設備上可以創建多個段,一個段也可以覆蓋多個設備。
    1.使用段的優點
    a.?控制空間的使用:放在一個段上的數據庫對象不會在段外增長;
    b.?提高性能:處于不同磁盤設備上的段可以并行地讀寫;
    d.處理大表:利用段,可以將一個大表分段放在獨立的物理設備上,如將一個表的文本或圖象數據存儲另外的一個段上。
    2.創建段
    sp_addsegment?段名,數據庫名,設備名
    說明:在指定設備上為某個數據庫創建一個段。
    ●擴展段的范圍
    ??sp_exetendsegment?段名,數據庫名,設備名
    說明:設備在數據庫中必須可用,否則需要擴展數據庫到新的設備上;指定的段、數據庫、設備必須存在。
    ●縮小段的范圍:
    ??sp_dropsegment?段名,數據庫名,設備名
    說明:帶第三個參數時,該命令并不刪除段,只是段的范圍縮小了。若某個段包含了別的段要獨占的設備,就需要縮小該段的范圍。
    3.使用段
    ●兩個數據庫放在同一設備的不同段上,它們不會相互影響;
    ●當數據庫增加空間時,增加的空間會自動分配到它的每一個段上;
    例如:alter?database?my_db
    ??????on?data_dev=50
    在data_dev設備上為my_db增加50M空間,這50M空間被自動分配到數據庫的每一個段中。注意:如果data_dev對于數據庫是新的,system和default段會自動擴展到該設備上。
    可以使用alter?database命令的log?on選項分配附加的日志空間。
    (1)在段中創建新對象
    create?table?表名(列名?數據類型)[on?段名]
    create?[clusterd|non?clusterd]index?索引名?on?表名(列名)[on?段名]
    注意:按照定義,聚集索引總是與表放在同一段上。
    (2)在段上放置現有對象
    sp_placeobject?段名,對象名
    注意:該命令并不把對象從一個數據庫設備移動到另一設備上,它只影響未來的空間分配。
    可以將某個大表的text字段或image字段放置到一個單獨的設備段上。
    Sp_placeobject?段名,“表名.字段名”
    (3)在段上創建聚集索引
    按照定義,聚集索引總是與表放在同一段上。如果在一個段上創建表,而在另一個段上創建聚集索引,則其表與其索引一起移動,整個表將離開創建表的段而遷移到創建聚集索引的段中。通過這種方法,可以快速而方便地把指定表移動到指定的設備上。
    (4)系統預定義段
    當用戶創建一個數據庫時,Sybase自動創建三個預定義的段:
    system段:存放系統表(包括所有用戶對象的定義)
    default段:存放用戶創建的各種對象,除非它們明顯地指定到不同的段上。
    Logsegment段:存放數據庫的事務日志。
    (5)刪除段
    刪除段是縮小段范圍的一個特例:
    sp_dropsegment?段名,數據庫
    4.使用閾值管理
    閾值(Threshold)管理是一種自動監控數據庫自由空間的機制,Sybase的閾值管理允許用戶為數據庫的某個段上的自由空間設置閾值并定義相應的存儲過程。當該段上的自由空間低于所置頭閾值時,Sybase自動運行相應的存儲過程。
    在一個實際運行的數據庫中,日志的增長速度一般要高于數據的增長,一旦日志段的自由空間用盡,SQL?Server在默認情況下會掛起所有數據操縱事務,客戶端應用程序停止執行。
    在每個分離的段上存儲其事務日志的數據庫均自動設置有最后機會閾值(Last?Chance?Threshold),其閾值是備份事務日志所需的自由空間的估計值。當該段上的自由空間低于所置閾值時,Sybase自動運行名為sp_thresholdaction的存儲過程。該過程的名稱及參數由系統預定義,內容由用戶編寫。下面是一個簡單示例。
    CREATE?PROCEDURE?dbo.sp_thresholdaction
    /*本過程參數通過位置傳遞,名稱可以改變,但其定義及順序不能變*/
    @db_name?varchar(30),/*數據庫名*/
    @seg_name?varchar(30),/*段名*/
    @space_lefe?int,/*剩余自由空間*/
    @status?int/*最后機會閾值,其值為1,其它閾值,其值為0*/
    AS
    BEGIN
    /*用戶編寫過程內容*/
    dump?transaction?@db_name
    with?truncate_only

    END
    ?

    第三講??數據庫與事務日志

    一、創建用戶數據庫
    Create?Database?數據庫
    ??On?設備_1=Size_1,//單位:M
    ?????設備_2=Size_2,
    ……
    log?on?日志設備=Log_Size
    [With?Override]//在同一設備上創建數據庫和事務日志時使用該選項
    [For?Load]????//禁止用戶訪問直到數據庫的裝入或恢復操作完成為止
    舉例:
    ????Create?Database?test_db
    ????On?data_dev=100,//單位:M
    ???????Index_dev=50
    ????Log?on?log_dev=30
    說明:
    (1)將日志放在單獨的設備上,有利于數據庫性能的提高;
    (2)圖示:




    Data_dev????????Index_dev????????log_dev
    (3)如果將數據庫和日志放在同一設備上,就不能實現增量備份;
    (4)通常將System和Default段縮減范圍到一個設備上,如刪除設備Index_dev上的System段和Default段,創建新的段,用來存放專門的數據庫對象。
    二、更改數據庫
    1.改變數據庫屬主
    通常用戶數據庫系統管理員創建,它的默認屬主是dbo。系統過程sp_changeddbowner可改變數據庫的屬主關系,它必須由數據庫管理員在要改變屬主關系的數據庫中執行。語法如下:
    sp_changeddbowner?login_name[,True]
    其中參數True用于將權限一半傳遞給新屬主。
    2.擴展數據庫
    (1)擴展數據庫空間
    alter?database?數據庫
    ?????????on?設備名=擴展空間??//單位:M
    ?????????如果擴展的設備對于數據庫是新的,System和Default段會自動擴展到該設備上。
    (2)擴展事務日志到新的設備上
    ??sp_logdevice?數據庫名,設備名
    舉例:將數據庫另外擴充5M,用于存儲日志
    ?????alter?database?my_db
    ????????????on?my_dev=5
    ?????go
    ?????sp_logdevice?my_db,my_dev
    ?????go

    3.刪除數據庫
    ??drop?database?數據庫
    刪除設備前必須刪除其上的所有數據庫,刪除設備的命令是:sp_dropdevice
    三、事務日志
    ???日志文件是用來記錄數據庫每一次修改活動的文件。SQL?Server中的每一個數據庫都有自己的日志文件,即系統表syslogs,也稱為事務日志。事務日志是撤消事務和出現故障時恢復事務的依據。
    在某些情況下,事務日志比數據本身更為重要。
    什么是事務?
    數據庫的修改是以事務為單位進行的。一個事務就是一個操作序列,這些操作要么全做,要么全不做,它是一個不可分割的工作單位。任何一個事務具備如下特征。
    (1)執行的原子性(Atomic);
    (2)保持數據的一致性(Consistency);
    (3)彼此的隔離性(Isolation);
    (4)作用的持久性(Durability)。
    上述事務的四個特征被稱為事務的ACID準則。
    事務在運行過程中,SQL?Server把事務開始、事務結束以及對數據庫的插入、刪除和更新等每一個操作作為一個日志記錄存放到事務日志中。事務中的更新操作首先在數據庫緩沖區(內存)中進行,緩沖區分別有用來記錄操作活動的數據頁(data?page)和日志頁(log?page)。當運行到commit?tran時,日志頁首先從緩沖區寫到磁盤上,而后數據頁從緩沖區寫到磁盤上,即遵循“先與日志(write_ahead?log)”的原則,這樣保證出現故障的情況下,通過日志能夠得到最大限度的恢復。恢復必須撤消發生故障時還未提交的事務,已完成的事務若仍有未從緩沖區寫到數據庫設備中,還要重新運行該事務。
    附:創建與裝載數據庫實例
    use?master

    decl?are?@vedvno?int
    select?@vdevno=max(convert(tinyint,substring(convert(binary(4),d.low),v.low,1)))+1
    from?master.dbo.sysdevices?d,master.dbo.spt_values?v
    where?v.type=’E’and?v.number=3
    declare?@v_str?char(2)
    select?@v_str=convert(char(2),@vdevno)
    print?@v_str

    disk?init
    ????name=”YDDATA”,
    ????physname=”D:\Syb_Data\YDDATA.dat”,
    ????vdevno=@vdevno+1,
    ????size=153600
    disk?init
    ????name=”YDINDEX”,
    ????physname=”D:\Syb_Data\YDINDEX.dat”,
    ????vdevno=@vdevno+2,
    ????size=102400
    disk?init
    ????name=”YDLOG”,
    ????physname=”D:\Syb_Data\YDLOG.dat”,
    ????vdevno=@vdevno+3,
    ????size=76800

    create?database?YDMISDB
    on?YDDATA=300,YDINDEX=200
    log?on?YDLOG=150

    use?YDMISDB

    execute?sp_addsegment?indexdev,YTMISDB,YTINDEX
    execute?sp_dropsegment?“default”,YTMISDB,YTINDEX
    execute?sp_dropsegment?system,YTMISDB,YTINDEX

    use?master

    load?database?YDMISDB?from?‘d:\yd_dump\ydmis_backup.dmp’

    online?database?YDMISDB
    ?

    第四講??數據庫安全性與用戶管理

    一、安全管理概述
    數據庫安全性是指保護數據庫以防止不合法的使用所造成的數據泄露、更改或破壞。SQL?Server的安全管理是一種基于角色(role)的管理方法,位于不同權限層次(或角色)的用戶具有不同的用戶權限。
    規定用戶權限有三個因素:用戶、數據對象和操作,即什么用戶在哪些數據對象上可以執行什么操作。
    訪問SQL?Server中數據的四道屏障:
    (1)操作系統——操作系統登錄
    (2)Sybase服務器——服務器登錄
    (3)Sybase數據庫——數據庫用戶登錄
    (4)數據庫對象——對象授權
    二、理解數據庫角色
    角色是權限的集合。
    1.系統預定義角色
    一個真正的數據庫管理員應該是整個服務器及其數據庫的擁有者,具有管理服務器及其數據庫的所有權限。在一個大的系統中,數據庫管理員往往不只由一人承擔,而是將管理任務進行功能劃分,每人提當不同的責任。系統預定義角色就是為適應這種要求而設計的。
    系統管理員(sa_role)
    sa_role角色擁有執行與數據庫具體應用無關的管理權限:
    ◇安裝與更新SQL?Server
    管理服務器的物理存儲
    ◇配置系統設置參數;
    ◇創建用戶數據庫
    ◇授予SQL?Server用戶權限
    ◇┅┅
    系統安全管理員(sso_role)
    sso_role用來實施安全上敏感的操作,執行有關安全性的任務:
    ◇建立服務器登錄帳戶;
    管理口令;
    ◇授予除sa_role之外的任何角色;
    管理審計系統
    ◇┅┅
    ●操作員(oper_role)
    oper_role執行全服務器范圍的數據庫操作,如備份與恢復任意數據庫等:
    ◇轉儲數據庫與日志
    ◇轉載數據庫與日志
    ◇┅┅
    2.創建與使用自定義角色
    (1)創建新的角色:create?role
    (2)賦予角色權限:grant
    (3)設置登錄帳戶的角色權限:sp_role
    ??格式:sp_role?“grant”|”revoke”,角色名,登錄帳號名
    這里的“grant”|”revoke”是指對角色權限是授予還是撤消。
    三、服務器的帳戶管理
    要想成為Sybase系統的一個用戶,首先必須擁有自己的登錄帳戶。通過這一帳戶連同自己的口令向服務器注冊后,才能使用Sybase系統中的一些資源,每一個這樣的登錄帳戶在系統中被賦予Server級的標識SUID。
    1.添加登錄
    sp_addlogin?登錄名,口令[,缺省的數據庫]
    如果不指定缺省的數據庫,則該帳戶的缺省數據庫為master庫。
    2.更改登錄屬性
    ◇更改口令;
    ◇鎖定帳戶;
    ◇期限設置;
    ◇賦予角色。Sybase
    四、數據庫用戶管理
    通過某一個帳戶注冊到服務器后,要想使用某一個數據庫,必須成為該數據庫的一個用戶。通過建立登錄與用戶之間的聯系來管理數據庫的訪問。
    1.組的概念
    組(group)是數據庫用戶的集合。屬于某個組的用戶,他自動獲得該組所擁有的權限。
    Sp_addgroup?組名
    ◇將一個用戶加入某個組:(1)改變用戶屬性;(2)創建新用戶時指定。
    ◇所有用戶自動屬于public組,即使這個用戶已經屬于其他組了。
    2.創建新的用戶
    sp_adduser?登錄名,用戶名[,組名]
    3.別名用戶
    Sybase的別名機制可以使得多個帳戶對應于同一個數據庫用戶,這樣使不同的登錄在數據庫中擁有同樣的權限。這在審計系統中是一種控制責任的一種手段。
    Sp_addalias?登錄名,數據庫中的用戶名
    別名——相當于給某個用戶配一把別人的鑰匙(登錄)。
    五、用戶的權限管理
    控制用戶對數據庫對象的訪問,有兩類權限:命令權限和對象權限。
    1.命令權限
    Create?Database
    Create?Table
    Create?View
    Create?Procedure
    Create?Rule
    Create?default
    命令權限授權與收權:
    Grant?命令權限組合?to?組名|用戶名|角色
    Revoke?命令權限組合?from?組名|用戶名|角色
    2.對象權限
    Select
    Update
    Insert
    Delete
    Reference
    Execute
    對象權限授權與收權:
    Grant?對象權限組合?on?數據庫對象?to?public|組名|用戶名|角色
    [With?Grant?Option]

    Revoke?對象權限組合?on?數據庫對象?to?public|組名|用戶名|角色
    From?public?public|組名|用戶名|角色
    [Cascade]
    授權與收權舉例:
    ◇Grant?Insert,Delete?on?Employee
    ??to?user_1,Group_1
    ◇Grant?Execute?on?Pro_culculate
    ??to?public
    ◇Grant?Select?on?Employee(emp_id,emp_name)
    ??to?user_3
    ◇Grant?All?on?Employee
    ??to?user_4
    ◇Revoke?update?on?Employee(emp_id,emp_name)
    ??from?user_5
    ◇Revoke?Create?Table,Create?Rule
    ??????from?user_6
    ?

    第五講??數據庫的備份與恢復

    數據庫的備份與恢復是SQL?Server保障數據安全的一種重要手段,為防止意外,數據庫管理員必須定期和經常制作數據庫的備份。一旦系統出現故障,數據能夠得到及時的恢復。
    一、基本概念
    ????1.事務處理及其日志
    SQL?Server使用事務來跟蹤所有數據庫變化。事務是SQL?Server的工作單元。一個事務包含一條或多條作為整體成功或失敗的T_SQL語句。每個數據庫都有自己的事務日志,即系統表syslogs,事務日志自動記錄每個用戶發出的每個事務,它飲食了每個事務足夠多的信息,以確保數據能夠被恢復。
    2.檢查點(CheckPoint)
    服務器在何時更新數據?
    ——在檢查點。在服務器發出一個檢查點時:(1)更新數據;(2)在日志中記錄下執行檢查點的標記。
    檢查點可把所有“臟頁”寫到數據庫設備上,“臟頁”是指從上一次檢查點以來,在內存中修改、但沒有在磁盤上修改的頁。SQL?Server的自動檢查點機制保證了被完成的事務修改的數據頁有規律地從內存中的緩沖區寫到數據庫設備上。
    二、數據庫備份
    若硬件介質出現故障(如磁盤損壞),當且僅當事先已對數據庫及其事務日志作了備份,才能恢復數據庫
    注意:絕對不要使用操作系統的拷貝數據庫設備,把這樣一個拷貝裝入SQL?Server將導致大量數據庫受損。
    備份的類型:
    完全備份()
    增量備份——備份事務處理日志
    說明:
    (1)只有把事務日志放在單獨的設備上,才能進行增量備份;
    (2)備份事務日志會截斷日志,因此備份的內容是自上次備份以來的事務處理。
    (3)備份之前要啟動備份服務器,并最好創建轉儲設備。
    命令語法:
    ??dump?database?數據庫
    ????to?轉儲設備名/物理文件名

    ??dump?transaction?數據庫
    ???{with?{truncate_only|no_log}
    ????to?轉儲設備名/物理文件名
    ????[with?No_truncate]
    Truncate_only與no_log選項用于刪除事務處理而不作拷貝。Truncate_only截斷日志;在事務處理日志完全滿時用no_log,它不為數據庫建立檢查點。兩個選項都會丟掉日志。當使用了這兩個參數后,應及時備份整個數據庫
    No_truncate拷貝日志但不截斷日志,在出現介質錯誤時使用該選項。
    ?
    圖形界面的選項與命令參數的對應關系:
    (1)dump?transaction???(2)dump?transaction……??with?no_truncate
    (3)dump?transaction……??with?truncate_only
    (4)dump?transaction……??with?no_log
    三、數據庫的恢復
    使用load?database加載備份到現有數據庫數據庫可以是用于創建轉儲的數據庫,也可以不是。語法為:
    load?database?數據庫名?from?轉儲設備名/物理文件名
    load?transaction數據庫名?from?轉儲設備名/物理文件名
    ●利用備份恢復數據庫舉例:
    數據庫數據和日志分別存儲在兩個獨立的磁盤上,正常運轉時的執行的備份計劃如下,每天的17:00執行整個數據庫的備份,每天的10:00、12:00、14:00、16:00點執行增量備份:

    周一17:00磁帶1(100M)周二10:00磁帶2(30M)周二12:00磁帶3(30M)周二14:00磁帶4(30M)周二16:00磁帶5(30M)周二17:00磁帶6(30M)


    DumpdatabaseDumptransactionDumptransactionDumptransactionDumptransactionDumpdatabase

    若數據磁盤在周二的下午六點損壞,可以采用如下步驟恢復數據庫
    (1)使用dump?transaction?with?no_truncate獲得當前的事務日志轉儲,磁帶7;
    (2)使用load?database轉載最新的數據庫轉儲,磁帶6;(offline)
    (3)使用load?transaction提交最新的事務日志轉儲,磁帶7;
    (4)使用online?database把數據庫狀態設置為online。
    若數據磁盤在周二的下午4:50損壞,恢復過程如下:
    (1)使用dump?transaction?with?no_truncate獲得當前的事務日志轉儲,磁帶7;
    (2)使用load?database轉載最新的數據庫轉儲,磁帶6;(offline)
    (3)使用load?transaction依次裝載磁帶2、3、4、5上的事務日志;
    (4)使用load?transaction提交最新的事務日志轉儲,磁帶7;
    (5)使用online?database把數據庫狀態設置為online。
    四、制定備份與恢復的策略
    ???由于事務日志在恢復數據庫中的特殊作用,應定期備份數據庫及其事務日志,而且事務日志的備份要更頻繁一些。如:數據庫每周備份一次,事務日志每天備份一次。
    ?

    第六講??數據庫與T-SQL語言

    一、關系模型的基本概念
    關系數據庫以關系模型為基礎,它有以下三部分組成:
    ●數據結構——模型所操作的對象、類型的集合
    ●完整性規則——保證數據有效、正確的約束條件
    ●數據操作——對模型對象所允許執行的操作方式
    關系(Relation)是一個由行和列組成的二維表格,表中的每一行是一條記錄(Record),每一列是記錄的一個字段(Field)。表中的每一條記錄必須是互斥的,字段的值必須具有原子性。
    二、SQL語言概述
    ??SQL(結構化查詢語言)是關系數據庫語言的一種國際標準,它是一種非過程化的語言。通過編寫SQL,我們可以實現對關系數據庫的全部操作。
    ●數據定義語言(DDL)——建立和管理數據庫對象
    ●數據操縱語言(DML)——用來查詢與更新數據
    ●數據控制語言(DCL)——控制數據的安全
    T-SQL語言是Sybase對SQL92標準的一種擴展,主要在它的基礎上增加了三個方面的功能:自己的數據類型/特有的SQL函數/流程控制功能
    T-SQL中的標識符使用說明:
    (1)標識符由1-30個字符或數字構成,但首字符必須為字母。臨時表的表名以#開頭,長度不能超過13個字符。
    (2)數據庫對象的標識方法舉例
    database.owner.tablename.columnname
    執行遠程存儲過程:
    EXEC?server.db.owner.proc_name
    當執行語句在批處理的句首時,EXEC可以省略。
    三、Sybase的數據類型
    ????在創建表或聲明局部變量時,必須使用Sybase系統預定義類型。
    1.字符類型
    Char(n)???VarChar(n)
    2.數值類型
    整數類型——Integer??SmallInt??TinyInt
    浮點類型——Real??Float??Number[P,S]??Decimal[P,S]
    貨幣類型——Money??SmallMoney
    3.日期/時間類型
    Datetime??SmallDatetime
    兩者時間部分的精度不同,前者精確到分,后者精確到1/30秒。
    4.文本和圖像類型
    Text??Image
    5.二進制數據類型
    Binary(n)??VarBinary(n)
    四、數據定義語言
    用來定義數據庫對象。數據庫對象是Sybase用來存儲數據的邏輯實體,主要有:
    表(Table)、視圖(View)、臨時表(Temp?Table);
    主鍵(Primary?Key)、外鍵(Foreign?Key)、索引(Index)、規則(Rule)、默認值(Default);
    存儲過程(Stored?Procedure)、觸發器(Trigger)
    ●基本語法
    下面給出創建主要數據庫對象的語法:
    1.表
    創建表的基本語法是:
    Create?table[database.[owner].]table_name
    (column_name?datatype?[default?{constant_expression|user|null}]
    {[{identity|null|not?null}]|[[constraint?constraint_name]
    {{unique|primary?key}[clustered|nonclustered]
    [with{fillfactor|max_rows_per_page}=x]
    [on?segment_name]
    |references[[database.]owner.]ref_table
    [(ref_column)]
    |check(search_condition)}]}…

    在建立大型的數據庫時,可以考慮將創建表乃至其它數據庫對象的過程寫到一個文本里,當數據庫系統出現問題時,在最壞的情況下,重建過程可以得到簡化,也能比較好的對數據庫的建設過程進行監視。
    創建表的過程完成下列活動:
    ·定義表的每一列;
    ·定義列名和列的數據類型并指定列是否處理空值;
    ·指定列是否具有IDENTITY屬性;
    ·定義列級的完整性約束和表級的完整性約束
    上述過程可見,創建表的過程可以設定填充因子,將列置于段上,設計索引,外鍵等等。
    2.索引
    索引對查詢性能的影響很大,要引起重視。
    索引加速了數據檢索,Adaptive?Server有三類索引:
    ·復合索引——索引包含多列;當兩列或多列由于它們的邏輯關系而作為整體被查詢時可建立這種索引;
    ·唯一索引——索引列的值不允許重復;
    ·簇聚索引和非簇聚索引——簇聚索引強迫Server不斷地對表中數據排序或重排序以保證表中數據的物理順序和邏輯順序的一致性,簇聚索引對范圍查詢性能影響極大;非簇索引沒有這樣的要求,非簇聚索引對修改操作有利。

    何時建索引?
    ·如果手動插入identity列,則創建唯一索引以保證不插入已經存在的值;
    ·經常被排序訪問的列,即被列在order?by子句中的列,最好對其建立索引以便Adaptive?Server能充分利用索引順序的優點;
    ·如果列經常用手連接,則可對列建立索引,這樣系統能更快地執行連接;
    ·包含主鍵的列一般都有簇聚索引,尤其是當它頻繁地和其它表的列相關聯;
    ·經常被范圍查詢的列最好為其建立簇聚索引,一旦查詢范圍內的第一個值被發現,則隨后的值在物理上一定相近。簇聚索引對單值查詢并沒有什么優點。
    創建索引的基本語法:
    Create?[unique][clustered|nonclustered]index?index_name
    On?[[database.]owner.]table_name
    (column_name[,column_name]…)
    [on?segment_name][with?consumers=x]

    上述語法包含了這樣的暗示:將簇聚索引和它的基表分離在不同的段上;段是邏輯概念,但段可以位于不同的物理設備上,也即將簇聚索引和基表物理上分開。?這是不允許的,我們將在后面討論設備、數據庫、段、表分區時作詳細討論。
    3.鍵(key)
    理解鍵是理解關聯的關鍵。
    鍵和索引往往是一回事。鍵的意義在概念上,鍵用于參照完整性約束。
    主鍵是表的單值列的集合,主鍵通過在放置它們的表上創建一個單值索引來實現其單值性的。實際上主鍵是作為標志表的標志符而存在的,一旦主鍵確定,則由該主鍵就確定了的表也就確定了。
    外鍵是和其它表中的主鍵相關的列,主鍵和外鍵的關系確定了外鍵的值域,該值域即為相應主鍵的取值范圍。這樣就從理論上強制實現了表與表之間的參照完整性。
    前面創建表的語法里包含了創建鍵的成分。也可以通過其它途徑創建主鍵和外鍵。
    ◇Unique約束和Primary?key約束的區別
    Unique約束和Primary?key約束用來保證同一表中指定的列上沒有重復值,這兩個約束都產生唯一索引確保數據一致性,默認情況下,Unique約束產生唯一的非聚集索引,Primary?key約束產生唯一的聚集索引。Primary?key約束比Unique約束嚴格:Primary?key列不允許有空值,Unique列允許有空值。
    4.視圖
    視圖是查看多表中數據的方法,視圖從基表派生,它并非物理存在,而是邏輯表;視圖也系統提供管理表的一種安全機制。視圖使得用戶集中精力在感興趣的數據集上。
    創建視圖的語法:
    create?view?[[database.]owner.]view_name
    [(column_name[,column_name]…)]
    as?select?[distinct]?select_statement
    [with?check?option]
    有distinct關鍵字的視圖不能更新。當視圖涉及關聯時,定義視圖要小心,這時是對多表操作,完整性顯得很重要。
    五、數據操縱語言
    1.Select語句
    基本語法:
    SELECT[all|distinct]字段列表
    [into表名]
    [from表名]
    [where條件表達式]
    [group?by?[all]字段列表]
    [having篩選表達式]
    [order?by?字段列表[asc|desc]]
    [compute聚集函數列表[by字段列表]]
    注意:Select語句中的子句必須按照上述順序使用。也就是說,若該語句包括一個group?by子句和一個order?by子句where,group?by子句必須放在order?by子句之前。
    Having子句類似于where子句,不同之處有兩點:(1)Having子句必須結合group?by子句使用;(2)where子句不能用聚集函數,而Having子句可以。
    下面通過實例來對Select的通常用法加以介紹。
    例1:選擇所有的列,語法為select?*?from?table_list
    如:select?*?from?publishers
    例2:選擇指定的列,語法為
    select?column_name[,column_name]…?
    from?table_name
    ??????如:select?pub_id,pub_name?from?publishers
    例3:重命名查詢結果中的列,語法為
    ?????select?column_heading=?column_name
    ?????from?table_name
    ?????如:select?Publisher=pub_name,pub_id
    from?publishers
    例4:select列表中的計算值,可以對select列表中的數值數據進行計算,下面列出了算術運算符。

    符號運算
    +加
    -減
    /除
    *乘
    %取模
    如select?title_id,total_sales,total_sales*2?from?titles
    例5:使用distinct消除重復的查詢結果
    可選的關鍵詞消除select語句的結果中的重復行。若不指定distinct,缺省值為all,將檢索出包含重復行的所有行數據。
    如:select?distinct?au_id?from?titleauthor
    例6:選擇行——where語句
    select語句中的確切指定要檢索哪些行的準則,其一般格式為:
    select?select_list?from?table_list?where?search_conditions
    where子句中的搜索條件(或稱限制)包括:
    ·比較運算符(=,<,>,!=等=
    如:where?advance*2>total_sales*price
    ·范圍(between和not?between)
    ??如:where?total_sales?between?5000?and?10000
    ·列表(in和not?in)
    ??如:where?state?in(“CA”,”IN”,”MD”)
    ·匹配字符(like和not?like)
    ??如:where?phone?like?“0535%”
    ·未知值(is?null和is?not?null)
    ??如:where?advance?is?null
    ·以上各項的組合(and,?or)
    ??如:where?advance<5000?or?total_sales?between?500?and?1000
    例7:用集合函數小結查詢結果
    集合函數用特定列的數據來計算小結值。
    集合函數結??果
    Sum([all|distinct]expression)數值列中(不重復)值的總和
    Avg([all|distinct]expression)數值列中(不重復)值的平均
    count([all|distinct]expression)列中(不重復)非空值的數目
    Count(*)選定的行數
    Max(expression)Expression的最大值
    Min(expression)Expression的最小值
    如:select?avg(advance),sum(total_sales)?
    from?titles?
    where?type=”as”
    select?count(*)?from?titles
    select?avg(distinct?price)?from?titles
    select?max(price)?from?books
    例8:分組組織查詢結果——group?by?子句
    ??????group?by?子句用在select語句中將一張表分成若干組。
    如:select?type,?advance?from?titles?group?by?type
    例9:選擇分組數據——having子句
    ??????having為group?by?子句設置條件,與where為select語句設置條件一樣。Having搜索條件與where相同,但having可包括集合函數,而where不能包括。
    下列語句使用帶集合函數having子句的例子。它把title表中的行按類型分組,但去掉了那只包含一本書的分組。
    Select?type?from?titles?group?by?type?having?count(*)>1
    下面是一個不帶集合函數的having子句的例子。它把title表中的行按類型分組,但去掉了那些不以字母“p”開頭的類型。
    Select?type?from?titles?group?by?type?having?type?like?“p%”
    例10:查詢結果排序——order?by子句
    Order?by子句允許按一列或多列對查詢結果排序。每個排序可以是升序的(asc)或降序的(desc)。若不特別指明,則按升序進行。下列查詢返回按pub_id排序的結果:
    Select?pub_id,type,title_id?from?titles?order?by?pub_id
    例11:連接——從多張表中檢索數據
    連接兩張或兩張以上的表是這樣一個過程:比較指定字段中的數據,根據比較結果用符合條件的行組成一張新表。
    舉例:
    select?publishers.pub_id,publishers.pub_name,authors.*
    from?publishers,authors
    where?publishers.city=authors.city
    例12:分組計算子句
    Compute是Sybase對SQL標準中Group子句的擴充,可以將其看作帶聚集計算的Group子句。例如:
    Select?type,price,advance
    From?titles
    Order?by?type
    Compute?sum(price),sum(advance)?by?type
    2.Insert語句
    用Insert命令向數據庫中添加行有兩種方法:使用關鍵詞values或使用select語句。
    Insert語句的基本語法為:
    Insert[into]表名[(字段列表)]
    {values(值列表)|select_statement}
    舉例:insert?into?publishers
    ??????values(‘1622’,’Jardin,Inc.’,’Camden’,’NJ’)
    ??????Insert?into?publishers(pub_id,pub_name)
    values(‘1756’,’The?Health?Center’)
    ??????????Insert?authors?select?*?from?newauthors
    ??????????Insert?authors(au_id,address,au_lname,au_fname)
    Select?*?from?newauthors
    3.Delect語句
    Delect可以對一行或多行進行操作。
    Delect語句的基本語法為:
    Delect?表名
    [from?表名列表]
    [where條件表達式]
    舉例:Delect?publishers
    ????????where?pub_name=”Jardin,Inc.”
    ??????Delect?titles
    ????????From?authors,?titles
    ????????Where?titles.title_id=authors.title_id
    4.Update語句
    可以使用Update命令來改動表中的單個行、一組行或所有行。
    Update語句的基本語法為:
    Update表名
    ??Set?column_name1={expression1|null|(select_statement)}
    ???[,column_name2={expression2|null|(select_statement)}]
    ???[……]
    ???[from?表名列表]
    ???[where?條件表達式]
    舉例:
    update?authors?set_au_lname=”Health”,aufname=”Goodbody”
    ??where?au_lname=”Bloth”
    update?titles
    ??set?total_sales=total_sales?+?qty
    ??from?titles,sales
    ??where?titles.title_id=sales.title_id
    六、Sybase預定義函數
    1.聚集函數
    sum([all|distinct]表達式)
    avg([all|distinct]表達式)
    count([all|distinct]表達式)
    count(*)
    max(表達式)
    min(表達式)
    2.字符串函數
    upper(字符表達式)
    lower(字符表達式)
    char(整型表達式)
    char_length(字符表達式)
    ltrim(字符表達式)
    rtrim(字符表達式)
    ……
    3.數學函數
    abs(精確小數型表達式)
    floor(精確小數型表達式)求小于或等于給定表達式值的最大整數(取底)
    rand([整數型]
    round(精確小數型表達式,整數)
    sign(精確小數型表達式)
    power(精確小數型表達式,整數冪)
    ……
    4.日期函數
    getdate()
    datepart(日期部分,日期)
    datediff(日期部分,日期1,日期2)
    dateadd(日期部分,數值表達式,日期)
    5.類型轉換函數
    convert(數據類型,表達式[,格式])
    6.系統函數
    db_name([數據庫ID])
    host_name()
    isnull(表達式1,表達式2)
    ……
    七、數據控制語言
    用來控制數據的安全性,如權限控制語句GRANT和REVOKE等。
    ?

    第七講??數據庫編程基礎

    一、批處理
    SQL?Server可以處理作為一批而提交的多個SQL語句,既可以是交互式的,也可以是一個文件。批處理SQL語句由批結束標志終止,該標志指示SQL?Server從前面開始執行該批處理語句,對于獨立的SQL實用程序isql而言,其批結束標志為單獨占一行的“go”。
    舉例:選擇表title及表authors的行數
    select?count(*)?from?titles
    select?count(*)?from?authors
    go
    二、流程控制語言
    1.變量聲明與賦值
    全局變量由系統預定義,以符號@@打頭。
    局部變量聲明使用Declare語句,這個變量必須以符號@開頭,后跟一個標識符。
    Declare?@變量名??數據類型[,@變量名??數據類型,……]
    變量賦值使用Select語句,未賦值的變量其值為Null。
    舉例:
    Declare?@msg?char(50)
    Select?@msg=’How?are?you?’
    Select?@msg=emp_name?from?employee
    ???Where?emp_id=12345678
    2.SQL語句塊
    Begin
    Statement?Block/*多個順序執行的SQL?語句*/
    End
    3.條件語句
    If?條件表達式
    ??語句(塊)
    Else
    ??語句(塊)
    舉例:
    if(select?max(id)?from?sysobjects)<50
    ??print?‘數據庫里沒有用戶創建的對象‘
    else
    ??select?name,type,id?from?sysobjects?where?id>50
    4.循環語句
    While?條件表達式
    ????語句(塊)
    ●兩個特殊的循環控制語句:
    ??Continue?執行下一次循環
    ??Break????退出當前循環
    舉例:
    While(select?avg(price)?from?titles)>$20
    ??Begin
    ???Update?titles?set?price=price/2
    ???If(select?avg(price)?from?titles)<$40
    ?????Break
    ???Else
    ?????Continue
    End
    5.其它控制語句
    ◇Return語句——無條件結束當前過程,并可返回給調用者的一個狀態值:Return[整數表達式]
    ◇Print語句
    ◇RaiseError語句
    ◇Waitfor語句
    三、存儲過程
    ????存儲過程是存儲在服務器端的一類數據庫對象,它實質上是一段用SQL語言編寫的程序,它在服務器端預先經過編譯,并確定出執行計劃,因此與同樣功能的批處理語句相比,它的執行速度較快。
    基本語法:
    Create?Procedure[owner.]過程名
    [@參數名??數據類型[=默認值][Output]]
    [,@參數名??數據類型[=默認值][Output]]
    [……]
    AS
    Begin
    ??SQL語句(塊)
    End
    存儲過程是數據庫對象,和表、索引是一個級別的;是SQL語句和控制流語言的集合,存儲過程在首次運行時被編譯,并駐留在過程高速緩存的內存中,所以存儲過程的招待非常快。存儲過程可以帶參數,可以調用其他過程,返回狀態值,返回參數值,并且可以在遠程SQL?Server執行。可以在遠程SQL?Server執行對數據庫設計有特別重要的意義。SQL?Server提供的存儲過程稱為系統過程。
    存儲過程大大增強了SQL的能力、效率和靈活性,經過編譯的存儲過程極大地改善SQL語句和批處理的性能。
    存儲過程有很多優點:
    ●存儲過程在第一次執行時編譯,并存儲在過程高速緩存的內存中。編譯時系統對其進行優化,以選擇最佳的路徑來訪問數據集中的數據,這種優化考慮了數據集的實際數據結構。因此存儲過程大大提高了系統的性能。
    ●存儲過程可以跨服務器運行。這一點是通過觸發器來實現的,當然,首先存儲過程要能登錄到該遠程服務器。
    ●應用程序也能執行存儲過程,從而實現服務器和客戶之間的協同作業。
    ●存儲過程減少了網絡的交通。這是因為存儲過程的文本存儲在數據庫里,調用存儲過程時通過網絡的只是存儲過程的過程名。
    ●利用存儲過程可以提供一個附加的安全層。
    如(該例子取自pubs2數據庫):
    Create?proc?titleid_proc(@title_id?varchar(80))
    As
    Begin?
    ??????Select?@title_id=lower(@title_id)+”%”
    ??Select?title,title_id,price
    ????Form?titles
    ????Where?lower(title_id)?like?@title_id
    Return?@@rowcount
    End
    ????注意例子中的黑體部分,這實際上是一條賦值語句。該存儲過程有返回值。
    存儲過程可以變得非常復雜。我們認為,創建存儲過程還是要遵循“最簡單就是最好”的原則。建議在創建存儲過程時采用縮進風格,否則創建的存儲過程三天之后連自己都看不懂。
    需要對存儲過程作些說明:
    ●Create?procedure?語句不能和其他語句在同一個批命令里。
    ●Create?procedure?語句不能包括下列語句:
    ??use
    ??Create?View
    ??Create?default
    ??Create?rule
    ??Create?trigger
    ??Create?procedure
    不能使用use語句好理解,存儲過程是針對數據庫的,不能在一個數據庫里訪問另外的數據庫。如果在存儲過程里訪問另外的數據庫,則數據庫表的參照完整性難于得到保障。
    從另外幾條語句看,在存儲過程里一般不能創建新的數據庫對象。但可以創建表和索引,以及和表相關聯的鍵,表是臨時表,在存儲過程結束后不能看見創建的臨時表;否則的話每運行一次存儲過程就創建一個表,結果可想而知。
    存儲過程里不能創建一個對象,刪除它;然后又在同一存儲過程里用相同的名字創建新的對象。實際上,SQL?Server在存儲過程運行時而不是在編譯時創建對象的。
    ●如果存儲過程調用另外的存儲過程,則第二個存儲過程可以調用在第一個存儲過程里創建的對象。
    ●存儲過程包含的最多參數為255個,對存儲過程里的局部和全局變量沒有限制。
    最后討論一下系統存儲過程。系統存儲過程以sp_開頭,當然用戶創建的存儲過程也可以以sp_開頭;系統過程保存在sybsystemprocs數據庫里。系統過程的使用有權限,如果打入系統過程名但沒有出現預期的結果,要么是命令名錯,要么是使用者沒有該過程的權限。一般可通過系統管理員或數據庫所有者對系統過程的execute授權。
    系統過程繁多,大致有幾類:
    a.?用戶標志和授權。這一類的過程主要由于:增加、刪除或報告在SQL?Server上的登錄,增加、刪除或報告某數據庫的用戶、分組或別名等。這類過程有sp_addlogin,sp_adduser,sp_helpgroup,sp_dropuser等。
    b.?遠程過程的調用。這類過程用于:增加、刪除或報告能存取本SQL?Server的遠程服務器;增加能從遠程服務器上存取本SQL?Server的用戶名。這類過程有:sp_addremotelogin,sp_addserver,sp_dropserver等。
    c.?數據定義和數據庫對象。這類存儲過程用于:連接和定義規則和缺省值,增加、刪除或報告主碼、外碼和公共碼;增加、刪除或報告用戶定義的數據類型。這類存儲過程有:sp_bindfault,?sp_bindrule,?sp_help,?sp_helpdb,?sp_foreignkey,?sp_helptext等。
    d.?系統管理。這類存儲過程用于:增加、刪除或報告數據庫及轉儲設備;報告鎖;設置的數據庫選擇及用戶正進行的進程;修改及報告配置變量;監控SQL?Server的活動。這類過程有:sp_addumpdevice,sp_dropdevice,?sp_helpdevice等。
    四、觸發器
    觸發器是一種用來保障參照完整性的特殊的存儲過程,它維護不同表中數據間關系的有關規則。當對指定的表進行某種特定操作(如:Insert,Delete或Update)時,觸發器產生作用。觸發器可以調用存儲過程。
    創建觸發器的語法:
    Create?Trigger[owner.]觸發器名
    On?[owner.]表名
    For?{insert,update,delete}
    As
    Begin
    ??SQL語句(塊)
    End
    定義一個好的觸發器對簡化數據的管理,保證數據庫安全都有重要的影響。觸發器是針對表一級的,這就意味著,只有表的所有者有權創建表的觸發器。
    舉例:
    插入一個新行,必須保證外鍵與主鍵相匹配,觸發器應該首先檢查被插入行與主鍵表的連接。
    以下的觸發器對inserted表和titles表的title_id進行比較,這里假設正在給外鍵輸入數據,沒有插入空值,若連接失敗,事務被回退。insert,update,delete
    Create?trigger?forinsertrigl
    ??On?salesdetail
    ??For?insert
    ??As
    ??If(select?count(*)
    ??From?title,inserted
    ??Where?titles.title_id=inserted.title_id)!=@@rowcount
    ????Begin
    ??????Rollback?transaction
    ??????Print?“No,some?title_id?does?not?exist?in?titles.”
    ????End
    ??Else
    ?????Print?“Added!?All?the?title_id?is?exist?in?titles.”
    在本例中,@@rowcount代表添加到salesdetail表的行數,這也是添加到inserted表中的行數。通過連接表titles和表inserted來檢測所有添加到salesdetail的title_id是否在titles中存在。若所連接的行數(count(*))與@@rowcount不同,由有一個或多個插入不正確,整個事務被取消。
    觸發器的限制:
    ●一個表最多只能有三個觸發器,insert,update,delete
    ●每個觸發器只能用于一個表
    ●不能對視圖、臨時表創建觸發器
    ●Truncate?table能刪除表,但不能觸發觸發器
    ●不能將觸發器用于系統
    合理地使用觸發器對性能的影響是正面的。在設計和使用觸發器時,經常地用sp_depends命令了解對象所關聯的觸發器是有好處的,該命令能列出觸發器影響的所有對象、表和視等。
    在定義幾類數據庫對象的時候,對存儲過程、索引和觸發器要給予特別的注意,尤其存儲過程,它設計的好壞對數據庫性能的影響很大。
    說明:Sybase觸發器使用的兩個測試表:Deleted表和Inserted表,它們都是臨時表,其結構與觸發器的基表結構相同,用來存放與修改相關的數據行。
    五、游標
    ????1.游標的概念
    游標是指向查詢結果集的一個指針,它是一個通過定義語句與一條Select語句相關聯的一組SQL語句。游標包含兩方面的內容:
    ●游標結果集:執行其中的Select語句所得到的結果集;
    ●游標位置:一個指向游標結果集內的某一條記錄的指針
    利用游標可以單獨操縱結果集中的每一行。游標在定義以后存在兩種狀態:關閉和打開。當游標關閉時,其查詢結果集不存在;只有當游標打開時,才能按行讀取或修改結果集中的數據。
    2.使用游標
    一個應用程序可以使用兩種類型的游標:前端(客戶)游標和后端(服務器)游標,它們是兩個不同的概念。
    無論使用哪一種游標,都需要經過如下幾個步驟:
    ●定義游標
    ●打開游標
    ●從游標中操作數據
    ●關閉游標
    下面講述的是后端(服務器)游標。
    (1)定義游標
    在使用游標之前必須聲明它。聲明指定定義游標結果集的查詢。通過使用for?update或for?read?only關鍵詞將游標顯式定義成可更新的或只讀的。
    Declare?cursor語法為:
    For?select_statement
    [for{read?only|update[of?colum_name_list]}]
    舉例:
    declare?pubs_crsr?cursor
    for?select?pub_name,city,state
    from?publishers
    for?update?of?city,state
    (2)打開游標
    open的語法為:
    ????open??游標名
    在聲明游標后,必須打開它以便用fetch,update,delete讀取、修改、刪除行。在打開一個游標后,它將被放在游標結果集的首行前,必須用fetch語句訪問該首行。
    (3)從游標中讀取數據
    在聲明并打開一個游標后,可用fetch命令從游標結果集中獲取數據行。
    Fetch的語法為:
    Fetch?游標名[into?變量列表]
    舉例:fetch?pub_crsr?into?@name,@city,@state
    SQL?Server在每次讀取后返回一個狀態值。可用@@sqlstatus訪問該值,下表給出了可能的@@sqlstatus值及其意義。
    值意??義
    0Fetch語句成功
    1Fetch語句導致一錯誤
    2結果集沒有更多的數據,當前位置位于結果集最后一行,而客戶對該游標仍發出Fetch語句時。
    若游標是可更新的,可用update和delete語句來更新和刪除行。
    刪除游標當前行的語法為:
    delete[from]表名
    where?current?of?游標名
    舉例:delete?from?authors?where?current?of?authors_crsr
    當游標刪除一行后,SQL?Server將游標置于被刪除行的前一行上。
    更新游標當前行的語法為:
    update?表名
    ??set?column_name1={expression1|NULL|(select_statement)}
    ??[,column_name2={expression2|NULL|(select_statement)}
    [……]
    where?current?of?游標名
    舉例:
    update?publishers
    set?city=”Pasadena”,state=”CA”
    ??where?current?of?pubs_crsr
    (4)關閉游標
    當結束一個游標結果集時,可用close關閉。該語法為:
    close?游標名
    關閉游標并不改變其定義,可用open再次打開。若想放棄游標,必須使用deallocate釋放它,deallocater的語法為:
    deallocater?cursor?游標名
    deallocater語句通知SQL?Server釋放Declare語句使用的共享內存,不再允許另一進程在其上執行Open操作。
    六、事務——維持數據一致性和恢復
    ????1.事務的定義
    事務提供了一種將T-SQL語句分組的方法,從而使它們能夠被當成一個單元來處理:組中所有語句或都執行,或都不執行。
    事務是確保一個或多個SQL語句的集合不被當成單一工作單元處理的機制,SQL?Server自動將所有數據修改命令,包括單步改變請求,作為事務處理,缺省時,每個insert、update、delete語句被當成一個事務處理。
    2.事務的作用
    事務使SQL?Server能保證:
    ·一致性——同時發生的查詢或改變請求彼此不沖突,用戶不能對正處于改變過程的數據進行查看或操作。
    ·恢復——在系統失效時,數據庫的恢復是完全的和自動的。
    3.使用事務
    a.?開始和確認事務
    begin?transaction和commit?transaction可將任意數目的SQL語句封裝起來,這兩名的簡單語法為:
    begin?transaction
    commit?transaction
    b.?回退事務
    在commit?transaction命令提交前任何時候可取消或回退事務,該命令的簡單語法為:
    rollback?transaction
    4.檢查事務狀態
    全局變量@@transtate記錄了事務當前的狀態。在執行一個語句后SQL?Server通過記錄所有事務變化來確定返回何種狀態。
    @@transtate可包含下列值:
    值意??義
    0事務進行中:一個顯式或隱式事務有效;上一語句執行成功
    1事務完成:事務完成并提交其變化
    2語句異常中止:上一語句異常終止;對事務無影響
    3事務異常中止:事務異常中止并回退所有變化
    舉例:在事務中,可在一個語句(如insert)后使用@@transtate確定該語句成功或失敗對事務的影響。commit?transaction
    Begin?transaction
    ??Insert?into?publishers(pub_id)values(‘9999’)
    ??(1?row?affected)
    ??select?@@transtate
    …………………
    ????0
    ???commit?transaction
    ??select?@@transtate
    …………………
    ????0
    (1?row?affected)
    posted on 2006-09-06 11:20 水煮三國 閱讀(1539) 評論(0)  編輯  收藏 所屬分類: Sybase
    <2006年9月>
    272829303112
    3456789
    10111213141516
    17181920212223
    24252627282930
    1234567

    常用鏈接

    留言簿(4)

    隨筆分類(85)

    隨筆檔案(89)

    文章分類(14)

    文章檔案(42)

    收藏夾(37)

    java

    oracle

    Sybase

    搜索

    •  

    積分與排名

    • 積分 - 210813
    • 排名 - 266

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 亚洲精品自产拍在线观看动漫| a高清免费毛片久久| 久久国产亚洲精品麻豆| 成人免费看吃奶视频网站| 暖暖免费在线中文日本| 曰批全过程免费视频观看免费软件| 亚洲精品中文字幕无乱码麻豆| 亚洲国产精品成人久久| 亚洲av无码成人精品区在线播放| 在线v片免费观看视频| 一区二区三区四区免费视频 | 成人在线免费视频| 国产精品亚洲专区在线观看| 亚洲国产女人aaa毛片在线| 亚洲深深色噜噜狠狠爱网站| 男人的天堂亚洲一区二区三区 | 亚洲中文无韩国r级电影| 午夜免费福利网站| av免费不卡国产观看| 67194国产精品免费观看| 免费国产叼嘿视频大全网站| eeuss免费影院| 一级做a爰黑人又硬又粗免费看51社区国产精品视 | 最新精品亚洲成a人在线观看| 波多野结衣一区二区免费视频| 麻豆精品国产免费观看| 毛片a级毛片免费播放下载| 国产va精品免费观看| 亚洲精品动漫免费二区| 可以免费看的卡一卡二| 嘿嘿嘿视频免费网站在线观看| 91嫩草免费国产永久入口| 久久久精品2019免费观看| 8090在线观看免费观看| 91免费福利精品国产| 最近在线2018视频免费观看| **真实毛片免费观看 | 亚洲精品第一国产综合精品| 中文字幕亚洲综合久久| 亚洲毛片免费视频| 亚洲首页国产精品丝袜|