📜  PostgreSQL-触发器(1)

📅  最后修改于: 2023-12-03 15:18:39.543000             🧑  作者: Mango

PostgreSQL 触发器

PostgreSQL 是一个功能丰富的关系型数据库管理系统,它提供了触发器这种强大的功能,可以在特定事件发生时触发一系列动作。

什么是触发器?

触发器是一种数据库对象,它们与表相关联并在特定的数据操作(如插入、更新和删除)上触发。当数据被修改时,触发器会在操作之前或之后执行一些操作。这使得在特定条件下自动执行一些任务成为可能,而不需要手动执行相应的操作。

PostgreSQL 触发器的类型

PostgreSQL 支持 3 种触发器类型:

  1. BEFORE 触发器:在执行操作之前触发,可以用来检查数据约束和默认值约束是否满足,或用于处理一些计算。

  2. AFTER 触发器:在执行操作之后触发,可以用于记录日志、更改其他表、发送电子邮件等。

  3. INSTEAD OF 触发器:替代 SQL 语句的执行,可以在操作之前或之后触发。

创建触发器

下面是创建一个简单触发器的语法:

CREATE TRIGGER trigger_name
AFTER INSERT
ON table_name
FOR EACH ROW
EXECUTE PROCEDURE trigger_function();

其中,trigger_name 是触发器的名称,AFTER INSERT 触发器在插入操作后触发,table_name 是关联表的名称,FOR EACH ROW 每次插入一行都会触发,trigger_function() 是触发器函数名称。

触发器函数

触发器函数是一个 PL/pgSQL 函数,它在触发器被触发时执行。函数的返回类型必须为触发器类型之一(BEFORE、AFTER 或 INSTEAD OF)。下面是一个简单的触发器函数:

CREATE FUNCTION trigger_function_name() RETURNS TRIGGER AS $$
BEGIN
    -- 在这里放置触发器的逻辑
    RETURN NEW;
END;
$$ LANGUAGE plpgsql;

其中,trigger_function_name 是触发器函数的名称。

触发器示例

下面是一个简单的触发器示例,当插入一行数据到 orders 表时,在一个单独的日志表上插入一行记录:

CREATE TABLE orders (
    order_id serial PRIMARY KEY,
    customer_name VARCHAR (255) NOT NULL
);

CREATE TABLE orders_log (
    log_id serial PRIMARY KEY,
    order_id integer,
    customer_name VARCHAR (255) NOT NULL,
    created_timestamp TIMESTAMP NOT NULL DEFAULT NOW()
);

CREATE OR REPLACE FUNCTION insert_order_log() RETURNS TRIGGER AS $$
BEGIN
    INSERT INTO orders_log (order_id, customer_name) VALUES (NEW.order_id, NEW.customer_name);
    RETURN NEW;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER after_insert_orders
AFTER INSERT
ON orders
FOR EACH ROW
EXECUTE PROCEDURE insert_order_log();

在执行 INSERT INTO orders (customer_name) VALUES ('John Doe'); 之后,将在 orders_log 表中创建一行记录,它的 order_id 是 1,customer_name 是 'John Doe'。

总结

触发器是一个强大的功能,可以帮助我们在特定事件发生时自动执行一些任务。本文介绍了 PostgreSQL 触发器的类型、创建和触发器函数,以及一个简单的示例。在实际应用中,我们可以根据具体需求设计并使用触发器。