我的要求是在触发器执行的时候执行一个系统命令比如(ls)或者C程序,有没有办法创建一个触发器函数来解决这个问题。
5vf7fwbs1#
您可以编写触发器函数Python、Perl或Tcl,并且如果您使用"untrusted"版本的语言,则这些函数中的任何一个都可以用于执行任意shell命令。shell将在与Postgres服务器进程相同的用户(通常为“postgres”)下运行,因此您需要相应地设置权限。例如,在运行CREATE EXTENSION plpythonu之后,您可以使用LANGUAGE plpythonu编写触发器函数,并通过调用os.system()等来运行命令。注意修改系统的任何命令,因为这些更改与数据库事务无关(因此您需要找到自己的方法来处理并发写入、事务回滚等)。
CREATE EXTENSION plpythonu
LANGUAGE plpythonu
os.system()
6tqwzwtp2#
下面是一个简单的例子,说明如何在Ubuntu上的PG15中实现这一点:
sudo apt-get install -y postgresql-plpython3-15 CREATE EXTENSION plpython3u CREATE OR REPLACE FUNCTION reboot_server(version text) RETURNS text AS $BODY$ import subprocess subprocess.call(f"/usr/lib/postgresql/{version}/bin/pg_ctl restart -D /var/lib/postgresql/{version}/main",shell=True) $BODY$ LANGUAGE plpython3u; select * from reboot_server('15')
在本例中,我将重新启动指定的postgres示例。
2条答案
按热度按时间5vf7fwbs1#
您可以编写触发器函数Python、Perl或Tcl,并且如果您使用"untrusted"版本的语言,则这些函数中的任何一个都可以用于执行任意shell命令。shell将在与Postgres服务器进程相同的用户(通常为“postgres”)下运行,因此您需要相应地设置权限。
例如,在运行
CREATE EXTENSION plpythonu
之后,您可以使用LANGUAGE plpythonu
编写触发器函数,并通过调用os.system()
等来运行命令。注意修改系统的任何命令,因为这些更改与数据库事务无关(因此您需要找到自己的方法来处理并发写入、事务回滚等)。
6tqwzwtp2#
下面是一个简单的例子,说明如何在Ubuntu上的PG15中实现这一点:
在本例中,我将重新启动指定的postgres示例。