数据库系统(四)——触发器
一、實驗目的:
熟悉通過SQL對數據進行完整性控制;
練習實際應用中完整性控制方法;
練習觸發器的創建和使用。
二、實驗內容 :
基于某員工管理數據庫,使用觸發器實現數據完整性控制,完成以下功能:
創建觸發器實現員工入職時,記錄員工初始部門和工資信息到變動歷史表中;
創建觸發器實現員工信息變更時,記錄員工的部門或工資變動情況到變動歷史表中;
創建觸發器實現員工離職時,自動備份離職前的工資到變動歷史表中。
三、題目:
某員工信息管理系統中,當員工入職、離職、調動部門或工資變動時,需將變動信息記入變動歷史中,請使用觸發器完成此功能。變動歷史包含部門變動歷史和工資變動歷史,分別使用部門變動歷史表和工資變動歷史表記錄對應信息。
參考表結構如下:
員工表:employee(eid,ename,dept,salary,uptime,stutus)
其中eid為員工編號,ename為員工姓名,dept為所在部門,salary為工資,uptime為修改時間,stutus為狀態(1表示在職,0表示離職)。
部門變動歷史表:dept_history(dhid, eid, old, new, uptime)
其中dhid為部門變動編號(自動增長,無需賦值),eid為員工編號,old為調動前的部門(新入職的員工old值記為NULL),new為調動后的部門,uptime為修改時間。
工資變動歷史表:sal_history(shid, eid, old, new, uptime)
其中shid為工資變動編號(自動增長,無需賦值),eid為員工編號,old為變動前的工資,new為變動后的工資,uptime為修改時間。
觸發器要求如下:
當新職工入職時,員工信息表將插入1條數據。同時,觸發器在部門變動歷史中增加1條記錄,其中old值為null;在工資變動歷史中增加1條記錄,其中old值為0。
當新職工部門或工資發生變化時,觸發器執行以下操作。若部門發生變動,則在變動歷史中增加1條記錄;若工資發生變動,則在工資變動歷史中增加1條記錄。
四、實驗過程:
創建數據庫:
CREATE DATABASE emp;-- 創建員工表 CREATE TABLE employee ( eid CHAR (6) PRIMARY KEY, ename VARCHAR (10) UNIQUE, dept VARCHAR (10) UNIQUE, salary INT, uptime datetime, status char(1) ) --插入數據 INSERT INTO employee VALUES( '1001', 'zs', '軟開', 3000, CURRENT_TIMESTAMP, '1' );-- 創建部門變動歷史表 CREATE TABLE dept_history (dhid INT PRIMARY KEY AUTO_INCREMENT,eid CHAR (6),old VARCHAR (10),new VARCHAR (10),uptime datetime ) -- 創建工資變動歷史表 CREATE TABLE sal_history ( shid INT PRIMARY KEY AUTO_INCREMENT, eid CHAR (6), old INT, new INT, uptime datetime )問題一:當新職工入職時,員工信息表將插入1條數據。同時,觸發器在部門變動歷史中增加1條記錄,其中olddept值為null;在工資變動歷史中增加1條記錄,其中oldsal值為0。
創建insert觸發器:
DELIMITER $ CREATE TRIGGER emp_insert AFTER INSERT ON employee FOR EACH ROW BEGIN INSERT INTO dept_history ( eid, old, new, uptime )VALUES( new.eid, NULL, new.dept, new.uptime );INSERT INTO sal_history ( eid, old, new, uptime )VALUES( new.eid, 0, new.salary, new.uptime ); END$ DELIMITER ;問題二:當新職工部門或工資發生變化時,觸發器執行以下操作。若部門發生變動,則在變動歷史中增加1條記錄;若工資發生變動,則在工資變動歷史中增加1條記錄。
創建update觸發器:
DELIMITER $ CREATE TRIGGER emp_update AFTER UPDATE ON employee FOR EACH ROW BEGINIF(old.dept != new.dept) THENINSERT INTO dept_history ( eid, old, new, uptime )VALUES(new.eid, old.dept, new.dept, new.uptime );END IF;IF(old.salary != new.salary) THENINSERT INTO sal_history ( eid, old, new, uptime )VALUES(new.eid, old.salary, new.salary, new.uptime ); END IF; END$ DELIMITER ;五、實驗小結:
觸發器觸發時間分為 before和 after,顧名思義,before代表觸發器里面的命令在修改數據之前執行,after代表觸發器里面的命令在修改數據命令之后執行。
總結
以上是生活随笔為你收集整理的数据库系统(四)——触发器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数据库系统(三)——数据库安全性控制
- 下一篇: Google Hacking语法总结