中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當前位置: 首頁 > news >正文

網(wǎng)站后臺模板免費下載搜索引擎都有哪些

網(wǎng)站后臺模板免費下載,搜索引擎都有哪些,電商網(wǎng)站開發(fā)資金預算,重慶教育網(wǎng)站建設第一講 Sybase基礎知識 一、客戶/服務器體系結構 Sybase是一種建立在客戶/服務器體系結構上的數(shù)據(jù)庫管理系統(tǒng)。 ●什么是客戶/服務器體系結構? 從硬件角度看,客戶/服務器體系結構是指將某項任務在兩臺或多臺機器之間進行分配,其中客戶機 &…

第一講??Sybase基礎知識

一、客戶/服務器體系結構
Sybase是一種建立在客戶/服務器體系結構上的數(shù)據(jù)庫管理系統(tǒng)。
●什么是客戶/服務器體系結構?
從硬件角度看,客戶/服務器體系結構是指將某項任務在兩臺或多臺機器之間進行分配,其中客戶機

(Client)用來運行提供用戶接口和前端處理的應用程序,服務器機(Server)提供客戶機使用的各種

資源和服務。從軟件角度看,客戶/服務器體系結構是把某項應用或軟件系統(tǒng)按邏輯功能劃分為客戶軟件

部分和服務器軟件部分??蛻糗浖糠忠话阖撠煍?shù)據(jù)的表示和應用,處理用戶界面,用以接收用戶的數(shù)

據(jù)處理請求并將之轉(zhuǎn)換為對服務器的請求,要求服務器為其提供數(shù)據(jù)的存儲和檢索服務;服務器端軟件

負責接收客戶端軟件發(fā)來的請求并提供相應服務??蛻?服務器融合了大型機的強大功能和中央控制以及

PC機的低成本和較好的處理平衡??蛻?服務器為任務的集中/局部分布提供了一種新的方法,這種體系

能夠使用戶對數(shù)據(jù)完整性、管理和安全性進行集中控制。在緩解網(wǎng)絡交通和主機負荷以及滿足用戶需要

方面,客戶/服務器體系提供了良好的解決方案。
總之,客戶/服務器的工作模式是:客戶與服務器之間采用網(wǎng)絡協(xié)議(如TCP/IP、IPX/SPX)進行連接

和通訊,由客戶端向服務器發(fā)出請求,服務器端響應請求,并進行相應服務。
數(shù)據(jù)庫應用的客戶/服務器模式如下圖所示:


二、訪問Sybase服務器的基本過程
1.建立客戶與服務器之間的連接,包括網(wǎng)絡連接、客戶進程與服務器進程之間的連接;
2.客戶端通過網(wǎng)絡發(fā)送SQL語句給服務器,用來查詢或操作服務器中的數(shù)據(jù)或數(shù)據(jù)庫對象;
3.服務器接收到SQL語句后,對其進行語法分析、優(yōu)化和編譯后執(zhí)行;
4.如果執(zhí)行的語句產(chǎn)生一個結果集,服務器通過網(wǎng)絡把結果集返回給客戶;
5.客戶端對收到的結果作相應的處理。
在客戶/服務器體系,有兩種數(shù)據(jù)庫引擎結構,即多進程數(shù)據(jù)庫引擎和單進程、多線程引擎結構。
多進程結構即多個可執(zhí)行程序同時運行。每當用戶登錄到數(shù)據(jù)庫系統(tǒng)時實際上都啟動了數(shù)據(jù)庫引擎

的一個獨立實例。存在起協(xié)調(diào)作用的進程協(xié)調(diào)進行之間的通訊以保證當多用戶訪問相同數(shù)據(jù)時數(shù)據(jù)的

完整性。多進程數(shù)據(jù)庫引擎一般用在大型機數(shù)據(jù)庫上。
單進程多線程數(shù)據(jù)庫引擎在原理上和多進程數(shù)據(jù)庫引擎類似,不同的是多線程數(shù)據(jù)庫引擎自己負責調(diào)

度各應用程序占用CPU的時間,而不依賴于操作系統(tǒng)。這樣,多線程數(shù)據(jù)庫引擎自我保護的能力更強。
Oracle Server是一個真正的多進程數(shù)據(jù)庫引擎,Sybase數(shù)據(jù)庫管理系統(tǒng)采用的是單進程多線程的引擎結構。
三、Sybase產(chǎn)品概述
1.Sybase軟件的組成
Sybase軟件可劃分為三個部分:一是進行數(shù)據(jù)管理與維護的聯(lián)機關系數(shù)據(jù)庫管理系統(tǒng)Sybase SQL

?Server;二是支持數(shù)據(jù)庫應用系統(tǒng)的建立和開發(fā)的一組前端工具軟件Sybase SQL Tools;三是可把異

構環(huán)境下其他廠商的應用軟件和任何類型的數(shù)據(jù)連接在一起的接口軟件Open Client/Open Server。
SQL Server是個可編程的數(shù)據(jù)庫管理系統(tǒng)(DBMS),它是整個Sybase產(chǎn)品的核心軟件,起著數(shù)據(jù)管

理、高速緩沖區(qū)管理、事務管理的作用。
2.SQL Server的基本特征
SQL Server是個關系數(shù)據(jù)庫管理系統(tǒng),它具有如下一些基本特征:
a.SQL Server可以放在若干個磁盤設備上,初始安裝時所需的磁盤空間至少要17MB。
b.SQL Server支持多庫結構,也就是說Sybase系統(tǒng)中可以有多個數(shù)據(jù)庫。Sybase可以管理多個數(shù)據(jù)庫。
c.SQL Server可以編譯和運行T-SQL語句,并可返回客戶程序所要求的結果。T-SQL語句是標準SQL

的擴充,它除了有數(shù)據(jù)定義語句、數(shù)據(jù)操縱語句和數(shù)據(jù)控制語句之外,主要增加了流程控制語句。
d.SQL Server可以管理多個用戶并具有較高的事務吞吐量和較低的事務響應時間。
客戶的應用程序可以存取Server中某一個或幾個數(shù)據(jù)庫的數(shù)據(jù)。
四、SQL Server的主要內(nèi)容
Sybase SQL Server是一個多庫結構的RDBMS,體系結構大致如下:

1.數(shù)據(jù)庫
服務器自身所使用的數(shù)據(jù)庫,也可以說是管理服務器和用戶數(shù)據(jù)庫的數(shù)據(jù)庫。Sybase在安裝時,自動

創(chuàng)建了四個系統(tǒng)數(shù)據(jù)庫:
master、model、tempdb、sybsystemprocs
(1) master數(shù)據(jù)庫
它是管理和控制用戶數(shù)據(jù)庫以及維護服務器正常運行的核心數(shù)據(jù)庫,它保存了大量的系統(tǒng)信息,如服務

器配置、用戶、設備等。
在master數(shù)據(jù)庫中不允許普通用戶在其中創(chuàng)建數(shù)據(jù)庫對象,否則會使得master數(shù)據(jù)庫的事務日志很快變

滿。如果事務日志用盡,就無法使用dump transaction命令釋放master數(shù)據(jù)庫中的空間。
(2)model數(shù)據(jù)庫
它是為創(chuàng)建用戶數(shù)據(jù)庫而提供的模板。每當創(chuàng)建新的數(shù)據(jù)庫時,SQL Server自動建立model數(shù)據(jù)庫的一

份拷貝,并把它擴充到用戶所要求的大小,以此作為新用戶數(shù)據(jù)庫。Model數(shù)據(jù)庫中包含每個用戶數(shù)據(jù)庫

所要求的系統(tǒng)表。Model數(shù)據(jù)庫可以被修改以便定制新創(chuàng)建的。
(3)tempdb數(shù)據(jù)庫
它是個臨時數(shù)據(jù)庫,為服務器運行與處理提供一個共享的存儲區(qū)域,如group by和order by的中間結果

就存放在這里。Tempdb的空間為服務器中所有數(shù)據(jù)庫的所有用戶所共享。
每次重啟SQL Server,服務器的一個自動進程都拷貝model數(shù)據(jù)庫到tempdb數(shù)據(jù)庫,并清除tempdb中

