七.數據完整性 1.概念:數據一致性和準確性。 分類:域完整性、實體完整性、引用完整性。 解析:域完整性也叫列完整性是指一個數據集對某個列是否有效和確定是否允許為空值。實體完整性也叫行完整性 要求所有的行都有一個唯一的標示符。引用完整性保證主鍵和外鍵之間的關係總是得到維護。 實現:A聲明數據完整性和 ...
七.數據完整性
1.概念:數據一致性和準確性。
分類:域完整性、實體完整性、引用完整性。
解析:域完整性也叫列完整性是指一個數據集對某個列是否有效和確定是否允許為空值。實體完整性也叫行完整性 要求所有的行都有一個唯一的標示符。引用完整性保證主鍵和外鍵之間的關係總是得到維護。
實現:A聲明數據完整性和B過程數據完整性。 A實現包括各種約束、預設和規則。B實現方法包括觸發器和存儲過程等。
2.約束和完整性之間的關係:
完整性類型 |
約束類型 |
描述 |
域完整性 |
Default |
在使用insert語句插入數據時,如果某個列的值沒有給定,則將賦予預設值 |
Check |
對某一列值進行檢查 |
|
實體完整性 |
主鍵 |
能夠唯一鎖定一行記錄的標示符,該列不能為空。 |
Unique |
防止出現冗餘值,並且確保創建索引,提高性能,允許為空。 |
|
引用完整性 |
外鍵 |
將一個表中的主鍵拿過來作為該表的列,那麼這一列就是外鍵。 |
3.管理約束:default、check、主鍵約束、unique、外鍵約束
Default:
1)create table 語句的列的屬性中 create table lin (name varchar(50),age int, gender char(2) default ‘男’)
2)alert table 語句中定義default約束: alter table lin add constraint 約束名稱 default ‘男’ for gender
Check:
1)create table lin (name varchar(50),age int, gender char(2) default ‘男’ check (gender=’女’ or gender=’男’))
2)alert table 語句中定義default約束: alter table lin add constraint 約束名稱 check(gender=’女’ or gender=’男’)
主鍵約束語法:
列級約束:①constraint constraint_name primary key
②primary key
表級約束:③constraint constraint_name primary key(column_list)
④primary key(column_list)
例如:1)create table lin (id int primary key, name varchar(50),age int, gender char(2) default ‘男’ check (gender=’女’ or gender=’男’))
2)create table lin (id int, name varchar(50), primary key(id,name),age int, gender char(2) default ‘男’ check (gender=’女’ or gender=’男’))
Unique約束:
語法:①constraint constraint_name unique ②unique ③constraint constraint_name unique(column_list)④unique(column_list)
外鍵約束:
1)在create table 語句中定義外鍵約束:create table A (id int primary key,…) create table B (id int primary key, aid int foreign key references A(id))
2)在alter table 語句中定義外鍵約束:create table A (id int primary key,…) create table B (id int primary key, aid int not null)
Alter table B add constraint 約束名稱 foreign key(id) references A(id) on delete cascade
3)刪除約束:alert table B drop constraint 約束名稱
4.禁止約束: 就是不讓約束對某個列生效。
比如:Alter table with nocheck B add constraint 約束名稱 check(gender=’女’ or gender=’男’)不進行性別檢查。
八.視圖
概念:從一個或幾個基本表導出的表。資料庫中只存放視圖的定義,而不存儲視圖對應的數據。視圖是一種邏輯對象,是虛擬表。除非是索引視圖,否則視圖不占物理存儲空間。
使用視圖優點:1)集中用戶使用的數據2)掩碼資料庫的複雜性:視圖把資料庫設計的複雜性與用戶的使用方式屏蔽開了。為開發人員提供了一種資料庫的設計而不影響用戶使用的能力。3)簡化用戶許可權的管理4)方便重新組織數據為其他應用程式提供輸出數據集合。
1.創建視圖 create view view_name[with encryption] as select_statement
如果希望加密視圖定義文本,可以使用with encryption子句。
2.修改視圖註意:
1)不能影響兩個或兩個以上的基表。2)某些列不能修改。3)如果影響到表中那些沒有預設值的列,就可能引起錯誤。4)如果定義了with check option選項,那麼系統驗證所修改的數據。With check option 選項強制對視圖所有修改語句必須滿足定義視圖所用的select語句的標準。
九.存儲過程、觸發器和函數
先看概念,再看實例!
1.存儲過程:是一個可以重用的代碼模塊,可以高效的完成指定的操作。
優點:1)在伺服器上已註冊。2)安全性高防止sql嵌入式攻擊3)可以模塊化設計提高設計效率4)存儲過程是一組命名代碼,允許延遲綁定。5)減少網路通信流量。
類型:用戶自定義、擴展存儲過程、系統存儲過程。
語法:create procedure procedure_name parameter_name data_type,…
[With procedure_option] as sql_statement
創建:create procedure pro_lin as select * from lin;
執行:execute/exec 存儲過程名稱。
接收結果: output
修改:alter procedure語句。
刪除:drop procedure語句。
執行過程(第一次):語法分析階段、解析階段、編譯階段、執行階段。
查看存儲過程信息:sp_helptext、 objectdefinition元數據函數。
隱藏定義文本:with encryption
2.觸發器:
概念:事件-條件-動作規則。當特定的系統事件對一個表的增刪改查操作發生時,對規則的條件進行檢查,如果條件成立則執行規則中的動作,否則不執行。
分類:DML觸發器和DDL觸發器。DML觸發器分為:INSERT類型、UPDATE類型、DELETE類型。DDL觸發器分為(事件類型):CREATE、ALTER、DROP、GRANT、DENY、REVOKE。
創建語法:DML觸發器 create trigger trigger_name on table_name_or_view_name [with encryption] {for|after|instead of}{[delete],[insert],[update]} as sql_statement
DDL觸發器 create trigger trigger_name on {all servler| database}[with encryption] {for|after}{事件類型} as sql_statement
DML觸發器工作原理(揀重點說): 當INSERT觸發器觸發時,新的紀錄增加到觸發器表中和inserted表中。當DELETE觸發器觸發時,被刪除的紀錄放在一個特殊的deleted表中。Deleted表是一個邏輯表,用來保存已經從表中刪除的紀錄。當update觸發器觸發時,表中原來的紀錄移動到deleted表中,修改過的紀錄插入到inserted表中。
3.函數
分類:標量函數、內聯表值函數、多語句表值函數、
創建:標量函數create function function_name(@parametername_list) as begin Function_body return 返回的語句 end
內聯表值函數 create function function_name(@parametername_list) return TABLE as return (查詢的語句 )
多語句表值函數 create function function_name (@parametername_list)
Returns 臨時變數 table (表的定義) as begin functin_body return end
4.函數練習實例:
--創建mydb資料庫,並創建 學生表(學號、姓名、性別、年齡、專業)、課程表(課程編號、課程名稱、先行課號、學分)和選課表(學號、課程號、成績)
create database mydb
go
use mydb
go
CREATE TABLE Student
(
Sno CHAR(9),
Sname CHAR(20),
Sgender CHAR(2),
Sage SMALLINT,
Sdept CHAR(20)
)
insert into Student values('200215121','李勇','男',20,'CS')
insert into Student values('200215122','劉晨','女',19,'CS')
insert into Student values('200215123','王敏','女',18,'MA')
insert into Student values('200215125','張立','男',19,'IS')
CREATE TABLE Course
(
Cno CHAR(4),
Cname CHAR(40),
Cpno CHAR(4),
Ccredit SMALLINT
)
insert into Course values('1','資料庫','5',4)
insert into Course values('2','數學',NULL,2)
insert into Course values('3','信息系統','1',4)
insert into Course values('4','操作系統','6',3)
insert into Course values('5','數據結構','7',4)
insert into Course values('6','數據處理',NULL,2)
insert into Course values('7','PASCAL語言','6',4)
CREATE TABLE SC
(
Sno CHAR(9),
Cno CHAR(4),
Grade SMALLINT
)
insert into SC values('200215121','1',92)
insert into SC values('200215121','2',85)
insert into SC values('200215121','3',88)
insert into SC values('200215122','2',90)
insert into SC values('200215123','3',80)
--1.創建標量函數,使用該函數。當用戶輸入課程名稱時,返回這門課程的最低分
create function retGrade(@courceName varchar)
returns int
begin
end
select * from sc;
select * from course;
--2.創建內聯表值函數,當用戶輸入學分,返回所有學分為該學分的課程的信息
create function kc (@xf smallint)
returns table
as
return(select * from course where ccredit=@xf)
select * from kc(4);
select * from student;
--3.創建多語句表值函數,用戶輸入專業名稱時,返回所有該專業同學的信息
create function stu(@zy char(20))
returns @k table(sno char(20),sname char(20))
as
begin
insert @k
select sno,sname from student where sdept=@zy
return
end
select * from stu('cs');
十.備份和還原
http://os.51cto.com/art/201305/392742.htm詳解SQL Server 2008數據備份與還原
1.三種資料庫恢復模式:完整恢復模式、大容量日誌記錄模式、簡單恢復模式。
2.四種備份方法:完全資料庫備份、增量資料庫備份、事務日誌備份、資料庫文件或文件組備份。
3.還原操作:restore database語句.
十一.事務
1.概念:用戶定義的一個資料庫操作序列,這些操作要麼全做,要麼全不做,是一個不可分割的工作單位。
2.特性:ACID即原子性(atomicity)、一致性(consistency)、隔離性(Isolation)、持續性(Durability)。
原子性:事務是資料庫的邏輯單元,事務中包括的諸多操作要麼全做,要麼不全做。
一致性:當事務完成時,所有的數據都必須是一致的狀態。
隔離性:一個事務的執行不會被其他的事務干擾。
持續性:一個事務一旦提交,他對資料庫中數據的改變就是永久的。
3.事務的工作原理:涉及三點:事務日誌、檢查點機制、檢查點周期性檢查事務日誌。
4.管理事務:begin transaction、begin distributed transaction、commit transaction、rollback transaction、save transaction、set implicit_transaction
一個使用實例:
use A
create table emp(
eid int,
ename varchar(50)
)
go
use A
begin transaction
insert into emp values(1,'hello')
save transaction a
insert into emp values(2,'hei')
save transaction b
insert into emp values(3,'hehe')
rollback transaction b
insert into emp values(4,'haha')
rollback transaction a
commit transaction
select * from emp;
go
5.使用鎖
鎖是防止其他事務訪問指定資源的手段,也是實現併發控制的方法。
1).三種錯誤現象:臟讀、不可重覆讀、幻讀。
臟讀:一個事務讀到的數據正是另一個事務update更新的數據。
不可重覆讀:在一個事務內,多次讀到同一個數據卻得到不同的結果。
幻讀:一個事務讀到的數據正是另一個事務整改插入insert的數據。
2).封鎖:實現併發控制的一個重要技術。
分類:排它鎖又稱寫鎖。若事務T對數據對象A加上X鎖,則只允許T讀取和修改A,其他任何事務都不能在對A加任何其他類型的鎖,直到T釋放A上的鎖為止。 共用鎖又叫讀鎖。若事務T對數據對象A加上S鎖,則只允許T讀取但不能修改A,其他事務只能在對A加S鎖,不能加X鎖,直到T釋放A上的S鎖為止。
3).一級封鎖協議:事務T在修改數據R之前必須先對其加X鎖,直到事務結束才釋放。二級封鎖協議:在一級封鎖協議基礎上增加事務T讀取數據R之前必須先對起加S鎖,讀完後即可釋放S鎖。三級封鎖協議:在一級封鎖協議基礎上增加事務T讀取數據R之前必須先對起加S鎖,直到事務結束才釋放S鎖。
4.活鎖與死鎖
活鎖:一個事務T是有可能被執行的,但它卻處於可能等待狀態。(就是要死不死的)
死鎖:你等待我的資源,我也在等待你的資源,我們兩個都很強勢,不鬆口,就形成了僵持局面,不能結束,於是形成死鎖。
解除死鎖:超時法:超過了規定的等待時間,就認為發生了死鎖,系統就會選擇一個代價較小的事務,將其撤銷,釋放此事務持有的所有鎖。等待圖法:
5.併發調度的可串列性
概念:多個事務的併發執行時正確的,當且僅當其結果與按某一次序串列地執行這些事務時的結果相同。
6.兩段鎖的協議:所有事務必須分兩個階段對數據項加鎖和解鎖。
7.五種事務隔離等級:①read uncommitted會發生臟讀②read committed可能產生不可重覆讀和幻讀數據 ③repeatable read 可能發生幻讀④snapshot指定任何讀取數據都將是已經存在的數據⑤ serializable等級最高,可以自己設置等待訪問時間。
十二.自動化管理任務
- 自動完成任務:一類是執行正常調度的任務;二類識別和回應可能遇到的問題的任務。這些任務是依靠自動化組件完成的。
- 自動化組件包括:Windows EventLog、MSSQLServer、SQLServer代理。
- 警報:用來回應sqlserver系統發生的事件。警報由事件觸發,觸發的結果可以是執行作業,也可以是同志操作員。
圖1 作業、警報、事件之間的關係
- 定義作業的用戶不一定是作業的所有者。註意這裡是所有者是login賬戶,不是user賬戶。
2.警報的執行過程:
終於總結完了。。。沒有失信於昨天。另外有需要的自己拿著用!