16

我看到这两个错误并列,鉴于谷歌搜索结果的缺乏,不得不问。有什么区别,我需要在这里做什么?

deploy=# GRANT SELECT ON angel_research_production TO angel_research;
ERROR:  relation "angel_research_production" does not exist
deploy=# create database angel_research_production;
ERROR:  database "angel_research_production" already exists

我的猜测是我需要从其他一些用户那里做这个授权选择业务......

所以我在 postgres (dbroot) 上运行它并得到这个:

postgres=# GRANT SELECT ON angel_research_production TO angel_research;
ERROR:  relation "angel_research_production" does not exist

所以它确实作为数据库存在,但不是作为关系存在。我该如何纠正这个问题以及这里的潜在问题是什么?我有点不知所措。谢谢

4

2 回答 2

29

我的猜测是,您真的想递归地获得数据库中每个关系(表和视图)GRANT的权限。正确的?SELECTangel_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对数据库的权限CREATECONNECTTEMPORARY。数据库没有SELECT权限。

关系?架构?嗯?

Pg中有四个层次的组织:

  • 集群- 由 postmaster 控制,接受给定 IP/端口组合上的连接,包含一个或多个数据库,包括内置的template0template1数据库postgres。由postgresql.conf和控制pg_hba.conf。您的数据库集群通常由安装程序或软件包为您创建。不要与 cluster 作为计算集群的正常含义或一般英语语言含义相混淆。

  • 数据库——包含一个或多个模式模式。连接到 Pg 时,您连接到特定的数据库。

  • Schema - 包含对象,包括关系。如果您未另行指定,则用户创建的任何内容都会进入public架构。查询可以显式引用多个模式中的对象,也可以通过search_path隐式引用。

  • 对象- 某种 PostgreSQL 特有的,存在于模式中的任何东西(包括关系)。

    • 关系 - 外观和行为类似于表格的事物,例如视图表格

    • 其他对象也驻留在模式中,如函数、强制转换、索引、序列、运算符、聚合等。

于 2012-09-02T01:21:08.797 回答
10

关系是一个表(或者看起来像一个的东西,例如一个视图),也就是说,它是行的集合,所有行都具有相同的字段,并给出了一些名称来引用它们。

数据库是关系和其他实体(如触发器、函数和规则)的集合,它们以某种逻辑分组形式保存在一起。

于 2012-09-02T01:07:38.063 回答