原來的內(nèi)容。因此tempdb中的用戶表都是臨時的。臨時表分為兩類:可共享的和不可共享的。不可共

享的臨時表在由create table中將符號#置于表名之前創(chuàng)立;可共享的臨時表通過create table中指定表

名前綴tempdb..而創(chuàng)立。不可共享的臨時表SQL Server自動為其添加數(shù)字后綴名,且它只存在于當前會話中。
(4)sybsystemprocs數(shù)據(jù)庫master數(shù)據(jù)庫
它是專門用來保存系統(tǒng)命令(存儲過程)的數(shù)據(jù)庫,如sp_help、sp_configure、sp_helpdevice等。當

任一數(shù)據(jù)庫用戶運行以sp_開頭的存儲過程時,SQL Server按照以下順序查找:當前數(shù)據(jù)庫、

sybsystemprocs數(shù)據(jù)庫、master數(shù)據(jù)庫。
2.用戶數(shù)據(jù)庫
用戶數(shù)據(jù)庫是我們使用Sybase服務器的真正目的。要管理用戶數(shù)據(jù),必須在Sybase中創(chuàng)建自己

的數(shù)據(jù)庫,它是指用create database命令創(chuàng)建的數(shù)據(jù)庫。不能存取master數(shù)據(jù)庫的用戶是無權創(chuàng)

建新的數(shù)據(jù)庫的。
數(shù)據(jù)庫中的主要內(nèi)容——數(shù)據(jù)庫對象:
表、視圖、臨時表
索引、主鍵、外鍵
缺省值、規(guī)則
存儲過程、觸發(fā)器等
五、Sybase的安裝與配置
1.服務器端的安裝
安裝建立SQL Server以后,要建立放置數(shù)據(jù)庫、日志和索引的邏輯磁盤設備。數(shù)據(jù)庫、日志和索

引的配置應注意以下原則;
a.不要把任何用戶對象安裝在master數(shù)據(jù)庫中。
b.日志應該保存在與數(shù)據(jù)庫分離的磁盤上。
c.可以通過跨越多個設備分配工作優(yōu)化I/O性能。
2.客戶端的安裝
3.需要立即更改的內(nèi)容
(1)更改sa的登錄口令;(2)命名服務器;(3)修改文件名(保證Sybase Central正常啟動);

(4)更改缺省設備;(5)增加tempdb的空間。
4.創(chuàng)建用戶數(shù)據(jù)庫
以下通過一個建立數(shù)據(jù)庫的腳本說明建立數(shù)據(jù)庫的過程:
//創(chuàng)建數(shù)據(jù)庫設備,設備大小以頁(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ù)庫TEST_DB,其大小為20M,日志大小為10M
create database TEST_DB
on test_dbdev=20
log on test_logdev=10
go
//打開數(shù)據(jù)庫
use TEST_DB
go
5.系統(tǒng)管理的主要內(nèi)容
a.物理資源的管理
b.用戶及其權限管理
c.數(shù)據(jù)庫的備份與恢復
6.SQL Server的配置參數(shù)
服務器配置是系統(tǒng)管理員的職責,正確的配置對系統(tǒng)性能有重大的影響。有兩個系統(tǒng)表存儲

配置信息:sysconfigures和syscurconfigs;sysconfigures是永久性的,一旦系統(tǒng)運行,sysconfigures

的信息就拷貝到syscurconfigs中。顯示配置和改變配置使用系統(tǒng)過程sp_configure。
有兩種配置值:動態(tài)的和靜態(tài)的,動態(tài)值一旦改變立即生效,靜態(tài)值要在系統(tǒng)重啟動后才起作用。


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

一、概述
1.安裝初始化
初始安裝SQL Server時,安裝程序和腳本初始化主設備,并建立master、model、tempdb和

sybsystemprocs數(shù)據(jù)庫。系統(tǒng)數(shù)據(jù)庫、預定義設備和段按下列默認方式組織:
a.master、model、tempdb數(shù)據(jù)庫安裝在主設備master上;
b.sybsystemprocs數(shù)據(jù)庫安裝在安裝時選擇的設備上(sysprocsdev);
c.為每個數(shù)據(jù)庫創(chuàng)建三個預定義段:system、default和logsegment;
d.所有用戶創(chuàng)建數(shù)據(jù)庫的默認設備是master設備;
e.如果選擇安裝了審計數(shù)據(jù)庫sybsecurity,它位于自己的設備上。
2.設備與存儲管理考慮的主要問題
(1)恢復
物理磁盤崩潰時,磁盤鏡像或在單獨的物理設備上保存日志為數(shù)據(jù)庫恢復提供了兩種機制。
(2)性能
磁盤讀寫速度是I/O操作的瓶頸,正確地把數(shù)據(jù)庫對象放置到物理設備上有利于改進性能;
把日志和數(shù)據(jù)庫對象置于單獨的設備上可以提高系統(tǒng)性能;
把表放在一個硬盤上而把索引放在另一個硬盤上,由于把工作分置于兩個硬盤驅(qū)動器上,所以

可以確保物理讀寫速度加快;
磁盤鏡像會降低磁盤寫的速度。
二、設備(Device)
Sybase將數(shù)據(jù)庫中的所有數(shù)據(jù)存放在設備上。
1.設備的概念
設備是Sybase預先配置的專門存放數(shù)據(jù)庫的一塊連續(xù)的磁盤空間,并且它被映射到一操作系統(tǒng)

文件或一原始磁盤分區(qū)上。它有兩個對應的名稱:邏輯名和物理名。NT僅支持設備映射到文件。
設備與數(shù)據(jù)庫之間的關系:多對多關系。一個數(shù)據(jù)庫可以被創(chuàng)建或擴充到多個設備上,一個設備

也可以被用來存放多個數(shù)據(jù)庫。不同的設備操作系統(tǒng)可以對其并行地讀寫,因此我們可以人為地

將一個數(shù)據(jù)庫放置到多個數(shù)據(jù)庫設備上。
設備的分類:Database Device和Dump Device。數(shù)據(jù)庫設備存放數(shù)據(jù)庫和事務日志,轉(zhuǎn)儲設備用

來存放數(shù)據(jù)庫或日志的備份。
2.設備的創(chuàng)建
命令語法:
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
注釋:邏輯名、物理名、設備虛擬號、設備大小

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

3.默認設備
在沒有指定設備的情況下,用戶創(chuàng)建的任何數(shù)據(jù)對象自動存放在默認設備上。
初始安裝后,系統(tǒng)的主設備master被預指定為默認設備,因此要盡快創(chuàng)建自己的默認設備。確保以下

設備不是默認設備:系統(tǒng)主設備、指定僅被日志使用的設備。
Sp_diskdefault 設備名[,DefaultOn|DefaultOff]

4.磁盤鏡像
磁盤鏡像是出于數(shù)據(jù)庫安全性的考慮,當介質(zhì)失敗時,磁盤鏡像能提供不間斷恢復。磁盤鏡像是磁盤

上的數(shù)據(jù)的絕對拷貝。如果某一硬盤事故發(fā)生,則該被損壞的拷貝就自動變成離線狀態(tài),因而所有的

讀寫都被引向未被損壞的拷貝。
Sybase的磁盤鏡像是在設備級上進行的,因此磁盤鏡像實質(zhì)上是設備鏡像。當對某一設備進行鏡像操

作時,Sybase自動創(chuàng)建一個附加設備,由鏡像處理程序?qū)⒃O備上的所有數(shù)據(jù)拷貝到鏡像設備上。
如果要使某一數(shù)據(jù)庫成為鏡像,被分配給該數(shù)據(jù)庫的每一設備都必須成鏡像。Master設備在服務器中

地位特殊,如果它損壞了,SQL Server將崩潰。因此,如果有可能總是要鏡像Master設備(在另一磁盤上)。
鏡像命令語法:
Disk Mirror
Name=’device_name’,//被鏡像的設備
Mirror=’physical_name’
[,writes=serial|noserial]
5.刪除設備
sp_dropdevice logical_name[,delfile]
含有數(shù)據(jù)庫的設備不允許刪除。
三、創(chuàng)建與使用段
? ? 段(Segment)是數(shù)據(jù)庫設備上磁盤空間的邏輯組合,它可以看作是指向一個或多個數(shù)據(jù)庫設備

