我的猜测是,您真的想递归地获得数据库中每个关系(表和视图)GRANT
的权限。正确的?SELECT
angel_research_production
如何授予数据库中的所有表
如果是这样,在 PostgreSQL 9.0 及更高版本中,您有:
GRANT { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | TRIGGER }
[, ...] | ALL [ PRIVILEGES ] }
ON { [ TABLE ] table_name [, ...]
| ALL TABLES IN SCHEMA schema_name [, ...] }
TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ]
来自GRANT 的手册。注意ALL TABLES IN SCHEMA
子句。用法:
GRANT SELECT ON ALL TABLES IN SCHEMA public TO angel_research;
如果您的所有用户定义的对象都在public
模式中(见下文),那就可以了。
在以前的版本中没有这样的功能,但用户定义的功能作为解决方法存在。
Pg 9.0 还具有ALTER DEFAULT PRIVILEGES,它更改了分配给新创建对象的默认权限。它不会影响现有对象。
错误信息是什么意思?
正如 TokenMacGuy 所指出的,关系是表或视图,而不是数据库。
GRANT SELECT ON angel_research_production TO angel_research;
可以被认为是以下的简写:
GRANT SELECT ON TABLE angel_research_production TO angel_research
^^^^^
并且该表(关系)不存在,因此您收到上面报告的错误。
在GRANT 手册或psql
\h GRANT
输出中,您将看到:
GRANT { { CREATE | CONNECT | TEMPORARY | TEMP } [, ...] | ALL [ PRIVILEGES ] }
ON DATABASE database_name [, ...]
TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ]
这表明您可以GRANT
对数据库的权限CREATE
是CONNECT
和TEMPORARY
。数据库没有SELECT
权限。
关系?架构?嗯?
Pg中有四个层次的组织:
集群- 由 postmaster 控制,接受给定 IP/端口组合上的连接,包含一个或多个数据库,包括内置的template0
和template1
数据库postgres
。由postgresql.conf
和控制pg_hba.conf
。您的数据库集群通常由安装程序或软件包为您创建。不要与 cluster 作为计算集群的正常含义或一般英语语言含义相混淆。
数据库——包含一个或多个模式或模式。连接到 Pg 时,您连接到特定的数据库。
Schema - 包含对象,包括关系。如果您未另行指定,则用户创建的任何内容都会进入public
架构。查询可以显式引用多个模式中的对象,也可以通过search_path隐式引用。
对象- 某种 PostgreSQL 特有的,存在于模式中的任何东西(包括关系)。