我用 Plpython 做了一个小的 PostgreSQL 触发器。这会触发文件系统,创建和删除我的一些文件。创建的文件归“postgres”unix 用户所有,但我希望它们归另一个用户所有,比方说 foobar。触发器由用户“foobar”安装并由用户“foobar”执行。
有没有办法通过 PostgreSQL 或 Plpython 以 unix 用户 'foobar' 执行 SQL 触发器?
我应该使用 SET ROLE foobar
吗?
使用 SECURITY INVOKER
和 SECURITY DEFINER
似乎不够好。
最佳答案
您混淆了操作系统用户和 PostgreSQL 用户。
SECURITY DEFINER
允许您以定义 postgresql 用户的身份运行函数。但是,无论运行哪个 PostgreSQL 用户的操作系统用户,后端服务器始终以相同的方式运行 - 通常是操作系统用户 postgres
。
按照设计,PostgreSQL 服务器不能像其他操作系统用户一样运行操作系统命令或系统调用。那将是一个严重的安全漏洞。
但是,如果你想允许,你可以。你可以:
- 授予
postgres
用户sudo
权限以作为其他用户运行部分或全部命令;或 - 编写一个程序以
setuid
权限运行以执行您想要的操作,并授予postgres
用户执行它的权限。
无论哪种情况,运行这些程序的唯一方法是从不受信任的过程语言(如 plpython 或 plperl)或从 C 扩展启动它们。'
一开始并不清楚为什么要这样设置文件所有权,但我怀疑这可能不是一个好主意。如果 PostgreSQL 客户端和服务器甚至不在同一台计算机上怎么办?如果该 PostgreSQL 用户没有操作系统用户,或者用户名不同怎么办?等等
关于具有给定角色的 PostgreSQL 触发器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24951431/