1. 程式人生 > >資料庫實驗課作業-2完整性

資料庫實驗課作業-2完整性

 						 資料庫實驗課作業

2完整性

2.1.3內容: (1)在資料庫school中建立表Stu_Union,進行主鍵約束,在沒有違反實體完整性的前提下插入並更新一條記錄。 (2)演示違反實體完整性的插入操作。 (3)演示違反實體完整性的更新操作。 (4)演示事務的處理,包括事物的建立,處理,以及出錯時的事務回退。 (5)通過建立Schoship表,插入資料,演示當與現有的資料環境不等時,無法建立實體完整性以及參照完整性。

程式碼:

use school
--2.1 實體完整性
CREATE TABLE Stu_Union(sno CHAR(5) NOT NULL UNIQUE,
                       sname CHAR(8),
                       ssex CHAR(1),
                       sage INT,
                       sdept CHAR(20),
                       CONSTRAINT  PK_Stu_Union  PRIMARY KEY(sno) );
insert Stu_Union values ( ’10000’,’王敏’,’1’,23,’CS’);
UPDATE Stu_Union SET sno=’’       WHERE sdept=’CS’;
UPDATE Stu_Union SET sno= ’95002’ WHERE sname=’王敏’;
select * from stu_union;   
--以系統管理員或sa使用者登入,進入Management Studio,成功建立表,令SNO為主鍵
 
insert Stu_Union values ( ’95002’,’王嘉’,’1’,23,’CS’);
--插入資訊,但是違反了主鍵唯一性,將破壞實體完整性,系統終止操作
 
UPDATE Stu_Union SET sno= NULL  WHERE  sno=’95002’;
--違反了主鍵not null屬性,將破壞實體完整性,系統終止操作
 
SET XACT_ABORT ON
BEGIN TRANSACTION T1
insert into stu_union values (’95009’,’李勇’,’M’,25,’EE’);
insert into stu_union values (’95003’,’王浩’,’0’,25,’EE’);
insert into stu_union values (’95005’,’王浩’,’0’,25,’EE’);
select * From  stu_union;
--違反了 PRIMARY KEY 約束 ’PK_Stu_Union’。不能在物件 ’dbo.stu_union’ 中插入重複鍵
 
SET XACT_ABORT ON
BEGIN TRANSACTION T2
insert into stu_union values  (’95007’,’李明’,’M’,25,’EE’);
select * From  stu_union;
insert into stu_union values (’95009’,’李進’,’F’,22,’CS’);
COMMIT TRANSACTION T2
--違反了primary key 約束PK_Stu_Union,插入的資料違反實體完整性,插入失敗,事務回滾
 
select * From  stu_union;
--T2失敗時,整個事務回滾到初始狀態
 
Create Table Scholarship
(
    M_ID varchar(10),Stu_id char(10),R_money int
)
insert into Scholarship values (’0001’,’700000’,5000)
insert into Scholarship values (’0001’,’800000’,8000)
select * from Scholarship
 
Alter Table Scholarship add
   Constraint PK_Scholarship Primary key(M_ID)
--無法建立約束,無法在表Scholarship中可為空的列上定義
 
Alter Table Scholarship add
   Constraint FK_Scholarship Foreign key(STU_ID) references STUDENTS(sid)
--ALTER TABLE語句與FOREIGN KEY約束PK_Scholarship衝突
 
 
2.2.3內容:
(1)建立表course,令cno為其主鍵,並在stu_union中插入資料。
(2)建立表SC,令sno和cno分別為參照stu_union表以及Course表外來鍵,設定為級聯刪除,並令(sno,cno)為其主鍵。插入資料
(3)演示違反參照完整性的插入資料。
(4)在stu_union中刪除資料,演示級聯刪除。
(5)在Course中刪除資料,演示級聯刪除。
(6)建立Stu_Card表,令stu_id為參照stu_union表的外來鍵,令card_id為其主鍵,並插入資料。
(7)建立ICBC_card表,令stu_card_id為參照Stu_Card表的外來鍵,令bank_id為其主鍵,並插入資料。
(8)通過刪除students表中的一條記錄,演示三個表的多重級聯刪除。
(9)演示事務中進行多重級聯刪除失敗的處理。
(10)演示互參照問題及其解決方法。
 
程式碼:
--2.2 參照完整性
insert Stu_Union values (’10001’,’李勇’,’0’,24,’EE’)
select * from Stu_Union;
create table Course (
  cno char(4) NOT NULL UNIQUE,
  cname varchar(50) NOT NULL,
  cpoints int,
  constraint PK primary key (cno));  