的標簽。利用段可以控制數(shù)據(jù)庫對象的存放位置,可以將數(shù)據(jù)庫對象分類存放到不同的段上。
設備與段之間的關系:多對多關系。一個設備上可以創(chuàng)建多個段,一個段也可以覆蓋多個設備。
1.使用段的優(yōu)點
a. 控制空間的使用:放在一個段上的數(shù)據(jù)庫對象不會在段外增長;
b. 提高性能:處于不同磁盤設備上的段可以并行地讀寫;
d.處理大表:利用段,可以將一個大表分段放在獨立的物理設備上,如將一個表的文本或圖象數(shù)據(jù)

存儲另外的一個段上。
2.創(chuàng)建段
sp_addsegment 段名,數(shù)據(jù)庫名,設備名
說明:在指定設備上為某個數(shù)據(jù)庫創(chuàng)建一個段。
●擴展段的范圍
??sp_exetendsegment 段名,數(shù)據(jù)庫名,設備名
說明:設備在數(shù)據(jù)庫中必須可用,否則需要擴展數(shù)據(jù)庫到新的設備上;指定的段、數(shù)據(jù)庫、設備必

須存在。
●縮小段的范圍:
??sp_dropsegment 段名,數(shù)據(jù)庫名,設備名
說明:帶第三個參數(shù)時,該命令并不刪除段,只是段的范圍縮小了。若某個段包含了別的段要獨占

的設備,就需要縮小該段的范圍。
3.使用段
●兩個數(shù)據(jù)庫放在同一設備的不同段上,它們不會相互影響;
●當數(shù)據(jù)庫增加空間時,增加的空間會自動分配到它的每一個段上;
例如:alter database my_db
? ?? ?on data_dev=50
在data_dev設備上為my_db增加50M空間,這50M空間被自動分配到數(shù)據(jù)庫的每一個段中。注意:

如果data_dev對于數(shù)據(jù)庫是新的,system和default段會自動擴展到該設備上。
可以使用alter database命令的log on選項分配附加的日志空間。
(1)在段中創(chuàng)建新對象
create table 表名(列名 數(shù)據(jù)類型)[on 段名]
create [clusterd|non clusterd]index 索引名 on 表名(列名)[on 段名]
注意:按照定義,聚集索引總是與表放在同一段上。
(2)在段上放置現(xiàn)有對象
sp_placeobject 段名,對象名
注意:該命令并不把對象從一個數(shù)據(jù)庫設備移動到另一設備上,它只影響未來的空間分配。
可以將某個大表的text字段或image字段放置到一個單獨的設備段上。
Sp_placeobject 段名,“表名.字段名”
(3)在段上創(chuàng)建聚集索引
按照定義,聚集索引總是與表放在同一段上。如果在一個段上創(chuàng)建表,而在另一個段上創(chuàng)建聚集

索引,則其表與其索引一起移動,整個表將離開創(chuàng)建表的段而遷移到創(chuàng)建聚集索引的段中。通過

這種方法,可以快速而方便地把指定表移動到指定的設備上。
(4)系統(tǒng)預定義段
當用戶創(chuàng)建一個數(shù)據(jù)庫時,Sybase自動創(chuàng)建三個預定義的段:
system段:存放系統(tǒng)表(包括所有用戶對象的定義)
default段:存放用戶創(chuàng)建的各種對象,除非它們明顯地指定到不同的段上。
Logsegment段:存放數(shù)據(jù)庫的事務日志。
(5)刪除段
刪除段是縮小段范圍的一個特例:
sp_dropsegment 段名,數(shù)據(jù)庫名
4.使用閾值管理


閾值(Threshold)管理是一種自動監(jiān)控數(shù)據(jù)庫自由空間的機制,Sybase的閾值管理允許用戶為數(shù)

據(jù)庫的某個段上的自由空間設置閾值并定義相應的存儲過程。當該段上的自由空間低于所置頭閾值

時,Sybase自動運行相應的存儲過程。
在一個實際運行的數(shù)據(jù)庫中,日志的增長速度一般要高于數(shù)據(jù)的增長,一旦日志段的自由空間用盡

,SQL Server在默認情況下會掛起所有數(shù)據(jù)操縱事務,客戶端應用程序停止執(zhí)行。
在每個分離的段上存儲其事務日志的數(shù)據(jù)庫均自動設置有最后機會閾值(Last Chance Threshold),

其閾值是備份事務日志所需的自由空間的估計值。當該段上的自由空間低于所置閾值時,Sybase自動

運行名為sp_thresholdaction的存儲過程。該過程的名稱及參數(shù)由系統(tǒng)預定義,內(nèi)容由用戶編寫。下

面是一個簡單示例。
CREATE PROCEDURE dbo.sp_thresholdaction
/*本過程參數(shù)通過位置傳遞,名稱可以改變,但其定義及順序不能變*/
@db_name varchar(30),/*數(shù)據(jù)庫名*/
@seg_name varchar(30),/*段名*/
@space_lefe int,/*剩余自由空間*/
@status int/*最后機會閾值,其值為1,其它閾值,其值為0*/
AS
BEGIN
/*用戶編寫過程內(nèi)容*/
dump transaction @db_name
with truncate_only



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

一、創(chuàng)建用戶數(shù)據(jù)庫
Create Database 數(shù)據(jù)庫名
??On 設備_1=Size_1,//單位:M
? ???設備_2=Size_2,
……
log on 日志設備=Log_Size
[With Override]//在同一設備上創(chuàng)建數(shù)據(jù)庫和事務日志時使用該選項
[For Load]? ? //禁止用戶訪問直到數(shù)據(jù)庫的裝入或恢復操作完成為止
舉例:
? ? Create Database test_db
? ? On data_dev=100,//單位:M
? ?? ? Index_dev=50
? ? Log on log_dev=30
說明:
(1)將日志放在單獨的設備上,有利于數(shù)據(jù)庫性能的提高;
(2)圖示:
Data_dev? ?? ???Index_dev? ?? ???log_dev
(3)如果將數(shù)據(jù)庫和日志放在同一設備上,就不能實現(xiàn)增量備份;
(4)通常將System和Default段縮減范圍到一個設備上,如刪除設備Index_dev上的System段和

Default段,創(chuàng)建新的段,用來存放專門的數(shù)據(jù)庫對象。
二、更改數(shù)據(jù)庫
1.改變數(shù)據(jù)庫屬主
通常用戶數(shù)據(jù)庫有系統(tǒng)管理員創(chuàng)建,它的默認屬主是dbo。系統(tǒng)過程sp_changeddbowner可改變數(shù)

據(jù)庫的屬主關系,它必須由數(shù)據(jù)庫管理員在要改變屬主關系的數(shù)據(jù)庫中執(zhí)行。語法如下:
sp_changeddbowner login_name[,True]
其中參數(shù)True用于將權限一半傳遞給新屬主。
2.擴展數(shù)據(jù)庫
(1)擴展數(shù)據(jù)庫空間
alter database 數(shù)據(jù)庫名
? ?? ?? ?on 設備名=擴展空間??//單位:M
? ?? ?? ?如果擴展的設備對于數(shù)據(jù)庫是新的,System和Default段會自動擴展到該設備上。
(2)擴展事務日志到新的設備上
??sp_logdevice 數(shù)據(jù)庫名,設備名
舉例:將數(shù)據(jù)庫另外擴充5M,用于存儲日志
? ???alter database my_db
? ?? ?? ?? ?on my_dev=5
? ???go
? ???sp_logdevice my_db,my_dev
? ???go

3.刪除數(shù)據(jù)庫
??drop database 數(shù)據(jù)庫名
刪除設備前必須刪除其上的所有數(shù)據(jù)庫,刪除設備的命令是:sp_dropdevice
三、事務日志
? ?日志文件是用來記錄數(shù)據(jù)庫每一次修改活動的文件。SQL Server中的每一個數(shù)據(jù)庫都有自己

