在postgresql中,"数据库"和"关系"有什么区别?('错误关系x不存在','错误数据库x已存在')

bou*_*uby 13 sql postgresql ruby-on-rails relation

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

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
Run Code Online (Sandbox Code Playgroud)

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

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

postgres=# GRANT SELECT ON angel_research_production TO angel_research;
ERROR:  relation "angel_research_production" does not exist
Run Code Online (Sandbox Code Playgroud)

因此它确实作为数据库存在,但不作为关系存在.我怎么能纠正这个问题,这里有什么根本问题?我有点不知所措.谢谢

Cra*_*ger 24

我的猜测是你真的想要递归地获得数据库中每个关系(表和视图)GRANTSELECT权利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 ]
Run Code Online (Sandbox Code Playgroud)

来自GRANT手册.请注意该ALL TABLES IN SCHEMA条款.用法:

GRANT SELECT ON ALL TABLES IN SCHEMA public TO angel_research;
Run Code Online (Sandbox Code Playgroud)

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

在先前版本中没有这样的功能,但是用户定义的功能作为变通方法存在.

Pg 9.0还具有ALTER DEFAULT PRIVILEGES,它更改分配给新创建的对象的默认权限.它不会影响现有对象.

错误消息是什么意思?

正如TokenMacGuy所指出的,关系是表或视图,而不是数据库.

GRANT SELECT ON angel_research_production TO angel_research;
Run Code Online (Sandbox Code Playgroud)

可以被认为是:

GRANT SELECT ON TABLE angel_research_production TO angel_research
                ^^^^^
Run Code Online (Sandbox Code Playgroud)

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

GRANT手册psql \h GRANT输出中你会看到:

GRANT { { CREATE | CONNECT | TEMPORARY | TEMP } [, ...] | ALL [ PRIVILEGES ] }
    ON DATABASE database_name [, ...]
    TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ]
Run Code Online (Sandbox Code Playgroud)

这表明您可以GRANT对数据库的权限是CREATE,CONNECTTEMPORARY.SELECT数据库没有权利.

关系?架构?咦?

Pg中有四个组织级别:

  • 集群 -由邮政局长控制,接受一个给定的IP /端口组合连接,包含一个或多个数据库,包括内置template0,template1postgres数据库.由postgresql.conf和控制pg_hba.conf.您的数据库群集通常由安装程序或程序包为您创建.不要将集群作为计算集群或一般英语语义的正常含义混淆.

  • 数据库 - 包含一个或多个模式模式.连接到Pg时连接到特定数据库.

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

  • 对象 - 某些PostgreSQL特定的,模式中存在的任何东西(包括关系).

    • 关系 - 外观和行为类似于表格的东西,如视图表格

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


Sin*_*ion 10

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

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

  • +1注意,这也是正常的关系数据库命名法; 这些术语并不特定于PostgreSQL. (3认同)
  • 还有一个中间层,一个架构.实际上,数据库是schemata的集合,schema是关系(表+视图)和PostgreSQL中的集合 - 其他对象,如用户定义的函数,强制转换的定义,运算符,聚合等等.在Pg中,` public` schema包含未明确放置在其他地方的所有用户对象,`pg_catalog`模式包含所有系统对象,还有`information_schema`模式和其他一些`pg_`系统模式. (3认同)