【问题标题】:In postgresql, what's the difference a "database" and a "relation"? ('error relation x does not exist', 'error database x already exists')在 postgresql 中,“数据库”和“关系”有什么区别? ('错误关系 x 不存在', '错误数据库 x 已存在')
【发布时间】:2012-08-27 07:01:12
【问题描述】:

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

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

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

【问题讨论】:

  • 我认为它需要一个表或模式,而不是数据库..
  • Google 搜索结果的“死亡”是怎么回事?很想知道...
  • 死亡,不是死亡。缺乏意味着“缺乏”

标签: sql ruby-on-rails postgresql relation


【解决方案1】:

我的猜测是你真的想递归地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 ]

来自manual for GRANT。注意ALL TABLES IN SCHEMA 子句。用法:

GRANT SELECT ON ALL TABLES IN SCHEMA public TO angel_research;

如果您所有的用户定义对象都在 public schema(见下文)中,那就可以了。

在之前的版本中没有这样的功能,但是user defined functions exist as workarounds

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
                ^^^^^

并且该表(关系)不存在,因此您会收到上面报告的错误。

manual for GRANTpsql \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 中有四个层次的组织:

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

  • Database - 包含一个或多个架构架构。连接到 Pg 时连接到特定的数据库。

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

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

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

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

【讨论】:

  • @putin2012 通过互联网学习通常是最好的方法,你只需要好好挑选你的资源。我强烈建议你从头到尾阅读 PostgreSQL 文档,它会教你很多关于 SQL 和数据库的一般知识。
  • 最后一节 -- ????
【解决方案2】:

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

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

【讨论】:

  • +1 请注意,这也是正常的关系数据库命名法;这些术语并非特定于 PostgreSQL。
  • 还有一个中间层,一个模式。实际上,数据库是模式的集合,模式是关系(表+视图)的集合,并且 - 在 PostgreSQL 中 - 其他对象,如用户定义的函数、强制转换的定义、运算符、聚合等。在 Pg 中,@ 987654321@ 架构包含所有未明确放置在其他位置的用户对象,pg_catalog 架构包含所有系统对象,还有information_schema 架构和其他一些pg_ 系统架构。
  • 多年后回首,这是对我问题的概念性答案,而另一个是技术性答案。谢谢
猜你喜欢
  • 2013-07-11
  • 1970-01-01
  • 2015-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-23
相关资源
最近更新 更多