insert Course values (’0001’,’ComputerNetworks’,2);
insert Course values (’0002’,’Databsae’,3);
--為演示參照完整性,建立表Courses,令cno為其主鍵,並在stu_union中插入資料
 
CREATE TABLE SC(
sno CHAR(5) REFERENCES Stu_Union (sno) on delete cascade,
cno CHAR(4) REFERENCES Course(cno) on delete cascade,
grade INT,
CONSTRAINT PK_SC PRIMARY KEY (sno,cno)
);
insert into sc values (’95002’,’0001’,2);
insert into sc values (’95002’,’0002’,2);
insert into sc values (’10001’,’0001’,2);
insert into sc values (’10001’,’0002’,2);
Select * From SC;
--建立表SC,令sno和cno分別為參照stu_union表以及Courses表的外來鍵,設定為級聯刪除,並令(sno,cno)為其主鍵,在不違反參照完整性的前提下,插入資料
 
 
insert into sc values (’99’,’101’,2);
--演示違反參照完整性的插入資料
 
delete from Stu_Union where sno=’10001’;
select * from SC;
--在Stu_Union中刪除資料,演示級聯刪除
 
delete from Course where cno=’0002’;
select * from SC;
--在Course中刪除資料,演示級聯刪除
 
create table Stu_Card(
       card_id char(14),
       stu_id char (10) references students(sid) on delete cascade,
       remained_money decimal (10,2),
       constraint PK_stu_card Primary key (card_id)
)
insert into  Stu_Card values ( ’05212567’,’800001216’,100.25);
insert into  Stu_Card values ( ’05212222’,’800005753’,200.50); 
select * from Stu_card;
--為了演示多重級聯刪除,建立Stu_Card表,令stu_id為參照stu_union表的外來鍵,令card_id為其主鍵,並插入資料
 
create table ICBC_Card(
       bank_id char(20),
       stu_card_id char (14) references stu_card(card_id) on delete cascade,
       restored_money decimal (10,2),
       constraint PK_Icbc_card Primary key (bank_id)
)
insert into  ICBC_Card values ( ’9558844022312’,’05212567’,15000.1);
insert into  ICBC_Card values ( ’9558844023645’,’05212222’,50000.3); 
select * from ICBC_Card;
--為了演示多重級聯刪除,建立ICBC_Card表,令stu_card_id為參照Stu_Card表的外來鍵,令bank_id為其主鍵,並插入資料
 
alter table choices drop [FK_CHOICES_STUDENTS];
alter table choices add 
CONSTRAINT [FK_CHOICES_STUDENTS] FOREIGN KEY 
(
[sid]
) REFERENCES [dbo].[STUDENTS] (
[sid]
)on delete cascade;
delete from students where sid=’800001216’;
select * from stu_card;
select * from icbc_card;
--通過刪除students表中的一條記錄,演示三個表的多重級聯刪除
 
Alter table ICBC_Card
   drop constraint FK__ICBC_Card__stu_c__6c190EBB;
Alter table ICBC_Card
   add constraint FK_ICBC_Card foreign key (stu_card_id) 
                references Stu_card(card_id) on delete no action ;
--演示事務中進行多重級聯刪除失敗的處理,修改ICBC_Card表的外來鍵屬性,使其變為On delete No action,演示事務中通過刪除students表中的一條記錄,多重級聯刪除失敗,整個事務回滾到初始狀態
 
Begin Transaction del
delete from students where sid=’800005753’;
select * from stu_card;
select * from icbc_card;
Commit Transaction del
--DELETE 語句與 REFERENCE 約束"FK_CHOICES_STUDENTS"衝突。該衝突發生於資料庫"School",表"dbo.CHOICES", column ’sid’
 
select * from stu_card;
select * from icbc_card;
--演示互參照問題及其解決方法
 
create table listen_course (
    teacher_id char(6),tname varchar(20),course_id char(4)
    constraint PK_listen_course primary key(teacher_id)
    constraint FK_listen_course foreign key(course_id) 
                                references teach_course(course_id)
)
create table teach_course(
    course_id char(4),cname varchar(30),teacher_id char(6)
    constraint PK_teach_course primary key(course_id)
    constraint FK_teach_course foreign key(teacher_id) 
                               references listen_course(teacher_id)
) 
--外來鍵 ’FK_listen_course’ 引用了無效的表 ’teach_course’
 