的日志文件,即系統(tǒng)表syslogs,也稱為事務日志。事務日志是撤消事務和出現(xiàn)故障時恢復事務的依據(jù)。
在某些情況下,事務日志比數(shù)據(jù)本身更為重要。
什么是事務?
數(shù)據(jù)庫的修改是以事務為單位進行的。一個事務就是一個操作序列,這些操作要么全做,要么全

不做,它是一個不可分割的工作單位。任何一個事務具備如下特征。
(1)執(zhí)行的原子性(Atomic);
(2)保持數(shù)據(jù)的一致性(Consistency);
(3)彼此的隔離性(Isolation);
(4)作用的持久性(Durability)。
上述事務的四個特征被稱為事務的ACID準則。
事務在運行過程中,SQL Server把事務開始、事務結束以及對數(shù)據(jù)庫的插入、刪除和更新等每一

個操作作為一個日志記錄存放到事務日志中。事務中的更新操作首先在數(shù)據(jù)庫緩沖區(qū)(內(nèi)存)中進

行,緩沖區(qū)分別有用來記錄操作活動的數(shù)據(jù)頁(data page)和日志頁(log page)。當運行到

commit tran時,日志頁首先從緩沖區(qū)寫到磁盤上,而后數(shù)據(jù)頁從緩沖區(qū)寫到磁盤上,即遵循“先與日志

(write_ahead log)”的原則,這樣保證出現(xiàn)故障的情況下,通過日志能夠得到最大限度的恢復?;謴?/span>

必須撤消發(fā)生故障時還未提交的事務,已完成的事務若仍有未從緩沖區(qū)寫到數(shù)據(jù)庫設備中,還要重新

運行該事務。
附:創(chuàng)建與裝載數(shù)據(jù)庫實例
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ù)庫安全性與用戶管理

一、安全管理概述
數(shù)據(jù)庫的安全性是指保護數(shù)據(jù)庫以防止不合法的使用所造成的數(shù)據(jù)泄露、更改或破壞。

SQL Server的安全管理是一種基于角色(role)的管理方法,位于不同權限層次(或角色)的用戶

具有不同的用戶權限。
規(guī)定用戶權限有三個因素:用戶、數(shù)據(jù)對象和操作,即什么用戶在哪些數(shù)據(jù)對象上可以執(zhí)行什么操作。
訪問SQL Server中數(shù)據(jù)的四道屏障:
(1)操作系統(tǒng)——操作系統(tǒng)登錄
(2)Sybase服務器——服務器登錄
(3)Sybase數(shù)據(jù)庫——數(shù)據(jù)庫用戶登錄
(4)數(shù)據(jù)庫對象——對象授權
二、理解數(shù)據(jù)庫角色
角色是權限的集合。
1.系統(tǒng)預定義角色
一個真正的數(shù)據(jù)庫管理員應該是整個服務器及其數(shù)據(jù)庫的擁有者,具有管理服務器及其數(shù)據(jù)庫的所

有權限。在一個大的系統(tǒng)中,數(shù)據(jù)庫管理員往往不只由一人承擔,而是將管理任務進行功能劃分,每

人提當不同的責任。系統(tǒng)預定義角色就是為適應這種要求而設計的。
●系統(tǒng)管理員(sa_role)
sa_role角色擁有執(zhí)行與數(shù)據(jù)庫具體應用無關的管理權限:
◇安裝與更新SQL Server
◇管理服務器的物理存儲
◇配置系統(tǒng)設置參數(shù);
◇創(chuàng)建用戶數(shù)據(jù)庫;
◇授予SQL Server用戶權限
◇┅┅
●系統(tǒng)安全管理員(sso_role)
sso_role用來實施安全上敏感的操作,執(zhí)行有關安全性的任務:
◇建立服務器登錄帳戶;
◇管理口令;
◇授予除sa_role之外的任何角色;
◇管理審計系統(tǒng);
◇┅┅
●操作員(oper_role)
oper_role執(zhí)行全服務器范圍的數(shù)據(jù)庫操作,如備份與恢復任意數(shù)據(jù)庫等:
◇轉(zhuǎn)儲數(shù)據(jù)庫與日志
◇轉(zhuǎn)載數(shù)據(jù)庫與日志
◇┅┅
2.創(chuàng)建與使用自定義角色
(1)創(chuàng)建新的角色:create role
(2)賦予角色權限:grant
(3)設置登錄帳戶的角色權限:sp_role
??格式:sp_role “grant”|”revoke”,角色名,登錄帳號名
這里的“grant”|”revoke”是指對角色權限是授予還是撤消。
三、服務器的帳戶管理
要想成為Sybase系統(tǒng)的一個用戶,首先必須擁有自己的登錄帳戶。通過這一帳戶連同自己

的口令向服務器注冊后,才能使用Sybase系統(tǒng)中的一些資源,每一個這樣的登錄帳戶在系統(tǒng)

中被賦予Server級的標識SUID。
1.添加登錄
sp_addlogin 登錄名,口令[,缺省的數(shù)據(jù)庫]
如果不指定缺省的數(shù)據(jù)庫,則該帳戶的缺省數(shù)據(jù)庫為master庫。
2.更改登錄屬性
◇更改口令;
◇鎖定帳戶;
◇期限設置;
◇賦予角色。Sybase
四、數(shù)據(jù)庫用戶管理
通過某一個帳戶注冊到服務器后,要想使用某一個數(shù)據(jù)庫,必須成為該數(shù)據(jù)庫的一個用戶。通過

建立登錄與用戶之間的聯(lián)系來管理對數(shù)據(jù)庫的訪問。
1.組的概念
組(group)是數(shù)據(jù)庫用戶的集合。屬于某個組的用戶,他自動獲得該組所擁有的權限。
Sp_addgroup 組名
◇將一個用戶加入某個組:(1)改變用戶屬性;(2)創(chuàng)建新用戶時指定。
◇所有用戶自動屬于public組,即使這個用戶已經(jīng)屬于其他組了。
2.創(chuàng)建新的用戶
sp_adduser 登錄名,用戶名[,組名]
3.別名用戶
Sybase的別名機制可以使得多個帳戶對應于同一個數(shù)據(jù)庫用戶,這樣使不同的登錄在數(shù)據(jù)庫

中擁有同樣的權限。這在審計系統(tǒng)中是一種控制責任的一種手段。
Sp_addalias 登錄名,數(shù)據(jù)庫中的用戶名
別名——相當于給某個用戶配一把別人的鑰匙(登錄)。
五、用戶的權限管理
控制用戶對數(shù)據(jù)庫對象的訪問,有兩類權限:命令權限和對象權限。
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 數(shù)據(jù)庫對象 to public|組名|用戶名|角色
[With Grant Option]

Revoke 對象權限組合 on 數(shù)據(jù)庫對象 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


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

數(shù)據(jù)庫的備份與恢復是SQL Server保障數(shù)據(jù)安全的一種重要手段,為防止意外,數(shù)據(jù)庫管理

員必須定期和經(jīng)常制作數(shù)據(jù)庫的備份。一旦系統(tǒng)出現(xiàn)故障,數(shù)據(jù)能夠得到及時的恢復。
一、基本概念
? ? 1.事務處理及其日志
SQL Server使用事務來跟蹤所有數(shù)據(jù)庫變化。事務是SQL Server的工作單元。一個事務包含一條

或多條作為整體成功或失敗的T_SQL語句。每個數(shù)據(jù)庫都有自己的事務日志,即系統(tǒng)表syslogs,

事務日志自動記錄每個用戶發(fā)出的每個事務,它飲食了每個事務足夠多的信息,以確保數(shù)據(jù)能夠被恢復。
2.檢查點(CheckPoint)
服務器在何時更新數(shù)據(jù)?
——在檢查點。在服務器發(fā)出一個檢查點時:(1)更新數(shù)據(jù);(2)在日志中記錄下執(zhí)行檢查點

