資料庫實驗課作業-2完整性
阿新 • • 發佈:2018-12-21
資料庫實驗課作業
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觸發器在不可更新檢視上的運用