我想授予用户对数据库的所有权限,但不使其成为管理员。我想这样做的原因是,目前DEV和PROD是同一集群上的不同数据库,因此我不希望用户能够更改生产对象,但必须能够更改DEV上的对象。
我试过:
grant ALL on database MY_DB to group MY_GROUP;
但它似乎没有给予任何许可。
然后我试着:
grant all privileges on schema MY_SCHEMA to group MY_GROUP;
它似乎允许我创建对象,但不允许我查询/删除属于其他用户的该模式中的对象
我可以继续在MY_SCHEMA上为用户授予USAGE权限,但它会抱怨没有表上的权限...
所以我想我的问题是:有什么简单的方法可以将数据库上的所有权限授予用户吗?
我正在使用PostgreSQL 8.1.23.
8条答案
按热度按时间c90pui9n1#
角色是数据库 * 集群 * 的对象。同一集群的所有数据库共享一组已定义的角色。权限是按数据库/方案/表等授予/撤消的。
很明显,一个角色需要访问 * 数据库 *,默认情况下,这是
PUBLIC
的权限。Postgres 14或更高版本的基本权限
Postgres 14添加了预定义的非登录角色
pg_read_all_data
/pg_write_all_data
。他们对 * 所有 * 表、视图和序列具有
SELECT
/INSERT
、UPDATE
、DELETE
权限。另外对方案具有USAGE
权限。我们可以在这些角色中获得GRANT
成员资格:这涵盖了所有基本DML命令(但不包括DDL,也不包括一些特殊命令,如
TRUNCATE
或EXECUTE
函数特权!)。The manual:x1米11米1x
读取所有数据(表、视图、序列),就像对这些对象具有
SELECT
权限,对所有方案具有USAGE
权限一样,即使没有显式地具有该权限。此角色没有设置角色属性BYPASSRLS
。如果正在使用RLS,管理员可能希望对该角色所具有的GRANT
属性设置BYPASSRLS
。pg_write_all_data
写入所有数据(表、视图、序列),就像对这些对象具有
INSERT
、UPDATE
和DELETE
权限,对所有方案具有USAGE
权限一样,即使没有显式地具有该权限。此角色没有设置角色属性BYPASSRLS
。如果正在使用RLS,管理员可能希望在角色上设置X1 M23 N1 X,该角色被X1 M24 N1 X艾德给该角色。不使用预定义角色的所有权限(任何Postgres版本)
该角色需要(至少)对 schema 的
USAGE
权限。同样,如果该权限被授予PUBLIC
,您就可以使用该权限。或在 * 所有 * 自定义架构上授予
USAGE
:然后,所有 * 表 * 的所有权限(需要Postgres9.0或更高版本)。
不要忘记 * 序列 *(如果有):
或者,您可以使用"Grant Wizard" of pgAdmin 4来处理GUI。
这包括现有对象的权限。要同时包括将来的对象,请设置
DEFAULT PRIVILEGES
。请参阅:还有一些其他的对象,the manual for
GRANT
有完整的列表。对数据库对象(表、列、视图、外表、序列、数据库、外部数据 Package 、外部服务器、函数、过程、过程语言、方案或表空间)的权限
但其余部分很少需要。更多详细信息:
以upgrading to a current version为例。
pinkon5k2#
vm0i2vca3#
在PostgreSQL 9.0+中,您将执行以下操作:
如果您也想为新创建的关系启用此功能,请设置默认权限:
但是,鉴于您使用的是8.1,您必须自己编写代码:
这将设置所有关系的权限:表、视图、索引、序列等等。如果你想限制它,过滤
pg_class.relkind
。查看pg_class docs了解细节。你应该以超级用户的身份运行这个函数,并根据应用程序的需要定期运行,一个选项是将它打包成一个cron作业,每天或每小时执行一次。
2w3kk1z54#
我执行了以下操作,在PostgreSQL 9.4.15数据库上添加了一个角色'eSumit',并为该角色提供了所有权限:
还通过以下方式检查了pg_table条目:
从pg_roles中选择 *;
数据库查询快照:
mm5n2pyu5#
在PostgreSQL 12和更高版本中,可以将数据库中表的所有权限授予角色/用户/帐户。
语法为:
如果要将其授予数据库中的所有表,则语法为:
如果要将其授予数据库中某个模式的所有表,则语法为:
就这样
"我希望这能帮上忙"
pinkon5k6#
将SCHEMA schema_name上的用法授予用户;
vojdkbi07#
vkc1a9a28#