1.実験の目的:
-
SQLによるデータ整合性制御に精通している。
-
実際のアプリケーションで整合性制御方法を実践します。
-
トリガーの作成と使用を練習します。
2.実験内容:
特定の従業員管理データベースに基づいて、トリガーを使用してデータ整合性制御を実現し、次の機能を完了します。
-
従業員が仕事に就いたときに、変更履歴テーブルに従業員の初期部門と給与情報を記録するトリガーを作成します。
-
従業員情報の変更を実装するトリガーを作成するときは、従業員の部門または給与の変更を変更履歴テーブルに記録します。
-
従業員が退職すると、退職前の給与が変更履歴テーブルに自動的にバックアップされることを実現するトリガーを作成します。
3.トピック:
従業員情報管理システムでは、従業員が部門に出入りしたり、部門を異動したり、給与を変更したりするときに、変更情報を変更履歴に記録する必要があります。この機能を完了するには、トリガーを使用してください。変更履歴には、部門変更履歴と給与変更履歴が含まれます。部門変更履歴テーブルと給与変更履歴テーブルは、対応する情報を記録するために使用されます。
参照テーブルの構造は次のとおりです。
-
従業員テーブル: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は転送前の部門(新しい従業員の古い値が記録されます(NULL)、新しいは異動後の部門、稼働時間は変更時間です。 -
給与変更履歴テーブル:sal_history(shid、eid、old、new、uptime)
ここで、shidは給与変更番号(自動的に増加、割り当ては不要)、eidは従業員番号、oldは変更前の給与、newは変更後の給与です。稼働時間は変更時間です。
トリガーの要件は次のとおりです。
-
新しい従業員が仕事に入ると、1つのデータが従業員情報テーブルに挿入されます。同時に、トリガーは、古い値がnullである部門変更履歴に1レコードを追加し、古い値が0である給与変更履歴に1レコードを追加します。
-
新入社員の部門または給与が変更されると、トリガーは次のアクションを実行します。部門が変更されると、変更履歴に1つのレコードが追加されます。給与が変更されると、賃金変更履歴に1つのレコードが追加されます。
4.実験プロセス:
データベースを作成します。
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の給与変更履歴に1レコードを追加します。
挿入トリガーの作成:
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 ;
質問2:新入社員の部門または給与が変更されると、トリガーは次の操作を実行します。部門が変更されると、変更履歴に1つのレコードが追加されます。給与が変更されると、賃金変更履歴に1つのレコードが追加されます。
更新トリガーの作成:
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 ;
5.実験の要約:
トリガートリガー時間は、前後に分けられます。名前が示すように、beforeは、データが変更される前にトリガー内のコマンドが実行されることを表し、afterは、データが変更された後にトリガー内のコマンドが実行されることを表します。