create table listen_course (
    teacher_id char(6),tname varchar(20),course_id char(4)
    constraint PK_listen_course primary key(teacher_id)
)
create table teach_course(
    course_id char(4),cname varchar(30),teacher_id char(6)
    constraint PK_teach_course primary key(course_id)
    constraint FK_teach_course foreign key(teacher_id) 
                               references listen_course(teacher_id)
) 
alter table listen_course
      add constraint FK_listen_course foreign key(course_id) 
                     references teach_course(course_id);
 
 
2.3.3內容:
(1)建立worker表,並自定義兩個約束U1以及U2,其中U1規定Name欄位唯一,U2規定sage(級別)欄位的上限是28.
(2)在worker表中插入一條合法記錄。
(3)演示插入違反U2約束的例子。
(4)去除U2約束
(5)重新插入(3)中想要插入的資料,由於去除了U2約束,所以插入成功。
(6)建立規則rule_sex,規定插入或更新的值只能是M或F,並繫結到worker的sex欄位
(7)演示違反規則rule_sex的插入操作。
 
程式碼:
--2.3 使用者自定義完整性
 
Create Table Worker(
Number char(5),
Name char(8)  constraint U1 unique,
Sex char(1),
Sage int constraint U2 check (Sage<=28),
Department char(20),
constraint PK_Worker Primary Key (Number))
--建立Worker表,並自定義兩個約束u1以及u2,其中u1規定Name欄位唯一,u2規定sage(級別)欄位的上限是28
 
Insert into Worker(Number,Name,Sex,Sage,Department) Values(’00001’,’李勇’,’M’,14,’科技部’)
Select * From Worker
--在Worker表中插入一條合法記錄
 
Insert into Worker(Number,Name,Sex,Sage,Department) Values(’00002’,’王勇’,’M’,38,’科技部’)
Select * From Worker
--演示插入違反u2約束的例子,u2規定元組的sage屬性的值必須小於等於28
 
Alter table worker Drop U2
--去除u2約束
 
Insert into Worker(Number,Name,Sex,Sage,Department) Values(’00002’,’王勇’,’M’,38,’科技部’)
select * from worker
--重新插入(3)中想要插入的資料,由於去除了u2約束,所以插入成功
 
go
create rule rule_sex as @value in (’F’,’M’) 
go
exec sp_bindrule rule_sex ,’worker.[sex]’;
--建立規則rule_sex,規定插入或更新的值只能是M或F,並繫結到Worker的sex欄位
 
insert into worker values (’00003’,’王浩’,’1’,’25’,’研發部’);
--演示違反規則rule_sex的插入操作
 
 
2.4.3內容:
(1)為worker表建立觸發器T1,當插入或是更新表中資料時,保證所操作的記錄的sage值大於0
(2)為worker表建立觸發器T2,禁止刪除編號為00001的CEO。
(3)worker表中的人員編號是不可能改變的,建立觸發器T3實現更新中編號的不可改變性。
(4)演示違反T1觸發器的約束的插入操作
(5)演示違反T1觸發器的約束的更新操作
(6)演示違反T2觸發器的約束的插入操作
(7)演示違反T2觸發器的約束的更新操作
(8)演示INSTEAD OF觸發器在不可更新檢視上的運用。
 
程式碼:
--2.4觸發器·
go
create trigger T1 on worker
for insert , update
as 
if (select sage from inserted)<1
begin
print ’Sage must be a integer more than zero! Tansaction fail’
Rollback transaction
End
--為worker表建立觸發器T1,當插入或是更新表中資料時,保證所操作的記錄的sage值大於0
 
go
create trigger T2 on worker
for delete
as
if (select number from deleted)=’00001’
begin
print ’He is the CEO!Delete Fail!’
Rollback transaction
End
--為worker表建立觸發器T2,禁止刪除編號為00001的CEO
 
go
create trigger T3 on Worker
for update
as
if update(number)
begin
print ’Everynumber cannot be changed!’
Rollback Transaction
End
--worker表中的人員的編號是不可改變的,建立觸發器T3實現更新中編號的不可改變性
 
insert into worker values (’00003’,’李紅’,’F’,-10,’開發部’)
--演示違反T1觸發器的約束的插入操作
 
update worker set sage=-7 where number=’00001’
--演示違反T1觸發器的約束的更新操作
 
delete from worker where name=’李勇’
--演示違反T2觸發器的約束的插入操作
 
update worker set number=’00007’ where sex=’F’
--演示違反T2觸發器的約束的更新操作
 
create view studentscholarship AS
select st.sid,st.sname,st.grade,sc.r_money
from Students st,Scholarship sc
where st.sid= sc.stu_id
--演示INSTEAD OF觸發器在不可更新檢視上的運用