這是我大三第一學期《數據庫基礎》這門課的實驗報告,總共15個實驗,我挑了幾個比較重要的放在博客上,方便查看和復習,尤其是最近SSM后端開發,希望對大家,以及將來的我有所幫助!
實驗要求
在實驗5數據庫設計的基礎上補充設計觸發器,並基於實驗6插入的數據完成實驗
1.為選課表分別建立插入和更新觸發器,如果當前學生累計不及格門數達到5門則給出警示信息
2.為課程表分別建立插入和更新觸發器來建立約束規則:“專業基礎”課的教師必須為“教授”或“副教授”,如果不滿足約束則拒絕操作,並給出錯誤信息。
3.自行再分別設計2~3個觸發器(在實驗報告中要准確描述功能需求)。
4.設計並執行相關的操作,體會DML觸發器的效果和作用。
全部總結鏈接
SQL基礎 (數據庫、表、數據的增刪改查、視圖相關,以及所有實驗報告源代碼)
游標 (類似C++ 的 指針)
存儲過程(類似 C++ 的自定義函數)
觸發器 (類似 自定義的陷阱,或者說是監聽器,滿足某個條件了執行某個方法)
用戶權限及權限管理 (類似Windows的多用戶管理)
並發控制 (了解多個用戶同時對數據造成錯誤的情況 和 解決方法)
數據恢復(當數據庫數據丟失,相應的解決方法)
實驗過程
第一題:為選課表分別建立插入和更新觸發器,如果當前學生累計不及格門數達到5門則給出警示信息
1.1題目:為選課表分別建立插入和更新觸發器,如果當前學生累計不及格門數達到5門則給出警示信息
1.2運行截圖:
圖 1 第一題運行截圖
圖 2 運行后,選課表新增4條數據
1.3分析
創建一個觸發器,每次在學生表新插入記錄時,用sum變量獲取該學生掛科的數目,如果滿5門,使用raiserror函數彈出警告。
第二題第一部分 插入:
2.1.1 題目:為課程表分別建立插入觸發器來建立約束規則:“專業基礎”課的教師必須為“教授”或“副教授”,如果不滿足約束則拒絕操作,並給出錯誤信息。
2.1.2 運行截圖
圖 3 先插入一個新老師,職稱為講師
圖 4 在課程表創建觸發器 功能:(非教授負責的專業基礎課,彈警告)
圖 5 非專業基礎課沒報錯 專業基礎課出錯
2.1.3 分析
先定義一個不讓非教授上專業基礎課的觸發器,然后先新增一個講師,然后新增這位講師的任意選修課程,無錯誤,再嘗試新增專業基礎課程,彈出警告。
第二題——第二部分 更新:
2.2.1 題目:為課程表分別建立更新觸發器來建立約束規則:“專業基礎”課的教師必須為“教授”或“副教授”,如果不滿足約束則拒絕操作,並給出錯誤信息。
2.2.2 運行截圖:
圖 6 嘗試將講師的課程性質改為 ’專業基礎’ 出錯
圖 7 課程改為 ’公共基礎’ 修改成功
2.2.3 分析:
更新同插入,只需把代碼第三行insert改為update即可。
第三題
自定義觸發器1:
3.1.1功能
實現插入學生記錄時,如果生源不為‘浙江’,彈出警告
3.1.2運行截圖
圖 8 實現插入學生記錄時,如果生源不為‘浙江’,彈出警告
圖 9 插入浙江生源學生 正常插入無報錯
3.1.3 分析
在學生表中定義一個觸發器,當插入的數據生源列不為’浙江’的時候,彈出警告,先嘗試插入非浙江學生,報錯;后插入一個浙江學生,正常插入。
自定義觸發器2:
3.2.1功能:實現插入院系記錄時,如果院系名稱結尾不為’系’且不為’部’,彈出警告
3.2.2運行截圖
圖 10 插入院系記錄時,如果院系名稱結尾不為’系’且不為’部’,彈出警告
圖 11 如果插入名稱結尾為‘系’或為‘部’,正常插入
3.2.3 分析
在院系表中定義一個觸發器,當插入的數據院系名稱列不為’系’或者’部’結尾的時候,彈出警告,先嘗試插入院系名稱結尾為’院’的數據,報錯;后插入一個院系名稱結尾為’系’的記錄,正常插入。
自定義觸發器3:
3.3.1功能:實現插入學生記錄時,如果狀態不為‘正常’,彈出警告
3.3.2運行截圖
圖 12 插入學生記錄時,如果狀態不為‘正常’,彈出警告
3.3.3 分析
在學生表中定義一個觸發器,當插入的學生數據 狀態列 不為’正常’的時候,彈出警告,先嘗試插入狀態為留級的記錄,報錯;后插入狀態為正常的記錄,正常插入。
實驗總結
觸發器我的理解就是人為設置一個‘異常陷阱’,當用戶對表中數據進行增刪改時,會激活促發其執行相應的操作,也算是對表中數據的一種約束。
其中rollback transaction語句可以讓警告的時候不執行增刪改語句,如果不加這句警告時還會執行增刪改操作。
基本語法:
create trigger 觸發器名on 表名
for insert/update/delate
as
declare 變量 數據類型
if 主鍵 is not null
begin
if 警告條件
begin
raiserror('需要彈出的警告信息',16,10)
rollback transaction
end
end