實驗五 數據庫完整性

 

【實驗目的】

    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表。


     第一題和第二題參考:

    

  1. use sc     --打開sc數據庫  
  2. go  
  3.   
  4. /*-------------創建 系表-----------------------------*/  
  5. create table Dept  
  6. (TDept char(10) primary key);  
  7. go  
  8.   
  9. /*-------------創建 教師表---------------------------*/  
  10. create table Teacher  
  11. (TNo char(10) primary key,  
  12. TName char(10) not null,  
  13. TSex char(2)check(TSex in('男','女')),  
  14. TAge smallint check(TAge>=18 and TAge<=60),  
  15. TSal numeric(7,2),  
  16. TJob varchar(10),  
  17. TDept char(10),  
  18. foreign key (TDept) references Dept(TDept)on delete no action   on update cascade);    
  19. go     
  20.   
  21. /*-------------創建 記錄表---------------------------*/  
  22. create table Record  
  23. (RNo  int  identity (1,1) primary key,  
  24. TNo char(10) references Teacher(TNo),  
  25. ROldSal numeric(7,2),  
  26. RNewSal numeric(7,2),RUser char(10), RTime Datetime);  
  27. go   
  28.   
  29.   
  30. /*-----定義觸發器 教授工資不低於5000-------------------*/   
  31. create trigger Teacher_JiaoShou_MINSal   
  32. on  Teacher   
  33.   
  34. for Insert,Update as   
  35.   
  36. set Nocount off  
  37. /*---------定義變量----------------------------------*/  
  38. declare   
  39.  @TNo char(10),  
  40.  @NewSal numeric(7,2),  
  41.  @Tjob char(10)  
  42. begin  
  43.  /*---------獲得變量值--------------------------------*/  
  44.  select @TNo=TNo,  
  45.  @NewSal=TSal,  
  46.  @Tjob=Tjob   
  47.  from inserted   
  48.   
  49.  /*---------判斷是否是教授,且工資小於5000---------------*/  
  50.  if (((@NewSal-5000)<0) and (@Tjob='教授'))  
  51.   begin  
  52.    /*---------修改該員工(教授Tno)表-------------------*/  
  53.    update Teacher   
  54.    set Tsal=5000  
  55.    where Tno=@Tno  
  56.   end  
  57. end  
  58. go  

 

三、定義觸發器與觸發器的執行
    1、定義觸發器Insert_Teacher,當插入Teacher一行元組時,會將該元組信息如:教師編號TNo,工資等信息,自動插入到表Record中(ROldSal爲0)。

    參考代碼:

   

  1. /*-----插入Teacher觸發器-----------------*/   
  2. create trigger Insert_Teacher   
  3. on  Teacher   
  4.   
  5. for Insert as   
  6.   
  7. set Nocount off  
  8. /*---------定義變量----------------------*/  
  9. declare   
  10.  @TNo char(10),  
  11.  @RNewSal numeric(7,2)  
  12. begin  
  13.  /*---------獲得變量值----------------------*/  
  14.  select @TNoTNo=TNo,  
  15.  @RNewSal=TSal   
  16.  from inserted   
  17.  /*---------插入要記錄的數據到Record表----------------------*/  
  18.  insert into Record(TNo,ROldSal,RNewSal,RUser,RTime) values(@TNo,0,@RNewSal,current_user,current_timestamp)  
  19. end  

 

    測試數據

   

  1. insert into dept  
  2. values('信息工程系')  
  3. insert into teacher  
  4. values ('2008001','wang','男',34,2000,'講師','信息工程系')  
  5. select * from teacher  

 

    2、定義觸發器Update_Teacher,每當修改Teacher數據,且工資發生變動時,會自動記錄工資變動情況到Record表。

    參考代碼:

   

  1. /*-----更新Teacher觸發器-----------------*/   
  2. create trigger Update_Teacher   
  3. on  Teacher   
  4.   
  5. for update as   
  6.   
  7. set Nocount off  
  8. /*---------定義變量----------------------*/  
  9. declare   
  10.  @TNo char(10),  
  11.  @ROldSal numeric(7,2),  
  12.  @RNewSal numeric(7,2)  
  13.   
  14. begin  
  15.  /*---------獲得變量值----------------------*/  
  16.  select @TNoTNo=TNo,  
  17.  @ROldSal=TSal  
  18.  from deleted   
  19.   
  20.  select @TNoTNo=TNo,  
  21.  @RNewSal=TSal   
  22.  from inserted   
  23.  /*---------插入要記錄的數據到Record表----------------------*/  
  24.  insert into Record(TNo,ROldSal,RNewSal,RUser,RTime) values(@TNo,@ROldSal,@RNewSal,current_user,current_timestamp)  
  25. end  

 

    測試代碼:

   

  1. update teacher  
  2. set tsal=3000  
  3. where tno='2008001'  
  4.   
  5. 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.

           

    二、創建視圖工資視圖(序號,職工號,月份,基本工資,績效工資,獎金,五險一金,應發,個人所得稅,實發)

     三、是否能刪除工程表的工程

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章