在PostgreSQL中,“数据库”和“关系”有什么区别?('错误:关系x不存在','错误:数据库x已经存在')

19

我看到这两个错误并排出现,考虑到谷歌搜索结果的匮乏,不得不问一下。它们之间有什么区别,我需要在这里做些什么?

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
所以它确实存在作为一个数据库,但不作为关系。我该如何纠正这个问题,这里有什么根本性的问题?我有点不知所措。谢谢

我认为它期望的是一个表或者模式,而不是一个数据库。 - Mike Christensen
谷歌搜索结果“死亡”是怎么回事?很好奇想知道... - JWL
3
缺乏,不是死亡。Dearth 意味着“缺乏”。 - boulder_ruby
2个回答

32

我猜您想要递归地向数据库angel_research_production中的每个关系(表和视图)授予SELECT权限。是这样吗?

如何在数据库中为所有表授予权限

如果是这样,在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手册。注意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 ]

这表明你可以授予数据库的权限是CREATECONNECTTEMPORARY,但没有SELECT权限。

关系?模式?嗯?

Pg中有四个组织层次:

  • Cluster - 由管理员控制,接受给定IP/端口组合的连接,包含一个或多个数据库,包括内置的template0template1postgres数据库。由postgresql.confpg_hba.conf控制。通常情况下,安装程序或软件包会为您创建DB集群。不要与compute cluster或一般的english language meaning意义上的“集群”混淆。

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

  • Schema - 包含对象,包括关系。如果没有指定其他内容,则所有用户创建的内容都存储在public模式中。查询可以显式地引用多个模式中的对象,也可以通过search_path隐式地引用。

  • Objects - 某种程度上是PostgreSQL特有的,任何存在于模式中的东西(包括关系)。

    • 关系 - 看起来和表格类似的东西,比如viewstables

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


@putin2012 通过互联网学习通常是最好的方式,你只需要选择好你的资源。我强烈建议你全面阅读PostgreSQL文档,它会教你很多关于SQL和数据库的知识。 - Craig Ringer
1
请仅返回翻译后的文本:最后一节 - - Jeremy

10

关系是一个表格(或类似表格的东西,比如视图),也就是说,它是由一些拥有相同字段的行组成的集合,并被赋予某个名称来引用它们。

数据库是一个包含关系和其他实体(如触发器、函数和规则)的集合,在某种逻辑分组中保持在一起。


3
请注意,这也是常规关系型数据库命名惯例;这些术语并不特定于PostgreSQL。 - Adam Robinson
3
还有一个中间层级,即架构。实际上,数据库是架构的集合,而架构则是关系(表+视图)和在PostgreSQL中的其他对象的集合,例如用户定义的函数、强制转换、运算符、聚合等。在Pg中,“public”架构包含所有未明确放置在其他位置的用户对象,“pg_catalog”架构包含所有系统对象,还有“information_schema”架构和一些其他“pg_”系统架构。 - Craig Ringer
1
多年后回顾,这是我问题的概念答案,而另一个则是技术答案。谢谢。 - boulder_ruby

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接