的標記。
檢查點可把所有“臟頁”寫到數(shù)據(jù)庫設備上,“臟頁”是指從上一次檢查點以來,在內(nèi)存中修改、但沒有

在磁盤上修改的頁。SQL Server的自動檢查點機制保證了被完成的事務修改的數(shù)據(jù)頁有規(guī)律地從內(nèi)

存中的緩沖區(qū)寫到數(shù)據(jù)庫設備上。
二、數(shù)據(jù)庫備份
若硬件介質(zhì)出現(xiàn)故障(如磁盤損壞),當且僅當事先已對數(shù)據(jù)庫及其事務日志作了備份,才

能恢復數(shù)據(jù)庫。
注意:絕對不要使用操作系統(tǒng)的拷貝數(shù)據(jù)庫設備,把這樣一個拷貝裝入SQL Server將導致大

量數(shù)據(jù)庫受損。
備份的類型:
完全備份()
增量備份——備份事務處理日志
說明:
(1)只有把事務日志放在單獨的設備上,才能進行增量備份;
(2)備份事務日志會截斷日志,因此備份的內(nèi)容是自上次備份以來的事務處理。
(3)備份之前要啟動備份服務器,并最好創(chuàng)建轉(zhuǎn)儲設備。
命令語法:
??dump database 數(shù)據(jù)庫名
? ? to 轉(zhuǎn)儲設備名/物理文件名

??dump transaction 數(shù)據(jù)庫名
? ?{with {truncate_only|no_log}
? ? to 轉(zhuǎn)儲設備名/物理文件名
? ? [with No_truncate]
Truncate_only與no_log選項用于刪除事務處理而不作拷貝。Truncate_only截斷日志;在事

務處理日志完全滿時用no_log,它不為數(shù)據(jù)庫建立檢查點。兩個選項都會丟掉日志。當使用

了這兩個參數(shù)后,應及時備份整個數(shù)據(jù)庫。
No_truncate拷貝日志但不截斷日志,在出現(xiàn)介質(zhì)錯誤時使用該選項。

圖形界面的選項與命令參數(shù)的對應關系:
(1)dump transaction? ?(2)dump transaction……??with no_truncate
(3)dump transaction……??with truncate_only
(4)dump transaction……??with no_log
三、數(shù)據(jù)庫的恢復
使用load database加載備份到現(xiàn)有數(shù)據(jù)庫,數(shù)據(jù)庫可以是用于創(chuàng)建轉(zhuǎn)儲的數(shù)據(jù)庫,也可以

不是。語法為:
load database 數(shù)據(jù)庫名 from 轉(zhuǎn)儲設備名/物理文件名
load transaction數(shù)據(jù)庫名 from 轉(zhuǎn)儲設備名/物理文件名
●利用備份恢復數(shù)據(jù)庫舉例:
某數(shù)據(jù)庫數(shù)據(jù)和日志分別存儲在兩個獨立的磁盤上,正常運轉(zhuǎn)時的執(zhí)行的備份計劃如下,每天

的17:00執(zhí)行整個數(shù)據(jù)庫的備份,每天的10:00、12:00、14:00、16:00點執(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ù)磁盤在周二的下午六點損壞,可以采用如下步驟恢復數(shù)據(jù)庫:
(1)使用dump transaction with no_truncate獲得當前的事務日志轉(zhuǎn)儲,磁帶7;
(2)使用load database轉(zhuǎn)載最新的數(shù)據(jù)庫轉(zhuǎn)儲,磁帶6;(offline)
(3)使用load transaction提交最新的事務日志轉(zhuǎn)儲,磁帶7;
(4)使用online database把數(shù)據(jù)庫狀態(tài)設置為online。
若數(shù)據(jù)磁盤在周二的下午4:50損壞,恢復過程如下:
(1)使用dump transaction with no_truncate獲得當前的事務日志轉(zhuǎn)儲,磁帶7;
(2)使用load database轉(zhuǎn)載最新的數(shù)據(jù)庫轉(zhuǎn)儲,磁帶6;(offline)
(3)使用load transaction依次裝載磁帶2、3、4、5上的事務日志;
(4)使用load transaction提交最新的事務日志轉(zhuǎn)儲,磁帶7;
(5)使用online database把數(shù)據(jù)庫狀態(tài)設置為online。
四、制定備份與恢復的策略
? ?由于事務日志在恢復數(shù)據(jù)庫中的特殊作用,應定期備份數(shù)據(jù)庫及其事務日志,而且事務日志

的備份要更頻繁一些。如:數(shù)據(jù)庫每周備份一次,事務日志每天備份一次。


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

一、關系模型的基本概念
關系數(shù)據(jù)庫以關系模型為基礎,它有以下三部分組成:
●數(shù)據(jù)結構——模型所操作的對象、類型的集合
●完整性規(guī)則——保證數(shù)據(jù)有效、正確的約束條件
●數(shù)據(jù)操作——對模型對象所允許執(zhí)行的操作方式
關系(Relation)是一個由行和列組成的二維表格,表中的每一行是一條記錄(Record),每

一列是記錄的一個字段(Field)。表中的每一條記錄必須是互斥的,字段的值必須具有原子性。
二、SQL語言概述
??SQL(結構化查詢語言)是關系數(shù)據(jù)庫語言的一種國際標準,它是一種非過程化的語言。通過

編寫SQL,我們可以實現(xiàn)對關系數(shù)據(jù)庫的全部操作。
●數(shù)據(jù)定義語言(DDL)——建立和管理數(shù)據(jù)庫對象
●數(shù)據(jù)操縱語言(DML)——用來查詢與更新數(shù)據(jù)
●數(shù)據(jù)控制語言(DCL)——控制數(shù)據(jù)的安全性
T-SQL語言是Sybase對SQL92標準的一種擴展,主要在它的基礎上增加了三個方面的功能:自己

的數(shù)據(jù)類型/特有的SQL函數(shù)/流程控制功能
T-SQL中的標識符使用說明:
(1)標識符由1-30個字符或數(shù)字構成,但首字符必須為字母。臨時表的表名以#開頭,長度不能

超過13個字符。
(2)數(shù)據(jù)庫對象的標識方法舉例
database.owner.tablename.columnname
執(zhí)行遠程存儲過程:
EXEC server.db.owner.proc_name
當執(zhí)行語句在批處理的句首時,EXEC可以省略。
三、Sybase的數(shù)據(jù)類型
? ? 在創(chuàng)建表或聲明局部變量時,必須使用Sybase系統(tǒng)預定義類型。
1.字符類型
Char(n)? ?VarChar(n)
2.數(shù)值類型
整數(shù)類型——Integer??SmallInt??TinyInt
浮點類型——Real??Float??Number[P,S]??Decimal[P,S]
貨幣類型——Money??SmallMoney
3.日期/時間類型
Datetime??SmallDatetime
兩者時間部分的精度不同,前者精確到分,后者精確到1/30秒。
4.文本和圖像類型
Text??Image
5.二進制數(shù)據(jù)類型
Binary(n)??VarBinary(n)
四、數(shù)據(jù)定義語言
用來定義數(shù)據(jù)庫對象。數(shù)據(jù)庫對象是Sybase用來存儲數(shù)據(jù)的邏輯實體,主要有:
表(Table)、視圖(View)、臨時表(Temp Table);
主鍵(Primary Key)、外鍵(Foreign Key)、索引(Index)、規(guī)則(Rule)、默認值(Default);
存儲過程(Stored Procedure)、觸發(fā)器(Trigger)
●基本語法
下面給出創(chuàng)建主要數(shù)據(jù)庫對象的語法:
1.表
創(chuàng)建表的基本語法是:
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ù)庫時,可以考慮將創(chuàng)建表乃至其它數(shù)據(jù)庫對象的過程寫到一個文本里,當數(shù)據(jù)庫

系統(tǒng)出現(xiàn)問題時,在最壞的情況下,重建過程可以得到簡化,也能比較好的對數(shù)據(jù)庫的建設過

