达梦数据库(DM Database)作为国产数据库的代表之一,提供了丰富的功能以满足企业级应用需求。触发器是达梦数据库中一种非常重要的特性,它允许用户在特定事件发生时自动执行预定义的SQL语句或逻辑代码。本文将通过实例详细介绍达梦数据库中触发器的应用场景、创建方法以及注意事项。
触发器是一种特殊的存储过程,它绑定到表或视图上,并在指定事件(如INSERT
、UPDATE
或DELETE
)发生时自动执行。触发器的主要作用包括:
达梦数据库支持以下类型的触发器:
INSERT
、UPDATE
和DELETE
操作。达梦数据库中创建触发器的基本语法如下:
CREATE TRIGGER trigger_name
{ BEFORE | AFTER } { INSERT | UPDATE [OF column_list] | DELETE }
ON table_name
[FOR EACH ROW]
BEGIN
-- 触发器逻辑代码
END;
trigger_name
:触发器的名称。{BEFORE | AFTER}
:指定触发器是在事件发生前还是后执行。{INSERT | UPDATE | DELETE}
:触发器响应的事件类型。table_name
:触发器绑定的表名。[FOR EACH ROW]
:表示触发器为每一行数据单独执行。BEGIN ... END
:触发器逻辑代码块。假设有一个employees
表,包含以下字段:
id
:员工IDname
:员工姓名entry_date
:入职日期我们希望在每次插入新员工时,自动填充entry_date
字段为当前时间。
CREATE TRIGGER trg_insert_employee
BEFORE INSERT ON employees
FOR EACH ROW
BEGIN
IF :NEW.entry_date IS NULL THEN
:NEW.entry_date := SYSDATE;
END IF;
END;
:NEW
:表示即将插入的新记录。SYSDATE
:获取当前系统时间。entry_date
为空,则自动填充为当前时间。假设需要对employees
表的修改操作进行审计,记录每次修改的时间和内容。可以创建一个日志表employee_logs
,并编写触发器。
CREATE TABLE employee_logs (
log_id INT PRIMARY KEY AUTO_INCREMENT,
employee_id INT,
change_time TIMESTAMP,
old_salary DECIMAL(10, 2),
new_salary DECIMAL(10, 2)
);
CREATE TRIGGER trg_update_employee
AFTER UPDATE OF salary ON employees
FOR EACH ROW
BEGIN
INSERT INTO employee_logs (employee_id, change_time, old_salary, new_salary)
VALUES (:OLD.id, SYSDATE, :OLD.salary, :NEW.salary);
END;
:OLD
:表示更新前的旧记录。:NEW
:表示更新后的新记录。salary
字段时,触发器会将旧值和新值记录到employee_logs
表中。假设有一个orders
表和order_details
表,分别存储订单和订单明细信息。当删除某个订单时,需要同时删除其对应的明细记录。
CREATE TRIGGER trg_delete_order
BEFORE DELETE ON orders
FOR EACH ROW
BEGIN
DELETE FROM order_details WHERE order_id = :OLD.id;
END;
orders
表中的记录之前,触发器会先删除order_details
表中相关的明细记录。ALTER TRIGGER trigger_name DISABLE; -- 禁用触发器
ALTER TRIGGER trigger_name ENABLE; -- 启用触发器