您的用户在 Postgres 中承担的“角色”是数据库本地的。您在数据库中的角色强制执行数据库权限。所以,你可以说 foobar 可以运行这个存储过程,或者选择这个表,Postgres 会强制执行。如果您使用 SECURITY INVOKER 创建您的过程,这意味着正在运行的过程将使用当前登录的 Postgres 用户运行。SECURITY DEFINER 意味着该过程将使用创建该过程的角色运行。无论哪种方式,如果您的程序在 Postgres 之外执行任何操作(例如创建文件),它将作为启动 Postgres 的身份来完成(正如您所发现的那样)。就我而言,我有一个名为“postgres”的 Unix 用户,当我启动 Postgres 时,我以该用户身份进行操作。因此,创建的任何文件都将归“postgres”用户所有。
你没有告诉我们你的操作系统。Windows 将不同于 *nix。此答案适用于 *nix。
您确实提到您的存储过程语言是 plpython。因此,您可以创建该文件,然后在您的过程中创建它之后更改它的所有权。像:
import os
import pwd
f = open('/tmp/myfile','w')
f.write('hello')
f.close()
user_id = pwd.getpwnam("foobar").pw_uid
os.chown('/tmp/myfile', user_id, -1)
假设在运行 Postgres 的主机上有一个 foobar 用户,这应该可以工作。
-G