程進行監(jiān)視。
創(chuàng)建表的過程完成下列活動:
·定義表的每一列;
·定義列名和列的數(shù)據(jù)類型并指定列是否處理空值;
·指定列是否具有IDENTITY屬性;
·定義列級的完整性約束和表級的完整性約束
上述過程可見,創(chuàng)建表的過程可以設定填充因子,將列置于段上,設計索引,外鍵等等。
2.索引
索引對查詢性能的影響很大,要引起重視。
索引加速了數(shù)據(jù)檢索,Adaptive Server有三類索引:
·復合索引——索引包含多列;當兩列或多列由于它們的邏輯關系而作為整體被查詢時可建立這種索引;
·唯一索引——索引列的值不允許重復;
·簇聚索引和非簇聚索引——簇聚索引強迫Server不斷地對表中數(shù)據(jù)排序或重排序以保證表中數(shù)

據(jù)的物理順序和邏輯順序的一致性,簇聚索引對范圍查詢性能影響極大;非簇索引沒有這樣的要

求,非簇聚索引對修改操作有利。

何時建索引?
·如果手動插入identity列,則創(chuàng)建唯一索引以保證不插入已經(jīng)存在的值;
·經(jīng)常被排序訪問的列,即被列在order by子句中的列,最好對其建立索引以便Adaptive Server能

充分利用索引順序的優(yōu)點;
·如果列經(jīng)常用手連接,則可對列建立索引,這樣系統(tǒng)能更快地執(zhí)行連接;
·包含主鍵的列一般都有簇聚索引,尤其是當它頻繁地和其它表的列相關聯(lián);

·經(jīng)常被范圍查詢的列最好為其建立簇聚索引,一旦查詢范圍內(nèi)的第一個值被發(fā)現(xiàn),則隨后的值

在物理上一定相近。簇聚索引對單值查詢并沒有什么優(yōu)點。
創(chuàng)建索引的基本語法:
Create [unique][clustered|nonclustered]index index_name
On [[database.]owner.]table_name
(column_name[,column_name]…)
[on segment_name][with consumers=x]

上述語法包含了這樣的暗示:將簇聚索引和它的基表分離在不同的段上;段是邏輯概念,但段

可以位于不同的物理設備上,也即將簇聚索引和基表物理上分開。 這是不允許的,我們將在

后面討論設備、數(shù)據(jù)庫、段、表分區(qū)時作詳細討論。
3.鍵(key)
理解鍵是理解關聯(lián)的關鍵。
鍵和索引往往是一回事。鍵的意義在概念上,鍵用于參照完整性約束。
主鍵是表的單值列的集合,主鍵通過在放置它們的表上創(chuàng)建一個單值索引來實現(xiàn)其單值性的。

實際上主鍵是作為標志表的標志符而存在的,一旦主鍵確定,則由該主鍵就確定了的表也就確定了。
外鍵是和其它表中的主鍵相關的列,主鍵和外鍵的關系確定了外鍵的值域,該值域即為相應主

鍵的取值范圍。這樣就從理論上強制實現(xiàn)了表與表之間的參照完整性。
前面創(chuàng)建表的語法里包含了創(chuàng)建鍵的成分。也可以通過其它途徑創(chuàng)建主鍵和外鍵。
◇Unique約束和Primary key約束的區(qū)別
Unique約束和Primary key約束用來保證同一表中指定的列上沒有重復值,這兩個約束都產(chǎn)生

唯一索引確保數(shù)據(jù)一致性,默認情況下,Unique約束產(chǎn)生唯一的非聚集索引,Primary key約束

產(chǎn)生唯一的聚集索引。Primary key約束比Unique約束嚴格:Primary key列不允許有空值,

Unique列允許有空值。
4.視圖
視圖是查看多表中數(shù)據(jù)的方法,視圖從基表派生,它并非物理存在,而是邏輯表;視圖也系統(tǒng)

提供管理表的一種安全機制。視圖使得用戶集中精力在感興趣的數(shù)據(jù)集上。
創(chuàng)建視圖的語法:
create view [[database.]owner.]view_name
[(column_name[,column_name]…)]
as select [distinct] select_statement
[with check option]
有distinct關鍵字的視圖不能更新。當視圖涉及關聯(lián)時,定義視圖要小心,這時是對多表操作

,完整性顯得很重要。
五、數(shù)據(jù)操縱語言
1.Select語句
基本語法:
SELECT[all|distinct]字段列表
[into表名]
[from表名]
[where條件表達式]
[group by [all]字段列表]
[having篩選表達式]
[order by 字段列表[asc|desc]]
[compute聚集函數(shù)列表[by字段列表]]
注意:Select語句中的子句必須按照上述順序使用。也就是說,若該語句包括一個group by子句

和一個order by子句where,group by子句必須放在order by子句之前。
Having子句類似于where子句,不同之處有兩點:(1)Having子句必須結合group by子句使用;

(2)where子句不能用聚集函數(shù),而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列表中的數(shù)值數(shù)據(jù)進行計算,下面列出了算術運算符。

符號運算
+加
-減
/除
*乘
%取模
如select title_id,total_sales,total_sales*2 from titles
例5:使用distinct消除重復的查詢結果
可選的關鍵詞消除select語句的結果中的重復行。若不指定distinct,缺省值為all,將檢索出

