sybase基礎知識

第一講 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 SQLServer;二是支持數據庫應用系統的建立和開發的一組前端工具軟件Sybase SQLTools;三是可把異構環境下其他廠商的應用軟件和任何類型的數據連接在一起的接口軟件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的空間爲服務器中所有數據庫的所有用戶所共享。 每次重啓SQLServer,服務器的一個自動進程都拷貝model數據庫到tempdb數據庫,並清除tempdb中原來的內容。因此tempdb中的用戶表都是臨時的。臨時表分爲兩類:可共享的和不可共享的。不可共享的臨時表在由createtable中將符號#置於表名之前創立;可共享的臨時表通過create table中指定表名前綴tempdb..而創立。不可共享的臨時表SQLServer自動爲其添加數字後綴名,且它只存在於當前會話中。 (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: est est_dbdev.dat", vdevno=10, size=10240 go disk init name="test_logdev", phyname="c: est est_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:databaseMy_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 ChanceThreshold),其閾值是備份事務日誌所需的自由空間的估計值。當該段上的自由空間低於所置閾值時,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準則。 事務在運行過程中,SQLServer把事務開始、事務結束以及對數據庫的插入、刪除和更新等每一個操作作爲一個日誌記錄存放到事務日誌中。事務中的更新操作首先在數據庫緩衝區(內存)中進行,緩衝區分別有用來記錄操作活動的數據頁(data page)和日誌頁(log page)。當運行到committran時,日誌頁首先從緩衝區寫到磁盤上,而後數據頁從緩衝區寫到磁盤上,即遵循"先與日誌(write_aheadlog)"的原則,這樣保證出現故障的情況下,通過日誌能夠得到最大限度的恢復。恢復必須撤消發生故障時還未提交的事務,已完成的事務若仍有未從緩衝區寫到數據庫設備中,還要重新運行該事務。 附:創建與裝載數據庫實例 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_DataYDDATA.dat", [email=vdevno=@vdevno+1]vdevno=@vdevno+1[/email], size=153600 disk init name="YDINDEX", physname="D:Syb_DataYDINDEX.dat", [email=vdevno=@vdevno+2]vdevno=@vdevno+2[/email], size=102400 disk init name="YDLOG", physname="D:Syb_DataYDLOG.dat", [email=vdevno=@vdevno+3]vdevno=@vdevno+3[/email], 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_dumpydmis_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.事務處理及其日誌 SQLServer使用事務來跟蹤所有數據庫變化。事務是SQLServer的工作單元。一個事務包含一條或多條作爲整體成功或失敗的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約束和Primarykey約束用來保證同一表中指定的列上沒有重複值,這兩個約束都產生唯一索引確保數據一致性,默認情況下,Unique約束產生唯一的非聚集索引,Primary key約束產生唯一的聚集索引。Primary key約束比Unique約束嚴格:Primarykey列不允許有空值,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等。 第七講 數據庫編程基礎 一、批處理 SQLServer可以處理作爲一批而提交的多個SQL語句,既可以是交互式的,也可以是一個文件。批處理SQL語句由批結束標誌終止,該標誌指示SQLServer從前面開始執行該批處理語句,對於獨立的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執行。可以在遠程SQLServer執行對數據庫設計有特別重要的意義。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.系統管理。這類存儲過程用於:增加、刪除或報告數據庫及轉儲設備;報告鎖;設置的數據庫選擇及用戶正進行的進程;修改及報告配置變量;監控SQLServer的活動。這類過程有: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)
發佈了21 篇原創文章 · 獲贊 1 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章