PostgreSQL 存储过程可以调用外部程序吗?
Can a PostgreSQL stored procedure call an external program?
我正在查看有关编写存储过程的 PostgreSQL“Server Programming”文档。我想让存储过程调用现有的外部 shell 脚本来执行任务,然后 return 结果。
我没有在文档中找到这个。支持吗?
是的,它可以,但不是每个 SP 都能做到。 PL/pgSQL 等受信任语言的存储过程无法做到这一点。 Please refer to this 选择不受信任的语言。
"untrusted" 像 PL/perlu 或 PL/Pythonu 这样的 PL 可以,C 用户定义函数也可以。
虽然这通常不是一个好主意。如果调用外部程序然后回滚事务,外部程序将不知道回滚。您正在突破事务管理。
通常最好使用 NOTIFY
将工作发送到已连接的守护程序并 LISTEN
处理事件。
这是我在 Ubuntu 上的做法。请注意,安装 PostgreSQL 时默认情况下不会安装 plperl。
> sudo apt-get install postgresql-plperl
> sudo --user=postgres psql my_database
# CREATE EXTENSION IF NOT EXISTS plperlu;
# CREATE OR REPLACE FUNCTION foo() RETURNS TEXT AS $$
return `/bin/echo -n "hello world!"`;
$$ LANGUAGE plperlu;
# select foo();
foo
-------------
hello world!
(1 row)
我正在查看有关编写存储过程的 PostgreSQL“Server Programming”文档。我想让存储过程调用现有的外部 shell 脚本来执行任务,然后 return 结果。
我没有在文档中找到这个。支持吗?
是的,它可以,但不是每个 SP 都能做到。 PL/pgSQL 等受信任语言的存储过程无法做到这一点。 Please refer to this 选择不受信任的语言。
"untrusted" 像 PL/perlu 或 PL/Pythonu 这样的 PL 可以,C 用户定义函数也可以。
虽然这通常不是一个好主意。如果调用外部程序然后回滚事务,外部程序将不知道回滚。您正在突破事务管理。
通常最好使用 NOTIFY
将工作发送到已连接的守护程序并 LISTEN
处理事件。
这是我在 Ubuntu 上的做法。请注意,安装 PostgreSQL 时默认情况下不会安装 plperl。
> sudo apt-get install postgresql-plperl
> sudo --user=postgres psql my_database
# CREATE EXTENSION IF NOT EXISTS plperlu;
# CREATE OR REPLACE FUNCTION foo() RETURNS TEXT AS $$
return `/bin/echo -n "hello world!"`;
$$ LANGUAGE plperlu;
# select foo();
foo
-------------
hello world!
(1 row)