包含重復行的所有行數(shù)據(jù)。
如: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:用集合函數(shù)小結查詢結果
集合函數(shù)用特定列的數(shù)據(jù)來計算小結值。
集合函數(shù)結??果
Sum([all|distinct]expression)數(shù)值列中(不重復)值的總和
Avg([all|distinct]expression)數(shù)值列中(不重復)值的平均
count([all|distinct]expression)列中(不重復)非空值的數(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:分組組織查詢結果——group by 子句
? ?? ?group by 子句用在select語句中將一張表分成若干組。
如:select type, advance from titles group by type
例9:選擇分組數(shù)據(jù)——having子句
? ?? ?having為group by 子句設置條件,與where為select語句設置條件一樣。Having搜索條

件與where相同,但having可包括集合函數(shù),而where不能包括。
下列語句使用帶集合函數(shù)having子句的例子。它把title表中的行按類型分組,但去掉了那只包

含一本書的分組。
Select type from titles group by type having count(*)>;1
下面是一個不帶集合函數(shù)的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:連接——從多張表中檢索數(shù)據(jù)
連接兩張或兩張以上的表是這樣一個過程:比較指定字段中的數(shù)據(jù),根據(jù)比較結果用符合條

件的行組成一張新表。
舉例:
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命令向數(shù)據(jù)庫中添加行有兩種方法:使用關鍵詞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預定義函數(shù)
1.聚集函數(shù)
sum([all|distinct]表達式)
avg([all|distinct]表達式)
count([all|distinct]表達式)
count(*)
max(表達式)
min(表達式)
2.字符串函數(shù)
upper(字符表達式)
lower(字符表達式)
char(整型表達式)
char_length(字符表達式)
ltrim(字符表達式)
rtrim(字符表達式)
……
3.數(shù)學函數(shù)
abs(精確小數(shù)型表達式)
floor(精確小數(shù)型表達式)求小于或等于給定表達式值的最大整數(shù)(取底)
rand([整數(shù)型]
round(精確小數(shù)型表達式,整數(shù))
sign(精確小數(shù)型表達式)
power(精確小數(shù)型表達式,整數(shù)冪)
……
4.日期函數(shù)
getdate()
datepart(日期部分,日期)
datediff(日期部分,日期1,日期2)
dateadd(日期部分,數(shù)值表達式,日期)
5.類型轉(zhuǎn)換函數(shù)
convert(數(shù)據(jù)類型,表達式[,格式])
6.系統(tǒng)函數(shù)
db_name([數(shù)據(jù)庫ID])
host_name()
isnull(表達式1,表達式2)
……
七、數(shù)據(jù)控制語言
用來控制數(shù)據(jù)的安全性,如權限控制語句GRANT和REVOKE等。


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

一、批處理
SQL Server可以處理作為一批而提交的多個SQL語句,既可以是交互式的,也可以是

一個文件。批處理SQL語句由批結束標志終止,該標志指示SQL Server從前面開始執(zhí)

行該批處理語句,對于獨立的SQL實用程序isql而言,其批結束標志為單獨占一行的“go”。
舉例:選擇表title及表authors的行數(shù)
select count(*) from titles
select count(*) from authors
go
二、流程控制語言
1.變量聲明與賦值
全局變量由系統(tǒng)預定義,以符號@@打頭。
局部變量聲明使用Declare語句,這個變量必須以符號@開頭,后跟一個標識符。
Declare @變量名??數(shù)據(jù)類型[,@變量名??數(shù)據(jù)類型,……]
變量賦值使用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/*多個順序執(zhí)行的SQL 語句*/
End
3.條件語句
If 條件表達式
??語句(塊)
Else
??語句(塊)
舉例:
if(select max(id) from sysobjects)<50
??print ‘數(shù)據(jù)庫里沒有用戶創(chuàng)建的對象‘
else
??select name,type,id from sysobjects where id>;50
4.循環(huán)語句
While 條件表達式
? ? 語句(塊)
●兩個特殊的循環(huán)控制語句:
??Continue 執(zhí)行下一次循環(huán)
??Break? ? 退出當前循環(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.其它控制語句
◇Return語句——無條件結束當前過程,并可返回給調(diào)用者的一個狀態(tài)值:Return[整數(shù)表達式]
◇Print語句
◇RaiseError語句
◇Waitfor語句
三、存儲過程
? ? 存儲過程是存儲在服務器端的一類數(shù)據(jù)庫對象,它實質(zhì)上是一段用SQL語言編寫的程序,

它在服務器端預先經(jīng)過編譯,并確定出執(zhí)行計劃,因此與同樣功能的批處理語句相比,它的

執(zhí)行速度較快。
基本語法:
Create Procedure[owner.]過程名
[@參數(shù)名??數(shù)據(jù)類型[=默認值][Output]]
[,@參數(shù)名??數(shù)據(jù)類型[=默認值][Output]]
[……]
AS
Begin
??SQL語句(塊)
End
存儲過程是數(shù)據(jù)庫對象,和表、索引是一個級別的;是SQL語句和控制流語言的集合,存儲

過程在首次運行時被編譯,并駐留在過程高速緩存的內(nèi)存中,所以存儲過程的招待非常快。

存儲過程可以帶參數(shù),可以調(diào)用其他過程,返回狀態(tài)值,返回參數(shù)值,并且可以在遠程SQL Server

執(zhí)行。可以在遠程SQL Server執(zhí)行對數(shù)據(jù)庫設計有特別重要的意義。SQL Server提供的存儲過程

稱為系統(tǒng)過程。

存儲過程大大增強了SQL的能力、效率和靈活性,經(jīng)過編譯的存儲過程極大地改善SQL語句和批

處理的性能。
存儲過程有很多優(yōu)點:
●存儲過程在第一次執(zhí)行時編譯,并存儲在過程高速緩存的內(nèi)存中。編譯時系統(tǒng)對其進行優(yōu)化,以

選擇最佳的路徑來訪問數(shù)據(jù)集中的數(shù)據(jù),這種優(yōu)化考慮了數(shù)據(jù)集的實際數(shù)據(jù)結構。因此存儲過程

大大提高了系統(tǒng)的性能。
●存儲過程可以跨服務器運行。這一點是通過觸發(fā)器來實現(xiàn)的,當然,首先存儲過程要能登錄到

該遠程服務器。
●應用程序也能執(zhí)行存儲過程,從而實現(xiàn)服務器和客戶之間的協(xié)同作業(yè)。
●存儲過程減少了網(wǎng)絡的交通。這是因為存儲過程的文本存儲在數(shù)據(jù)庫里,調(diào)用存儲過程時通過

網(wǎng)絡的只是存儲過程的過程名。
●利用存儲過程可以提供一個附加的安全層。
如(該例子取自pubs2數(shù)據(jù)庫):
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
? ? 注意例子中的黑體部分,這實際上是一條賦值語句。該存儲過程有返回值。
存儲過程可以變得非常復雜。我們認為,創(chuàng)建存儲過程還是要遵循“最簡單就是最好”的原則。

建議在創(chuàng)建存儲過程時采用縮進風格,否則創(chuàng)建的存儲過程三天之后連自己都看不懂。
需要對存儲過程作些說明:
●Create procedure 語句不能和其他語句在同一個批命令里。
●Create procedure 語句不能包括下列語句:
??use
??Create View
??Create default
??Create rule
??Create trigger
??Create procedure
不能使用use語句好理解,存儲過程是針對數(shù)據(jù)庫的,不能在一個數(shù)據(jù)庫里訪問另外的數(shù)據(jù)庫。

如果在存儲過程里訪問另外的數(shù)據(jù)庫,則數(shù)據(jù)庫表的參照完整性難于得到保障。
從另外幾條語句看,在存儲過程里一般不能創(chuàng)建新的數(shù)據(jù)庫對象。但可以創(chuàng)建表和索引,

以及和表相關聯(lián)的鍵,表是臨時表,在存儲過程結束后不能看見創(chuàng)建的臨時表;否則的話

每運行一次存儲過程就創(chuàng)建一個表,結果可想而知。
存儲過程里不能創(chuàng)建一個對象,刪除它;然后又在同一存儲過程里用相同的名字創(chuàng)建新的對象。

實際上,SQL Server在存儲過程運行時而不是在編譯時創(chuàng)建對象的。
●如果存儲過程調(diào)用另外的存儲過程,則第二個存儲過程可以調(diào)用在第一個存儲過程里創(chuàng)建的對象。
●存儲過程包含的最多參數(shù)為255個,對存儲過程里的局部和全局變量沒有限制。
最后討論一下系統(tǒng)存儲過程。系統(tǒng)存儲過程以sp_開頭,當然用戶創(chuàng)建的存儲過程也可以以sp_開頭

;系統(tǒng)過程保存在sybsystemprocs數(shù)據(jù)庫里。系統(tǒng)過程的使用有權限,如果打入系統(tǒng)過程名但

沒有出現(xiàn)預期的結果,要么是命令名錯,要么是使用者沒有該過程的權限。一般可通過系統(tǒng)

管理員或數(shù)據(jù)庫所有者對系統(tǒng)過程的execute授權。
系統(tǒng)過程繁多,大致有幾類:
a. 用戶標志和授權。這一類的過程主要由于:增加、刪除或報告在SQL Server上的登錄,

增加、刪除或報告某數(shù)據(jù)庫的用戶、分組或別名等。這類過程有sp_addlogin,sp_adduser,

sp_helpgroup,sp_dropuser等。
b. 遠程過程的調(diào)用。這類過程用于:增加、刪除或報告能存取本SQL Server的遠程服務器;

增加能從遠程服務器上存取本SQL Server的用戶名。這類過程有:sp_addremotelogin,sp_addserver,

sp_dropserver等。
c. 數(shù)據(jù)定義和數(shù)據(jù)庫對象。這類存儲過程用于:連接和定義規(guī)則和缺省值,增加、刪除或

報告主碼、外碼和公共碼;增加、刪除或報告用戶定義的數(shù)據(jù)類型。這類存儲過程有:

sp_bindfault, sp_bindrule, sp_help, sp_helpdb, sp_foreignkey, sp_helptext等。
d. 系統(tǒng)管理。這類存儲過程用于:增加、刪除或報告數(shù)據(jù)庫及轉(zhuǎn)儲設備;報告鎖;設置的數(shù)據(jù)庫

選擇及用戶正進行的進程;修改及報告配置變量;監(jiān)控SQL Server的活動。這類過程有:

sp_addumpdevice,sp_dropdevice, sp_helpdevice等。
四、觸發(fā)器
觸發(fā)器是一種用來保障參照完整性的特殊的存儲過程,它維護不同表中數(shù)據(jù)間關系的有關規(guī)則。

當對指定的表進行某種特定操作(如:Insert,Delete或Update)時,觸發(fā)器產(chǎn)生作用。

觸發(fā)器可以調(diào)用存儲過程。
創(chuàng)建觸發(fā)器的語法:
Create Trigger[owner.]觸發(fā)器名
On [owner.]表名
For {insert,update,delete}
As
Begin
??SQL語句(塊)
End
定義一個好的觸發(fā)器對簡化數(shù)據(jù)的管理,保證數(shù)據(jù)庫的安全都有重要的影響。

觸發(fā)器是針對表一級的,這就意味著,只有表的所有者有權創(chuàng)建表的觸發(fā)器。
舉例:
插入一個新行,必須保證外鍵與主鍵相匹配,觸發(fā)器應該首先檢查被插入行與主鍵表的連接。
以下的觸發(fā)器對inserted表和titles表的title_id進行比較,這里假設正在給外鍵輸入數(shù)據(jù),

沒有插入空值,若連接失敗,事務被回退。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ù)。通過連接表titles和表inserted來檢測所有添加到salesdetail的title_id是否

在titles中存在。若所連接的行數(shù)(count(*))與@@rowcount不同,由有一個或多個插

入不正確,整個事務被取消。
觸發(fā)器的限制:
●一個表最多只能有三個觸發(fā)器,insert,update,delete
●每個觸發(fā)器只能用于一個表
●不能對視圖、臨時表創(chuàng)建觸發(fā)器
●Truncate table能刪除表,但不能觸發(fā)觸發(fā)器
●不能將觸發(fā)器用于系統(tǒng)表
合理地使用觸發(fā)器對性能的影響是正面的。在設計和使用觸發(fā)器時,經(jīng)常地用sp_depends

命令了解對象所關聯(lián)的觸發(fā)器是有好處的,該命令能列出觸發(fā)器影響的所有對象、表和視等。
在定義幾類數(shù)據(jù)庫對象的時候,對存儲過程、索引和觸發(fā)器要給予特別的注意,尤其存儲過程,

它設計的好壞對數(shù)據(jù)庫性能的影響很大。
說明:Sybase觸發(fā)器使用的兩個測試表:Deleted表和Inserted表,它們都是臨時表,

其結構與觸發(fā)器的基表結構相同,用來存放與修改相關的數(shù)據(jù)行。
五、游標
? ? 1.游標的概念
游標是指向查詢結果集的一個指針,它是一個通過定義語句與一條Select語句相關聯(lián)

的一組SQL語句。游標包含兩方面的內(nèi)容:
●游標結果集:執(zhí)行其中的Select語句所得到的結果集;
●游標位置:一個指向游標結果集內(nèi)的某一條記錄的指針
利用游標可以單獨操縱結果集中的每一行。游標在定義以后存在兩種狀態(tài):關閉和打開。

當游標關閉時,其查詢結果集不存在;只有當游標打開時,才能按行讀取或修改結果集中的數(shù)據(jù)。
2.使用游標
一個應用程序可以使用兩種類型的游標:前端(客戶)游標和后端(服務器)游標,

它們是兩個不同的概念。
無論使用哪一種游標,都需要經(jīng)過如下幾個步驟:
●定義游標
●打開游標
●從游標中操作數(shù)據(jù)
●關閉游標
下面講述的是后端(服務器)游標。
(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)從游標中讀取數(shù)據(jù)
在聲明并打開一個游標后,可用fetch命令從游標結果集中獲取數(shù)據(jù)行。
Fetch的語法為:
Fetch 游標名[into 變量列表]
舉例:fetch pub_crsr into @name,@city,@state
SQL Server在每次讀取后返回一個狀態(tài)值??捎?#64;@sqlstatus訪問該值,下表給出了

可能的@@sqlstatus值及其意義。
值意??義
0Fetch語句成功
1Fetch語句導致一錯誤
2結果集沒有更多的數(shù)據(jù),當前位置位于結果集最后一行,而客戶對該游標仍發(fā)出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語句使用的共享內(nèi)存,不再允許

另一進程在其上執(zhí)行Open操作。
六、事務——維持數(shù)據(jù)一致性和恢復
? ? 1.事務的定義
事務提供了一種將T-SQL語句分組的方法,從而使它們能夠被當成一個單元來處理:

組中所有語句或都執(zhí)行,或都不執(zhí)行。
事務是確保一個或多個SQL語句的集合不被當成單一工作單元處理的機制,SQL Server自動

將所有數(shù)據(jù)修改命令,包括單步改變請求,作為事務處理,缺省時,每個insert、update、

delete語句被當成一個事務處理。
2.事務的作用
事務使SQL Server能保證:
·一致性——同時發(fā)生的查詢或改變請求彼此不沖突,用戶不能對正處于改變過程的數(shù)據(jù)

進行查看或操作。
·恢復——在系統(tǒng)失效時,數(shù)據(jù)庫的恢復是完全的和自動的。
3.使用事務
a. 開始和確認事務
begin transaction和commit transaction可將任意數(shù)目的SQL語句封裝起來,這兩名的簡單語法為:
begin transaction
commit transaction
b. 回退事務
在commit transaction命令提交前任何時候可取消或回退事務,該命令的簡單語法為:
rollback transaction
4.檢查事務狀態(tài)
全局變量@@transtate記錄了事務當前的狀態(tài)。在執(zhí)行一個語句后SQL Server通過記錄所有

事務變化來確定返回何種狀態(tài)。
@@transtate可包含下列值:
值意??義
0事務進行中:一個顯式或隱式事務有效;上一語句執(zhí)行成功
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)


轉(zhuǎn)自:http://bbs.chinaunix.net/viewthread.php?tid=15733

http://www.risenshineclean.com/news/58905.html

相關文章:

  • 土特產(chǎn)網(wǎng)站平臺建設南昌seo管理
  • 服務器架設國外做違法網(wǎng)站深圳百度seo公司
  • 網(wǎng)站系統(tǒng)升級維護需要多長時間百度端口開戶推廣
  • 網(wǎng)站排名靠前方法網(wǎng)絡營銷推廣的要點
  • 中國大搞建設hyein seo官網(wǎng)
  • 素材之家思億歐seo靠譜嗎
  • 排名做網(wǎng)站優(yōu)化免費自助建站平臺
  • 名表網(wǎng)站企業(yè)培訓心得體會
  • 大學培訓中心網(wǎng)站建設旅行網(wǎng)站排名前十名
  • 自助建站網(wǎng)站程序源碼做互聯(lián)網(wǎng)項目怎么推廣
  • 青島響應式網(wǎng)站開發(fā)病毒式營銷方法
  • 網(wǎng)絡服務器功能的概述技術優(yōu)化seo
  • 做網(wǎng)站怎么復制視頻鏈接網(wǎng)站自建
  • 網(wǎng)站建設公司大概多少錢長沙網(wǎng)站seo哪家公司好
  • 丹陽市制作網(wǎng)站南昌網(wǎng)站建設
  • 政府網(wǎng)站建設的創(chuàng)新機制企業(yè)網(wǎng)絡營銷
  • 無錫做網(wǎng)站品牌公司萬網(wǎng)注冊域名查詢官方網(wǎng)站
  • 做網(wǎng)站設計制作的公司口碑營銷案例2022
  • 做c語言的題目的網(wǎng)站移動廣告平臺
  • 域名有了主機有了如何做網(wǎng)站已備案域名30元
  • 哪里有專做水果的網(wǎng)站怎么建立網(wǎng)站?
  • 如何建立一個手機網(wǎng)站nba新聞最新消息滾動
  • 深圳有做網(wǎng)站的公司嗎seo 關鍵詞優(yōu)化
  • 網(wǎng)站備案照片人民網(wǎng) 疫情
  • 長春建站優(yōu)化加徽信xiala5百度網(wǎng)址怎么輸入?
  • 從音樂網(wǎng)站下載歌曲做鈴音要收費嗎最新軍事消息
  • 菏澤公司做網(wǎng)站深圳seo優(yōu)化培訓
  • 網(wǎng)站算陣地建設谷歌瀏覽器網(wǎng)頁版入口在哪里
  • 以做網(wǎng)站為畢設挖掘關鍵詞的工具
  • 化妝培訓網(wǎng)站 源碼做優(yōu)化的網(wǎng)站