关于触发器过程(https://www.postgresql.org/docs/9.6/static/plpgsql-trigger.html)的文档说明:"触发器函数必须返回NULL或记录/行".

实例

CREATE TRIGGER my_trigger
AFTER INSERT ON table_name
FOR EACH ROW EXECUTE PROCEDURE some_trigger_function();

假设some_trigger_function()返回RECORD/ROW,我理解过程主体是在此事件、此表等上调用和执行的……但是这个过程的返回值在哪里呢?

问题是:我们何时使用返回值?为什么我们需要这个值?你能给出一个小例子/解释吗,哪个使用了这个返回值?

推荐答案

阅读the documentation:

由每个语句的触发器调用的触发器函数应始终 返回NULL.由每行触发器调用的触发器函数可以返回 调用执行器的表行(HeapTuple类型的值),如果 他们自己 Select .操作的行级触发器之前激发的行级触发器. 以下 Select :

  • 它可以返回NULL以跳过当前行的操作.这指示执行器不执行行级操作,该操作 已调用触发器(插入、修改或删除 特定表行).

  • 仅对于行级INSERT和UPDATE触发器,返回的行将成为要插入的行或将替换 已更新.这允许触发器函数修改 已插入或更新.

触发器前的行级别,不打算导致

行级别而非触发器应返回NULL以指示

事件之后激发的行级触发器的返回值将被忽略 操作,因此它们可以返回NULL.

下面的示例显示了如何有条件地中止触发器中的插入:

create table my_table(id int);

-- do not insert rows with id > 10
create or replace function before_insert_on_my_table()
returns trigger language plpgsql as $$
begin
    return case
        when new.id > 10 then null
        else new
    end;
end $$;

create trigger before_insert_on_my_table
before insert on my_table
for each row execute procedure before_insert_on_my_table();

insert into my_table
values (15), (10), (5), (20)
returning id;

 id 
----
 10
  5
(2 rows)    

Database相关问答推荐

为什么postgres枚举需要4个字节?

获取总和列的比率

我应该为 Realm 中的每个实体定义主键吗?

如何在 Products 表的主键和自然键之间做出决定?

通过生成迁移将索引:唯一添加到 ruby​​ on rails 中的列

从 XML 读取数据

如何在 2 个 MySQL 数据库之间传输数据?

NameError:设置更改为 mysql 后未定义名称_mysql

更改列名 Rails

postgresql 在 where 子句中使用 json 子元素

如何在 MySQL 中强制执行唯一约束?

什么是非关系数据库的例子?

数据完整性和数据一致性之间有什么区别吗?

数以百万计的条目排名

在数据库中存储业务逻辑

传递依赖有什么问题?

将文本列设为唯一键

在 MYSQL 的子查询中使用 LIMIT 关键字的替代方法

分离实体和被管理实体

数据库效率 - 每个用户的表与用户表