Postgresql - 是否可以在触发器中调用存储过程?

Blu*_*lue 2 postgresql trigger stored-procedures

我想在 Postgresql 中使用触发器调用存储过程。是否可以?

这是一个例子:

create table foo(n int primary key, n1 int);     

create or replace procedure set_column_value(value int)
language plpgsql
:as $$
begin
 update foo
 set n1 = id
commit;
end;$$
Run Code Online (Sandbox Code Playgroud)

触发器类似于:在 foo 上插入或更新后,调用存储过程 set_column_value(new.n)

Lau*_*lbe 5

不,触发器需要调用触发器函数。但是没有什么可以阻止您编写CALL您喜欢的过程的 PL/pgSQL 触发器函数。

允许这种语法可能会令人困惑CREATE TRIGGER

CREATE TRIGGER ... EXECUTE { PROCEDURE | FUNCTION } ...
Run Code Online (Sandbox Code Playgroud)

然而,这是 PostgreSQL 拥有过程之前的语法遗留物。当时,唯一允许的语法是EXECUTE PROCEDURE,尽管它调用了触发器函数EXECUTE FUNCTION随着过程的出现,这变得相当奇怪,因此引入了新的且现在首选的语法,但EXECUTE PROCEDURE出于兼容性原因仍然允许使用。不过,您只能调用函数,而不能调用过程。

  • 但是,您将无法在此类 CALL 中调用 COMMIT; (2认同)