触发器(Trigger)是数据库中的一种对象,它定义了一组在特定事件发生时自动执行的SQL语句。触发器通常用于实现自动化操作、保持数据完整性和一致性、记录审计日志等。触发器可以在以下事件发生时触发:
- 表上的DML操作(INSERT、UPDATE、DELETE)。
- 表上的DDL操作(CREATE、ALTER、DROP)。
- 数据库系统事件(如用户登录、断开连接)。
主要特点
- 自动执行:触发器在特定事件发生时自动执行,无需手动调用。
- 数据完整性:通过触发器可以确保数据的完整性和一致性。
- 审计和日志记录:触发器可以用于记录数据变化和用户操作。
- 复杂业务逻辑:触发器可以封装复杂的业务逻辑,使其在特定事件发生时自动执行。
创建和管理触发器
以下是一些创建和管理触发器的示例代码:
创建触发器
创建触发器的基本语法如下:
CREATE [OR REPLACE] TRIGGER trigger_name
{BEFORE | AFTER | INSTEAD OF} {INSERT | UPDATE | DELETE}
ON table_name
[FOR EACH ROW]
[WHEN (condition)]
BEGIN
-- 触发器主体
-- PL/SQL 代码
END;
解释:
OR REPLACE:如果触发器已经存在,则替换它。BEFORE:在触发事件之前执行触发器。AFTER:在触发事件之后执行触发器。INSTEAD OF:替代触发事件的操作(通常用于视图)。FOR EACH ROW:表示行级触发器,每次操作影响的每一行都会执行触发器。WHEN:指定触发器触发的条件。
示例代码
以下是一个具体的示例,展示了如何创建和使用触发器。
示例1:创建一个在插入新员工记录时自动记录日志的触发器
-- 创建日志表
CREATE TABLE emp_audit (
audit_id NUMBER PRIMARY KEY,
emp_id NUMBER,
action VARCHAR2(50),
action_date DATE
);
-- 创建触发器
CREATE OR REPLACE TRIGGER emp_insert_audit
AFTER INSERT ON employees
FOR EACH ROW
BEGIN
INSERT INTO emp_audit (audit_id, emp_id, action, action_date)
VALUES (emp_audit_seq.NEXTVAL, :NEW.employee_id, 'INSERT', SYSDATE);
END;
示例2:创建一个在更新员工工资时检查新工资是否符合条件的触发器
-- 创建触发器
CREATE OR REPLACE TRIGGER emp_salary_check
BEFORE UPDATE OF salary ON employees
FOR EACH ROW
BEGIN
IF :NEW.salary < 0 THEN
RAISE_APPLICATION_ERROR(-20001, 'Salary cannot be negative');
END IF;
END;
修改触发器
可以通过CREATE OR REPLACE TRIGGER语句来修改触发器:
-- 修改触发器
CREATE OR REPLACE TRIGGER emp_insert_audit
AFTER INSERT OR UPDATE ON employees
FOR EACH ROW
BEGIN
INSERT INTO emp_audit (audit_id, emp_id, action, action_date)
VALUES (emp_audit_seq.NEXTVAL, :NEW.employee_id, 'INSERT/UPDATE', SYSDATE);
END;
删除触发器
可以通过DROP TRIGGER语句来删除触发器:
-- 删除触发器
DROP TRIGGER emp_insert_audit;
查询触发器信息
可以通过数据字典视图查询触发器的相关信息:
-- 查询所有触发器
SELECT * FROM user_triggers;
-- 查询特定触发器的详细信息
SELECT * FROM user_triggers WHERE trigger_name = 'EMP_INSERT_AUDIT';
示例
以下是一个完整的示例,展示了如何创建、使用、修改和查询触发器:
-- 创建日志表
CREATE TABLE emp_audit (
audit_id NUMBER PRIMARY KEY,
emp_id NUMBER,
action VARCHAR2(50),
action_date DATE
);
-- 创建序列用于生成唯一的audit_id
CREATE SEQUENCE emp_audit_seq
START WITH 1
INCREMENT BY 1;
-- 创建触发器,在插入新员工记录时自动记录日志
CREATE OR REPLACE TRIGGER emp_insert_audit
AFTER INSERT ON employees
FOR EACH ROW
BEGIN
INSERT INTO emp_audit (audit_id, emp_id, action, action_date)
VALUES (emp_audit_seq.NEXTVAL, :NEW.employee_id, 'INSERT', SYSDATE);
END;
-- 查询触发器信息
SELECT * FROM user_triggers;
-- 修改触发器,在更新员工记录时也记录日志
CREATE OR REPLACE TRIGGER emp_insert_audit
AFTER INSERT OR UPDATE ON employees
FOR EACH ROW
BEGIN
INSERT INTO emp_audit (audit_id, emp_id, action, action_date)
VALUES (emp_audit_seq.NEXTVAL, :NEW.employee_id, 'INSERT/UPDATE', SYSDATE);
END;
-- 删除触发器
DROP TRIGGER emp_insert_audit;
总结
触发器是数据库中的一种对象,用于在特定事件发生时自动执行一组SQL语句。通过使用触发器,可以实现自动化操作、保持数据完整性和一致性、记录审计日志等。理解触发器的概念及其使用方法,对于数据库管理和应用程序开发至关重要。