一、實驗目的:
1、掌握資料庫約束的概念;
2、熟悉sql server 的完整性約束技術。
3、了解sql server 的違反完整性處理措施。
二、實驗環境:
sql server2014
三、實驗內容:
1.在前幾次實驗所使用的資料庫中新建乙個教師資訊表,表名為teacher,字段包括tno(教師編號),tname(姓名),t***(性別),ttitle(職稱),完整性包括:設定tno為主鍵,tname非空,t***的取值範圍為「男」或「女」。
create
table teacher
(tno char
(7)primary
key,
tname char
(20)
notnull,
t*** char
(2)constraint c1 check
(t*** in('
男','女'
)),ttitle char
(4),
);2. 用insert語句插入如下記錄,觀察實驗結果:
insert into teacher values('2016001','王明','男','講師')
insert into teacher values('2016001','王英','女','助教')
insert into teacher values('2016002','張方','a','講師')
有錯誤,無法插入。因為:
訊息 2627,級別 14,狀態 1,第 1 行
違反了 primary key 約束「pk__teacher__c450026d3befefcb」。不能在物件「dbo.teacher」中插入重複鍵。重複鍵值為 (2016001)。
語句已終止。
訊息 2627,級別 14,狀態 1,第 2 行
違反了 primary key 約束「pk__teacher__c450026d3befefcb」。不能在物件「dbo.teacher」中插入重複鍵。重複鍵值為 (2016001)。
語句已終止。
訊息 547,級別 16,狀態 0,第 3 行
insert 語句與 check 約束"c1"衝突。該衝突發生於資料庫"s-t",表"dbo.teacher",column 't***'。
語句已終止。
3. 對teacher表增加乙個約束,ttitle屬性的取值範圍為('助教','講師','副教授','教授'),並插入一條記錄:
insert into teacher values('2016003','劉陽','男','研究員'),觀察實驗結果。
alter
table teacher
addconstraint c2 check
(ttitle in('
助教',
'講師','
副教授','
教授'));
insert
into teacher values
('2016003','
劉陽','男'
,'研究員'
);無法插入記錄,因為研究員不在約束內。
4. 為學生表student增加乙個約束,s***的取值範圍為「男」或「女」。
alter
table student
addconstraint c3 check
(s*** in('
男','女'
));5. 為選課表sc增加乙個約束,grade的取值在0至100之間。
(提示,3,4,5是對錶的結構增加約束定義,使用命令為:alter table)
alter
table sc
addconstraint c4 check
(grade between 0 and 100);
6. 為選課表sc增加參照完整性及違約處理,定義sno為外來鍵,與student表中的sno關聯,當刪除、更新student中的元組時,級聯刪除、更新sc表中的相應元組,命令為:
alter table sc
add foreign key(sno) references student(sno)
on delete cascade
on update cascade
使用sql語句,將student表中姓名為」王敏」的元組,學號更改為「201315123」,然後檢視sc表中的元組是否也做了相應的更改。
update student
set sno=
'201315123'
where sname=
'王敏'
做了相應的更改。
7. 為選課表sc增加參照完整性及違約處理,定義cno為外來鍵,與course表中的cno關聯,當刪除、更新course中的元組時,級聯刪除、更新sc表中的相應元組,並進行驗證。
alter
table sc
addforeign
key(cno)
references course(cno)
ondelete
cascade
onupdate
cascade
8. 建立乙個觸發器,當向sc表中新增資料時,如果新增的資料與student表中的資料不匹配(沒有對應的學號),則將此資料刪除。
create
trigger sc_8 on sc for
insert
asbegin
declare @bh char
(9)select @bh= inserted.sno from inserted
ifnot
exists(
select sno fromstudent where student.sno=@bh)
delete
from sc where sno=@bh
end9. 建立乙個修改觸發器,當student表中的sno資訊修改時,自動將sc表中的相應資訊也修改。
(簡單要求:修改僅為一條記錄)
(注:8,9的操作使用create trigger命令,觸發器建立成功後,自己使用insert語句,或者update語句進行驗證,驗證完畢,可以將觸發器刪除)
create
trigger student_t onstudent for
update
asbegin
declare @bh char
(9)declare @ah char
(9)select @bh=inserted.sno from inserted
select @ah=deleted.sno from deleted
ifexists
(select sno from sc where sc.sno=@ah)
update sc set sno=@bh where sno=@ah;
end
資料庫完整性
完整性約束條件 實體完整性給出了主鍵的取值的最低約束條件 規則是 主鍵的各個屬性都不能為空。參照完整性給出了在關係之間建立正確的聯絡的約束條件 規則是 外來鍵或者取空值 此時要求外來鍵的各個屬性均為空值 或者等於被參照關係中的主鍵的某個值。使用者自定義完整性 關係數控應用系統中的關係往往還應該滿足一...
資料庫完整性
資料的完整性和安全性 資料庫的完整性和安全性是兩個既有聯絡又不盡相同的概念。資料的完整性是為了防止資料庫中存在不符合語義的資料,也就是防止資料庫中存在不正確的資料。資料的安全性是保護資料庫防止惡意破壞和非法訪問。完整性檢查和控制的防範物件是不合語義的 不正確的資料,防止它們進入資料庫。安全性控制的方...
資料庫完整性
b 更新丟失 b 當有兩個寫程序同時修改相同的資料時,往往會出現乙個寫程序做的修改覆蓋了另乙個寫程序的修改。這種情況是完整性問題最常見的型別。互斥鎖的設計就是防範這種問題的出現。b 髒讀 b 乙個事務修改的資料在提交前被另乙個事務讀取,就會發生髒讀。由於事務提交的修改有可能會被回滾,因而其他事務讀取...