具有给定角色的 PostgreSQL 触发器

标签 postgresql roles plpython

我用 Plpython 做了一个小的 PostgreSQL 触发器。这会触发文件系统,创建和删除我的一些文件。创建的文件归“postgres”unix 用户所有,但我希望它们归另一个用户所有,比方说 foobar。触发器由用户“foobar”安装并由用户“foobar”执行。

有没有办法通过 PostgreSQL 或 Plpython 以 unix 用户 'foobar' 执行 SQL 触发器? 我应该使用 SET ROLE foobar 吗?

使用 SECURITY INVOKERSECURITY 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/

相关文章:

postgresql - 将圆存储在 Postgres 几何字段中

postgresql - now() 在作为参数传递给函数时如何得到评估

postgresql - plpython 获取 INSERT TRIGGER 上的所有行

python - postgres 和 python

c# - 在 asp.net mvc 5 中删除角色

python - PL/Python 与 Anaconda

json - 如何将 hylang s-表达式序列化为 PostgreSQL json/json-b?

postgresql - 带有 pg_total_relation_size 的 postgres 9.2 表大小

javascript - 创建解析角色层次结构失败并显示 'parent is undefined'

azure - 设置 Azure ACS 角色