PostgreSQL 触发器是数据库对象,用于在特定的数据操作(如插入、更新、删除)发生时自动触发与之关联的函数。触发器允许在数据层面上实现复杂的业务逻辑,以保持数据的完整性和一致性。以下是有关 PostgreSQL 触发器行为的概述:

触发器类型

1. BEFORE 触发器: 在实际数据操作(INSERT、UPDATE、DELETE)发生之前触发。可以用于修改将要插入、更新或删除的数据。

2. AFTER 触发器: 在实际数据操作(INSERT、UPDATE、DELETE)发生之后触发。可以用于在数据变更后执行一些附加操作。

触发时机

触发器可以与表上的以下操作相关联:

  •  INSERT: 当向表中插入新行时触发。

  •  UPDATE: 当更新表中的行时触发。

  •  DELETE: 当从表中删除行时触发。


行级触发器与语句级触发器

1. 行级触发器(FOR EACH ROW): 针对每一行数据变更触发一次。在触发函数中,可以使用 NEW 和 OLD 来引用新旧数据。

2. 语句级触发器(FOR EACH STATEMENT): 针对每个数据操作语句触发一次。在触发函数中,不能使用 NEW 和 OLD,因为它们只在行级触发器中有效。

访问 NEW 和 OLD

  •  NEW: 在 INSERT 和 UPDATE 触发器中,NEW 代表将要插入或更新的新行的数据。在 DELETE 触发器中,NEW 为 NULL。

  
  •  OLD: 在 UPDATE 和 DELETE 触发器中,OLD 代表将要被更新或删除的旧行的数据。在 INSERT 触发器中,OLD 为 NULL。


触发器函数

触发器与一个特定的触发函数关联,该函数实现了在触发时要执行的业务逻辑。触发函数通常使用 PL/pgSQL(或其他支持的语言)编写。

示例

下面是一个简单的示例,演示如何创建一个 BEFORE INSERT 触发器,用于检查新插入的数据是否满足特定条件:
CREATE TABLE example_table (
    id SERIAL PRIMARY KEY,
    value INTEGER
);

CREATE OR REPLACE FUNCTION check_value_before_insert()
RETURNS TRIGGER AS $$
BEGIN
    IF NEW.value < 0 THEN
        RAISE EXCEPTION 'Value must be non-negative';
    END IF;
    RETURN NEW;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER before_insert_trigger
BEFORE INSERT ON example_table
FOR EACH ROW
EXECUTE FUNCTION check_value_before_insert();

在这个示例中,check_value_before_insert 函数在每次插入新行之前检查 value 是否为非负数。如果不满足条件,将引发异常。创建了一个 BEFORE INSERT 触发器,将其与表 example_table 关联,以在插入操作之前触发。


转载请注明出处:http://www.zyzy.cn/article/detail/8483/PostgreSQL