Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.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 在所有1000个postgres数据库和架构上创建只读用户_Postgresql_Grant - Fatal编程技术网

Postgresql 在所有1000个postgres数据库和架构上创建只读用户

Postgresql 在所有1000个postgres数据库和架构上创建只读用户,postgresql,grant,Postgresql,Grant,使用,我正在尝试在Postgres 11.8实例中创建一个按需临时只读用户 我将: 1000多个数据库,每个客户(又名租户)一个 每个数据库都有一个公共和报告模式。 因此,我试图找到一种方法来授予此只读用户对每个数据库以及两种模式中的所有表的访问权限 当我想到以下片段时: -创建新用户 创建登录密码为“test123”的角色my readonly user; -授予对我们拥有的两个架构的访问权限 将公共模式的使用权授予我的只读用户; 向我的只读用户授予模式报告的使用权; -授予对两个架构中所有表

使用,我正在尝试在Postgres 11.8实例中创建一个按需临时只读用户

我将:

1000多个数据库,每个客户(又名租户)一个 每个数据库都有一个公共和报告模式。 因此,我试图找到一种方法来授予此只读用户对每个数据库以及两种模式中的所有表的访问权限

当我想到以下片段时:

-创建新用户 创建登录密码为“test123”的角色my readonly user; -授予对我们拥有的两个架构的访问权限 将公共模式的使用权授予我的只读用户; 向我的只读用户授予模式报告的使用权; -授予对两个架构中所有表的访问权限 将SCHEMA public中所有表上的SELECT授予我的只读用户; 向我的只读用户授予模式报告中所有表上的SELECT; -允许访问序列 向我的只读用户授予使用权,在模式中的所有序列上选择public; 授予使用权,选择向我的只读用户报告的模式中的所有序列; -授予对未来表的访问权限 更改模式公共中的默认权限将SELECT表授予我的只读用户; 更改模式报告中的默认权限将SELECT表授予我的只读用户; 它只适用于当前数据库中的一个数据库。如果使用只读用户登录并切换到某些数据库,则除了第一个数据库中,我看不到任何表

集群包含许多数据库,这些数据库包含许多模式。模式偶数 在不同的数据库中使用相同的名称是不相关的。授予 模式的权限仅适用于中的此特定模式 当前数据库授予时的当前数据库。

由于这个限制,上面的grant代码片段似乎变得更加复杂。我是否应该以某种方式迭代所有数据库并运行代码段?如何切换数据库?甚至可以按照的要求在普通SQL中实现吗?以前有人这样做过吗

注意:在MySQL中执行相同操作只需要2行代码,使用通配符**,这在Postgres afaik中不受支持:

创建由“{password}”标识的用户“{name}@”10.0.0.0/255.0.0.0”; 将SELECT、SHOW DATABASES、SHOW VIEW ON*.*授予“{name}@”10.0.0.0/255.0.0.0”;
SQL语句不能影响与所连接数据库不同的数据库中的对象,这是一个经过深思熟虑的设计决策

是的,您必须遍历集群中的所有数据库并在那里运行脚本

请注意,脚本中有一个错误:您不应该授予序列上的只读用户使用权限,否则他们可以修改序列值。选择是好的


我要做的是使用NOLOGIN创建一个只读组,并将所有这些权限授予该角色。然后,当请求只读用户时,创建一个用户并将其添加到该组中,以便该用户继承组权限。不要向用户本身授予任何权限,以便在不再需要时可以轻松地将其删除。

如果要仅使用Postgres脚本向用户授予只读访问权限,可以执行以下操作:

如果dblink不存在,则创建扩展; 做 $$ 宣布nome_banco文本; 声明模板_conexao文本; 声明字符串_conexao文本; 声明nome_usuario文本; 开始 模板_conexao='user=foo password=bar dbname='; nome_usuario=‘baz’; 为法国诺姆银行 从pg_数据库中选择datname 其中datistemplate=false 环 string_conexao=模板_conexao | | nome_banco; 执行dblink_execstring_conexao,'GRANT CONNECT ON DATABASE'| | nome| u banco | |'到'| | nome|u usuario; 执行dblink_execstring_conexao,'将SCHEMA public中所有表上的SELECT授予'| | nome_usuario; 端环; 终止 $$ -如果存在dblink,则删除扩展名; 它连接到每个数据库,并执行脚本;它可以很容易地适用于需要在所有数据库上执行数据库本地命令的其他情况


请记住,出于安全目的,在执行上述脚本后,您应该删除由上述脚本创建的dblink扩展,当然,除非您已经将该扩展用于其他目的。

谢谢Laurenz!非常有用。我们使用Flyway并构建了一个python包装器,它迭代每个数据库,并将Flyway迁移应用于它们。我们创建了一个迁移,为当前连接的数据库上的两个模式提供只读和读写角色,并将该迁移应用于所有数据库。然后在Hashicorp Vault中,我们只需创建一个用户角色,并将只读或读写角色授予该临时用户。几个小时后,用户被删除。