触发器类型
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