触发功能不存在,但我很确定它存在

1 postgresql trigger stored-procedures plpgsql functions

我有一个程序:

create or replace procedure pro_update_last_read(in input_sensor_id integer, in read_time timestamp)
as
$$
begin
    update sensor
    set last_read = read_time
    where sensor_id = input_sensor_id;
end;
$$ language plpgsql;
Run Code Online (Sandbox Code Playgroud)

以及一个调用它的触发器:

create trigger tri_last_read
    after insert or update of report_time
    on report
execute procedure pro_update_last_read(sensor_id, report_time);
Run Code Online (Sandbox Code Playgroud)

但是,在创建触发器时,我收到错误消息:

 [42883] ERROR: function pro_update_last_read() does not exist
Run Code Online (Sandbox Code Playgroud)

为什么会发生这个错误?

Lau*_*lbe 5

您必须使用函数,而不是过程:

CREATE FUNCTION pro_update_last_read() RETURNS trigger ...
Run Code Online (Sandbox Code Playgroud)

必须定义触发器FOR EACH ROW,并且不能将列传递给触发器函数。

您访问触发器函数中的列的方式是通过NEW变量:NEW.sensor_idNEW.report_time