Oracle(20)什么是触发器(Trigger)?

190 阅读3分钟

触发器(Trigger)是数据库中的一种对象,它定义了一组在特定事件发生时自动执行的SQL语句。触发器通常用于实现自动化操作、保持数据完整性和一致性、记录审计日志等。触发器可以在以下事件发生时触发:

  1. 表上的DML操作(INSERT、UPDATE、DELETE)。
  2. 表上的DDL操作(CREATE、ALTER、DROP)。
  3. 数据库系统事件(如用户登录、断开连接)。

主要特点

  1. 自动执行:触发器在特定事件发生时自动执行,无需手动调用。
  2. 数据完整性:通过触发器可以确保数据的完整性和一致性。
  3. 审计和日志记录:触发器可以用于记录数据变化和用户操作。
  4. 复杂业务逻辑:触发器可以封装复杂的业务逻辑,使其在特定事件发生时自动执行。

创建和管理触发器

以下是一些创建和管理触发器的示例代码:

创建触发器

创建触发器的基本语法如下:

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语句。通过使用触发器,可以实现自动化操作、保持数据完整性和一致性、记录审计日志等。理解触发器的概念及其使用方法,对于数据库管理和应用程序开发至关重要。