Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
具有给定角色的PostgreSQL触发器_Postgresql_Roles_Plpython - Fatal编程技术网

具有给定角色的PostgreSQL触发器

具有给定角色的PostgreSQL触发器,postgresql,roles,plpython,Postgresql,Roles,Plpython,我用Plpython制作了一个小的PostgreSQL触发器。这会触发文件系统,创建和删除我的一些文件。创建的文件归“postgres”unix用户所有,但我希望它们归另一个用户所有,比如foobar。触发器与用户“foobar”一起安装,也与用户“foobar”一起执行 有没有办法用PostgreSQL或Plpython对unix用户“foobar”执行SQL触发器? 我应该使用设置角色foobar 玩安全调用程序和安全定义程序似乎不够好。用户在Postgres中扮演的“角色”是数据库的本地角

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

有没有办法用PostgreSQL或Plpython对unix用户“foobar”执行SQL触发器? 我应该使用
设置角色foobar


安全调用程序
安全定义程序
似乎不够好。

用户在Postgres中扮演的“角色”是数据库的本地角色。您在数据库中的角色强制数据库权限。所以,可以说foobar可以运行这个存储过程,或者选择这个表,Postgres将强制执行。如果使用安全调用程序创建过程,则意味着正在运行的过程将使用当前登录的Postgres用户运行。安全定义器意味着该过程将使用创建该过程的角色运行。无论哪种方式,如果您的过程在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

用户在Postgres中承担的“角色”是数据库的本地角色。您在数据库中的角色强制数据库权限。所以,可以说foobar可以运行这个存储过程,或者选择这个表,Postgres将强制执行。如果使用安全调用程序创建过程,则意味着正在运行的过程将使用当前登录的Postgres用户运行。安全定义器意味着该过程将使用创建该过程的角色运行。无论哪种方式,如果您的过程在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用户,这应该可以工作


-你把操作系统用户和PostgreSQL用户弄糊涂了

SECURITY DEFINER
允许您作为定义postgresql的用户运行函数。但是,无论哪个PostgreSQL用户运行的是操作系统用户,后端服务器的运行总是一样的——通常是操作系统用户
postgres

按照设计,PostgreSQL server不能像其他操作系统用户那样运行操作系统命令或系统调用。那将是一个严重的安全漏洞

然而,如果你想允许的话,你可以。你可以:

  • 授予
    postgres
    用户
    sudo
    与其他用户一样运行部分或全部命令的权限;或
  • 编写一个程序,使用
    setuid
    权限运行,以执行所需操作,并授予
    postgres
    用户执行该程序的权限
在这两种情况下,运行这些程序的唯一方法是从不受信任的过程语言(如plpython或plperl)或C扩展启动它们。”


现在还不清楚为什么要这样设置文件所有权,但我怀疑这可能不是一个好主意。如果PostgreSQL客户机和服务器不在同一台计算机上怎么办?如果该PostgreSQL用户没有操作系统用户,或者用户名不同,该怎么办?等等。

你把操作系统用户和PostgreSQL用户弄糊涂了

SECURITY DEFINER
允许您作为定义postgresql的用户运行函数。但是,无论哪个PostgreSQL用户运行的是操作系统用户,后端服务器的运行总是一样的——通常是操作系统用户
postgres

按照设计,PostgreSQL server不能像其他操作系统用户那样运行操作系统命令或系统调用。那将是一个严重的安全漏洞

然而,如果你想允许的话,你可以。你可以:

  • 授予
    postgres
    用户
    sudo
    与其他用户一样运行部分或全部命令的权限;或
  • 编写一个程序,使用
    setuid
    权限运行,以执行所需操作,并授予
    postgres
    用户执行该程序的权限
在这两种情况下,运行这些程序的唯一方法是从不受信任的过程语言(如plpython或plperl)或C扩展启动它们。”

现在还不清楚为什么要这样设置文件所有权,但我怀疑这可能不是一个好主意。如果PostgreSQL客户机和服务器不在同一台计算机上怎么办?如果该PostgreSQL用户没有操作系统用户,或者用户名不同,该怎么办?等等