【實驗目的】
1、掌握實體完整性約束、參照完整性約束
2、靈活應用自定義完整性約束
3、瞭解觸發器在自定義完整性中的應用
【實驗內容】
一、定義一個教師表Teacher(Tno,TName,TSex,TAge,TSal,TJob,TDept)
要求:
1、性別只能是‘男’或‘女’
2、Tno爲主碼,名字不能爲空,且不能重複。
3、年齡在18在60歲之間
4、教授工資最低爲5000(觸發器完成)
5、所在系Tdept,爲外碼,參照於DEPT表(注:DEPT表需要預先定義,當DEPT表刪除元組時,相對應Teacher元組拒絕刪除;修改時,相對應Teacher元組同時修改)。
二、定義記錄表Record(RNo,TNo,ROldSal,RNewSal,RUser,RTime)
要求:
1、RNo從1開始,每次加1爲。主碼
2、TNo爲外碼,參照Teacher表。
第一題和第二題參考:
- use sc --打開sc數據庫
- go
- /*-------------創建 系表-----------------------------*/
- create table Dept
- (TDept char(10) primary key);
- go
- /*-------------創建 教師表---------------------------*/
- create table Teacher
- (TNo char(10) primary key,
- TName char(10) not null,
- TSex char(2)check(TSex in('男','女')),
- TAge smallint check(TAge>=18 and TAge<=60),
- TSal numeric(7,2),
- TJob varchar(10),
- TDept char(10),
- foreign key (TDept) references Dept(TDept)on delete no action on update cascade);
- go
- /*-------------創建 記錄表---------------------------*/
- create table Record
- (RNo int identity (1,1) primary key,
- TNo char(10) references Teacher(TNo),
- ROldSal numeric(7,2),
- RNewSal numeric(7,2),RUser char(10), RTime Datetime);
- go
- /*-----定義觸發器 教授工資不低於5000-------------------*/
- create trigger Teacher_JiaoShou_MINSal
- on Teacher
- for Insert,Update as
- set Nocount off
- /*---------定義變量----------------------------------*/
- declare
- @TNo char(10),
- @NewSal numeric(7,2),
- @Tjob char(10)
- begin
- /*---------獲得變量值--------------------------------*/
- select @TNo=TNo,
- @NewSal=TSal,
- @Tjob=Tjob
- from inserted
- /*---------判斷是否是教授,且工資小於5000---------------*/
- if (((@NewSal-5000)<0) and (@Tjob='教授'))
- begin
- /*---------修改該員工(教授Tno)表-------------------*/
- update Teacher
- set Tsal=5000
- where Tno=@Tno
- end
- end
- go
三、定義觸發器與觸發器的執行
1、定義觸發器Insert_Teacher,當插入Teacher一行元組時,會將該元組信息如:教師編號TNo,工資等信息,自動插入到表Record中(ROldSal爲0)。
參考代碼:
- /*-----插入Teacher觸發器-----------------*/
- create trigger Insert_Teacher
- on Teacher
- for Insert as
- set Nocount off
- /*---------定義變量----------------------*/
- declare
- @TNo char(10),
- @RNewSal numeric(7,2)
- begin
- /*---------獲得變量值----------------------*/
- select @TNoTNo=TNo,
- @RNewSal=TSal
- from inserted
- /*---------插入要記錄的數據到Record表----------------------*/
- insert into Record(TNo,ROldSal,RNewSal,RUser,RTime) values(@TNo,0,@RNewSal,current_user,current_timestamp)
- end
測試數據
- insert into dept
- values('信息工程系')
- insert into teacher
- values ('2008001','wang','男',34,2000,'講師','信息工程系')
- select * from teacher
2、定義觸發器Update_Teacher,每當修改Teacher數據,且工資發生變動時,會自動記錄工資變動情況到Record表。
參考代碼:
- /*-----更新Teacher觸發器-----------------*/
- create trigger Update_Teacher
- on Teacher
- for update as
- set Nocount off
- /*---------定義變量----------------------*/
- declare
- @TNo char(10),
- @ROldSal numeric(7,2),
- @RNewSal numeric(7,2)
- begin
- /*---------獲得變量值----------------------*/
- select @TNoTNo=TNo,
- @ROldSal=TSal
- from deleted
- select @TNoTNo=TNo,
- @RNewSal=TSal
- from inserted
- /*---------插入要記錄的數據到Record表----------------------*/
- insert into Record(TNo,ROldSal,RNewSal,RUser,RTime) values(@TNo,@ROldSal,@RNewSal,current_user,current_timestamp)
- end
測試代碼:
- update teacher
- set tsal=3000
- where tno='2008001'
- select * from record
3、定義觸發器Delete_Teacher,當刪除Teacher數據時,會自動記錄刪除數據情況到Delete_teacher表。即記錄教師所有信息和用戶及刪除時間。(自己完成)
4、完成以上觸發器的測試。
說明:
1)能夠觸發Insert_Teacher觸發器的,有對Teacher表進行Insert操作和Update操作。
2)能夠觸發Delete_Teacher觸發器的,有對Teacher表進行Delete操作和Update操作。
3)能夠觸發Update_Teacher觸發器的,只有有對Teacher表進行Update操作。
【課外實驗】
一、建立如下關係表
工程表(工程號,工程名,開工日期,竣工日期,狀態,城市,項目經理號)
職工表(職工號,姓名,年齡,籍貫,職稱,基本工資)
崗位表(崗位號,崗位名)
工資表(序號,職工號,月份,績效工資,獎金)
要求:1、籍貫只記城市。
2、正確確定四個表的主碼
3、通過外碼,正確把握關係間的聯繫
4、工程與職工具有多對多的聯繫,建立一個工程_職工表(工程號,職工號,崗位號,入職時間,狀態)
5、工程表的狀態有兩種狀態(0:未完工,1:已完工)
工程_職工表的狀態有兩種(0:在職,2:已離職)
6、工資表的月份只能取1-12,獎金只能取100的倍數
7、職工表的年齡取值範圍是18-60;職稱取值爲:初級、中級、高級;要求所有人員基本工資不低於800,高級人員的基本工資不低於4500.
二、創建視圖工資視圖(序號,職工號,月份,基本工資,績效工資,獎金,五險一金,應發,個人所得稅,實發)
三、是否能刪除工程表的工程