データベースシステム(4)-トリガー

1.実験の目的:

  1. SQLによるデータ整合性制御に精通している。

  2. 実際のアプリケーションで整合性制御方法を実践します。

  3. トリガーの作成と使用を練習します。

2.実験内容:

特定の従業員管理データベースに基づいて、トリガーを使用してデータ整合性制御を実現し、次の機能を完了します。

  1. 従業員が仕事に就いたときに、変更履歴テーブルに従業員の初期部門と給与情報を記録するトリガーを作成します。

  2. 従業員情報の変更を実装するトリガーを作成するときは、従業員の部門または給与の変更を変更履歴テーブルに記録します。

  3. 従業員が退職すると、退職前の給与が変更履歴テーブルに自動的にバックアップされることを実現するトリガーを作成します。

3.トピック:

従業員情報管理システムでは、従業員が部門に出入りしたり、部門を異動したり、給与を変更したりするときに、変更情報を変更履歴に記録する必要があります。この機能を完了するには、トリガーを使用してください。変更履歴には、部門変更履歴と給与変更履歴が含まれます。部門変更履歴テーブルと給与変更履歴テーブルは、対応する情報を記録するために使用されます。

参照テーブルの構造は次のとおりです。

  1. 従業員テーブル:employee(eid、ename、dept、salary、uptime、stutus)
    ここで、eidは従業員番号、enameは従業員の名前、deptは部門、salaryは給与、uptimeは変更時間、stutusはステータス(1はアクティブ、0は辞任を意味します)。

  2. 部門変更履歴テーブル:dept_history(dhid、eid、old、new、uptime)
    ここで、dhidは部門変更番号(自動拡張、割り当てる必要はありません)、eidは従業員番号、oldは転送前の部門(新しい従業員の古い値が記録されます(NULL)、新しいは異動後の部門、稼働時間は変更時間です。

  3. 給与変更履歴テーブル:sal_history(shid、eid、old、new、uptime)
    ここで、shidは給与変更番号(自動的に増加、割り当ては不要)、eidは従業員番号、oldは変更前の給与、newは変更後の給与です。稼働時間は変更時間です。

トリガーの要件は次のとおりです。

  1. 新しい従業員が仕事に入ると、1つのデータが従業員情報テーブルに挿入されます。同時に、トリガーは、古い値がnullである部門変更履歴に1レコードを追加し、古い値が0である給与変更履歴に1レコードを追加します。

  2. 新入社員の部門または給与が変更されると、トリガーは次のアクションを実行します。部門が変更されると、変更履歴に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は、データが変更された後にトリガー内のコマンドが実行されることを表します。

おすすめ

転載: blog.csdn.net/qq_43531669/article/details/111647383