在PostgreSQL中,创建触发器时可以指定它是FOR EACH ROW
还是FOR EACH STATEMENT
。
FOR EACH ROW
:这意味着触发器对每个影响的行独立执行一次。触发器的代码可以引用NEW和OLD关键字来访问更改前后的行值。FOR EACH STATEMENT
:这意味着触发器对每个语句只执行一次,而不是对每行都执行。在一个语句影响多行的情况下,触发器的代码只执行一次,NEW和OLD关键字也只有在这种情况下才是有意义的。
例子:
创建一个FOR EACH ROW
触发器:
CREATE FUNCTION log_updates()
RETURNS TRIGGER AS $$
BEGIN
INSERT INTO audit_log(table_name, row_id, change_date, change_type, old_data, new_data)
VALUES('my_table', NEW.id, now(), 'UPDATE', row_to_json(OLD), row_to_json(NEW));
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER log_updates_trigger
AFTER UPDATE ON my_table
FOR EACH ROW
EXECUTE FUNCTION log_updates();
创建一个FOR EACH STATEMENT
触发器:
CREATE FUNCTION log_deletes()
RETURNS TRIGGER AS $$
BEGIN
INSERT INTO audit_log(table_name, row_id, change_date, change_type, old_data, new_data)
VALUES('my_table', OLD.id, now(), 'DELETE', row_to_json(OLD), '{}');
RETURN OLD;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER log_deletes_trigger
AFTER DELETE ON my_table
FOR EACH STATEMENT
EXECUTE FUNCTION log_deletes();
在这个例子中,log_updates
函数会在每行更新后记录更改,而log_deletes
函数会在每个删除语句执行后记录删除操作。