posts - 89,  comments - 98,  trackbacks - 0
          第一講??Sybase基礎(chǔ)知識(shí)

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








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








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

          第二講??數(shù)據(jù)庫(kù)設(shè)備與存儲(chǔ)空間管理









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

          創(chuàng)建轉(zhuǎn)儲(chǔ)設(shè)備:
          sp_addumpdevice{‘disk’|’tape’}
          Logical_Name,
          Physical_Name,
          TapeSize

          3.默認(rèn)設(shè)備
          在沒(méi)有指定設(shè)備的情況下,用戶創(chuàng)建的任何數(shù)據(jù)對(duì)象自動(dòng)存放在默認(rèn)設(shè)備上。
          初始安裝后,系統(tǒng)的主設(shè)備master被預(yù)指定為默認(rèn)設(shè)備,因此要盡快創(chuàng)建自己的默認(rèn)設(shè)備。確保以下設(shè)備不是默認(rèn)設(shè)備:系統(tǒng)主設(shè)備、指定僅被日志使用的設(shè)備。
          Sp_diskdefault?設(shè)備名[,DefaultOn|DefaultOff]

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

          END
          ?

          第三講??數(shù)據(jù)庫(kù)與事務(wù)日志

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




          Data_dev????????Index_dev????????log_dev
          (3)如果將數(shù)據(jù)庫(kù)和日志放在同一設(shè)備上,就不能實(shí)現(xiàn)增量備份;
          (4)通常將System和Default段縮減范圍到一個(gè)設(shè)備上,如刪除設(shè)備Index_dev上的System段和Default段,創(chuàng)建新的段,用來(lái)存放專門(mén)的數(shù)據(jù)庫(kù)對(duì)象。
          二、更改數(shù)據(jù)庫(kù)
          1.改變數(shù)據(jù)庫(kù)屬主
          通常用戶數(shù)據(jù)庫(kù)系統(tǒng)管理員創(chuàng)建,它的默認(rèn)屬主是dbo。系統(tǒng)過(guò)程sp_changeddbowner可改變數(shù)據(jù)庫(kù)的屬主關(guān)系,它必須由數(shù)據(jù)庫(kù)管理員在要改變屬主關(guān)系的數(shù)據(jù)庫(kù)中執(zhí)行。語(yǔ)法如下:
          sp_changeddbowner?login_name[,True]
          其中參數(shù)True用于將權(quán)限一半傳遞給新屬主。
          2.?dāng)U展數(shù)據(jù)庫(kù)
          (1)擴(kuò)展數(shù)據(jù)庫(kù)空間
          alter?database?數(shù)據(jù)庫(kù)
          ?????????on?設(shè)備名=擴(kuò)展空間??//單位:M
          ?????????如果擴(kuò)展的設(shè)備對(duì)于數(shù)據(jù)庫(kù)是新的,System和Default段會(huì)自動(dòng)擴(kuò)展到該設(shè)備上。
          (2)擴(kuò)展事務(wù)日志到新的設(shè)備上
          ??sp_logdevice?數(shù)據(jù)庫(kù)名,設(shè)備名
          舉例:將數(shù)據(jù)庫(kù)另外擴(kuò)充5M,用于存儲(chǔ)日志
          ?????alter?database?my_db
          ????????????on?my_dev=5
          ?????go
          ?????sp_logdevice?my_db,my_dev
          ?????go

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

          第四講??數(shù)據(jù)庫(kù)安全性與用戶管理

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

          Revoke?對(duì)象權(quán)限組合?on?數(shù)據(jù)庫(kù)對(duì)象?to?public|組名|用戶名|角色
          From?public?public|組名|用戶名|角色
          [Cascade]
          授權(quán)與收權(quán)舉例:
          ◇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
          ?

          第五講??數(shù)據(jù)庫(kù)的備份與恢復(fù)

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

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

          周一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

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

          第六講??數(shù)據(jù)庫(kù)與T-SQL語(yǔ)言

          一、關(guān)系模型的基本概念
          關(guān)系數(shù)據(jù)庫(kù)以關(guān)系模型為基礎(chǔ),它有以下三部分組成:
          ●數(shù)據(jù)結(jié)構(gòu)——模型所操作的對(duì)象、類型的集合
          ●完整性規(guī)則——保證數(shù)據(jù)有效、正確的約束條件
          ●數(shù)據(jù)操作——對(duì)模型對(duì)象所允許執(zhí)行的操作方式
          關(guān)系(Relation)是一個(gè)由行和列組成的二維表格,表中的每一行是一條記錄(Record),每一列是記錄的一個(gè)字段(Field)。表中的每一條記錄必須是互斥的,字段的值必須具有原子性。
          二、SQL語(yǔ)言概述
          ??SQL(結(jié)構(gòu)化查詢語(yǔ)言)是關(guān)系數(shù)據(jù)庫(kù)語(yǔ)言的一種國(guó)際標(biāo)準(zhǔn),它是一種非過(guò)程化的語(yǔ)言。通過(guò)編寫(xiě)SQL,我們可以實(shí)現(xiàn)對(duì)關(guān)系數(shù)據(jù)庫(kù)的全部操作。
          ●數(shù)據(jù)定義語(yǔ)言(DDL)——建立和管理數(shù)據(jù)庫(kù)對(duì)象
          ●數(shù)據(jù)操縱語(yǔ)言(DML)——用來(lái)查詢與更新數(shù)據(jù)
          ●數(shù)據(jù)控制語(yǔ)言(DCL)——控制數(shù)據(jù)的安全
          T-SQL語(yǔ)言是Sybase對(duì)SQL92標(biāo)準(zhǔn)的一種擴(kuò)展,主要在它的基礎(chǔ)上增加了三個(gè)方面的功能:自己的數(shù)據(jù)類型/特有的SQL函數(shù)/流程控制功能
          T-SQL中的標(biāo)識(shí)符使用說(shuō)明:
          (1)標(biāo)識(shí)符由1-30個(gè)字符或數(shù)字構(gòu)成,但首字符必須為字母。臨時(shí)表的表名以#開(kāi)頭,長(zhǎng)度不能超過(guò)13個(gè)字符。
          (2)數(shù)據(jù)庫(kù)對(duì)象的標(biāo)識(shí)方法舉例
          database.owner.tablename.columnname
          執(zhí)行遠(yuǎn)程存儲(chǔ)過(guò)程:
          EXEC?server.db.owner.proc_name
          當(dāng)執(zhí)行語(yǔ)句在批處理的句首時(shí),EXEC可以省略。
          三、Sybase的數(shù)據(jù)類型
          ????在創(chuàng)建表或聲明局部變量時(shí),必須使用Sybase系統(tǒng)預(yù)定義類型。
          1.字符類型
          Char(n)???VarChar(n)
          2.?dāng)?shù)值類型
          整數(shù)類型——Integer??SmallInt??TinyInt
          浮點(diǎn)類型——Real??Float??Number[P,S]??Decimal[P,S]
          貨幣類型——Money??SmallMoney
          3.日期/時(shí)間類型
          Datetime??SmallDatetime
          兩者時(shí)間部分的精度不同,前者精確到分,后者精確到1/30秒。
          4.文本和圖像類型
          Text??Image
          5.二進(jìn)制數(shù)據(jù)類型
          Binary(n)??VarBinary(n)
          四、數(shù)據(jù)定義語(yǔ)言
          用來(lái)定義數(shù)據(jù)庫(kù)對(duì)象。數(shù)據(jù)庫(kù)對(duì)象是Sybase用來(lái)存儲(chǔ)數(shù)據(jù)的邏輯實(shí)體,主要有:
          表(Table)、視圖(View)、臨時(shí)表(Temp?Table);
          主鍵(Primary?Key)、外鍵(Foreign?Key)、索引(Index)、規(guī)則(Rule)、默認(rèn)值(Default);
          存儲(chǔ)過(guò)程(Stored?Procedure)、觸發(fā)器(Trigger)
          ●基本語(yǔ)法
          下面給出創(chuàng)建主要數(shù)據(jù)庫(kù)對(duì)象的語(yǔ)法:
          1.表
          創(chuàng)建表的基本語(yǔ)法是:
          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)}]}…

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

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

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

          符號(hào)運(yùn)算
          +加
          -減
          /除
          *乘
          %取模
          如select?title_id,total_sales,total_sales*2?from?titles
          例5:使用distinct消除重復(fù)的查詢結(jié)果
          可選的關(guān)鍵詞消除select語(yǔ)句的結(jié)果中的重復(fù)行。若不指定distinct,缺省值為all,將檢索出包含重復(fù)行的所有行數(shù)據(jù)。
          如:select?distinct?au_id?from?titleauthor
          例6:選擇行——where語(yǔ)句
          select語(yǔ)句中的確切指定要檢索哪些行的準(zhǔn)則,其一般格式為:
          select?select_list?from?table_list?where?search_conditions
          where子句中的搜索條件(或稱限制)包括:
          ·比較運(yùn)算符(=,<,>,!=等=
          如: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
          ·以上各項(xiàng)的組合(and,?or)
          ??如:where?advance<5000?or?total_sales?between?500?and?1000
          例7:用集合函數(shù)小結(jié)查詢結(jié)果
          集合函數(shù)用特定列的數(shù)據(jù)來(lái)計(jì)算小結(jié)值。
          集合函數(shù)結(jié)??果
          Sum([all|distinct]expression)數(shù)值列中(不重復(fù))值的總和
          Avg([all|distinct]expression)數(shù)值列中(不重復(fù))值的平均
          count([all|distinct]expression)列中(不重復(fù))非空值的數(shù)目
          Count(*)選定的行數(shù)
          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:分組組織查詢結(jié)果——group?by?子句
          ??????group?by?子句用在select語(yǔ)句中將一張表分成若干組。
          如:select?type,?advance?from?titles?group?by?type
          例9:選擇分組數(shù)據(jù)——having子句
          ??????having為group?by?子句設(shè)置條件,與where為select語(yǔ)句設(shè)置條件一樣。Having搜索條件與where相同,但having可包括集合函數(shù),而where不能包括。
          下列語(yǔ)句使用帶集合函數(shù)having子句的例子。它把title表中的行按類型分組,但去掉了那只包含一本書(shū)的分組。
          Select?type?from?titles?group?by?type?having?count(*)>1
          下面是一個(gè)不帶集合函數(shù)的having子句的例子。它把title表中的行按類型分組,但去掉了那些不以字母“p”開(kāi)頭的類型。
          Select?type?from?titles?group?by?type?having?type?like?“p%”
          例10:查詢結(jié)果排序——order?by子句
          Order?by子句允許按一列或多列對(duì)查詢結(jié)果排序。每個(gè)排序可以是升序的(asc)或降序的(desc)。若不特別指明,則按升序進(jìn)行。下列查詢返回按pub_id排序的結(jié)果:
          Select?pub_id,type,title_id?from?titles?order?by?pub_id
          例11:連接——從多張表中檢索數(shù)據(jù)
          連接兩張或兩張以上的表是這樣一個(gè)過(guò)程:比較指定字段中的數(shù)據(jù),根據(jù)比較結(jié)果用符合條件的行組成一張新表。
          舉例:
          select?publishers.pub_id,publishers.pub_name,authors.*
          from?publishers,authors
          where?publishers.city=authors.city
          例12:分組計(jì)算子句
          Compute是Sybase對(duì)SQL標(biāo)準(zhǔn)中Group子句的擴(kuò)充,可以將其看作帶聚集計(jì)算的Group子句。例如:
          Select?type,price,advance
          From?titles
          Order?by?type
          Compute?sum(price),sum(advance)?by?type
          2.Insert語(yǔ)句
          用Insert命令向數(shù)據(jù)庫(kù)中添加行有兩種方法:使用關(guān)鍵詞values或使用select語(yǔ)句。
          Insert語(yǔ)句的基本語(yǔ)法為:
          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語(yǔ)句
          Delect可以對(duì)一行或多行進(jìn)行操作。
          Delect語(yǔ)句的基本語(yǔ)法為:
          Delect?表名
          [from?表名列表]
          [where條件表達(dá)式]
          舉例:Delect?publishers
          ????????where?pub_name=”Jardin,Inc.”
          ??????Delect?titles
          ????????From?authors,?titles
          ????????Where?titles.title_id=authors.title_id
          4.Update語(yǔ)句
          可以使用Update命令來(lái)改動(dòng)表中的單個(gè)行、一組行或所有行。
          Update語(yǔ)句的基本語(yǔ)法為:
          Update表名
          ??Set?column_name1={expression1|null|(select_statement)}
          ???[,column_name2={expression2|null|(select_statement)}]
          ???[……]
          ???[from?表名列表]
          ???[where?條件表達(dá)式]
          舉例:
          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預(yù)定義函數(shù)
          1.聚集函數(shù)
          sum([all|distinct]表達(dá)式)
          avg([all|distinct]表達(dá)式)
          count([all|distinct]表達(dá)式)
          count(*)
          max(表達(dá)式)
          min(表達(dá)式)
          2.字符串函數(shù)
          upper(字符表達(dá)式)
          lower(字符表達(dá)式)
          char(整型表達(dá)式)
          char_length(字符表達(dá)式)
          ltrim(字符表達(dá)式)
          rtrim(字符表達(dá)式)
          ……
          3.?dāng)?shù)學(xué)函數(shù)
          abs(精確小數(shù)型表達(dá)式)
          floor(精確小數(shù)型表達(dá)式)求小于或等于給定表達(dá)式值的最大整數(shù)(取底)
          rand([整數(shù)型]
          round(精確小數(shù)型表達(dá)式,整數(shù))
          sign(精確小數(shù)型表達(dá)式)
          power(精確小數(shù)型表達(dá)式,整數(shù)冪)
          ……
          4.日期函數(shù)
          getdate()
          datepart(日期部分,日期)
          datediff(日期部分,日期1,日期2)
          dateadd(日期部分,數(shù)值表達(dá)式,日期)
          5.類型轉(zhuǎn)換函數(shù)
          convert(數(shù)據(jù)類型,表達(dá)式[,格式])
          6.系統(tǒng)函數(shù)
          db_name([數(shù)據(jù)庫(kù)ID])
          host_name()
          isnull(表達(dá)式1,表達(dá)式2)
          ……
          七、數(shù)據(jù)控制語(yǔ)言
          用來(lái)控制數(shù)據(jù)的安全性,如權(quán)限控制語(yǔ)句GRANT和REVOKE等。
          ?

          第七講??數(shù)據(jù)庫(kù)編程基礎(chǔ)

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

          常用鏈接

          留言簿(4)

          隨筆分類(85)

          隨筆檔案(89)

          文章分類(14)

          文章檔案(42)

          收藏夾(37)

          java

          oracle

          Sybase

          搜索

          •  

          積分與排名

          • 積分 - 211110
          • 排名 - 265

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 蒙自县| 资溪县| 贞丰县| 武宣县| 丰镇市| 兖州市| 栖霞市| 古交市| 太保市| 千阳县| 安塞县| 肥城市| 手游| 孝昌县| 屯留县| 盐津县| 巴彦淖尔市| 望奎县| 拉萨市| 章丘市| 保山市| 兴和县| 合江县| 张掖市| 永安市| 高安市| 白玉县| 隆化县| 云霄县| 将乐县| 石台县| 潢川县| 新田县| 安陆市| 绥宁县| 淳安县| 青阳县| 朝阳区| 灵山县| 黄梅县| 天镇县|