一、實驗目的:
-
熟悉通過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
BEGIN
IF
(old.dept != new.dept) THEN
INSERT INTO dept_history ( eid, old, new, uptime )
VALUES(new.eid, old.dept, new.dept, new.uptime );
END IF;
IF
(old.salary != new.salary) THEN
INSERT INTO sal_history ( eid, old, new, uptime )
VALUES(new.eid, old.salary, new.salary, new.uptime );
END IF;
END$
DELIMITER ;
五、實驗小結:
觸發器觸發時間分為 before和 after,顧名思義,before代表觸發器里面的命令在修改資料之前執行,after代表觸發器里面的命令在修改資料命令之后執行,
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/244348.html
標籤:其他
