在postgresql中,“数据库”和“关系”有什么区别? (’错误关系x不存在’,’错误数据库x已存在’)
我看到这两个错误的并置,并且鉴于Google搜索结果的缺乏,我不得不问。 有什么区别,我需要在这做什么?
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
因此它确实作为数据库存在,但不作为关系存在。 我怎么能纠正这个问题,这里有什么根本问题? 我有点不知所措。 谢谢
我的猜测是你真的希望递归地将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
条款中的ALL TABLES IN SCHEMA
。 用法:
GRANT SELECT ON ALL TABLES IN SCHEMA public TO angel_research;
如果所有用户定义的对象都在public
模式中 (见下文)那就可以了。
在先前版本中没有这样的function,但是用户定义的function作为变通方法存在 。
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 ]
这表明您可以授予数据库的权限是CREATE
, CONNECT
和TEMPORARY
。 数据库上没有SELECT
权限。
关系? 架构? 咦?
Pg中有四个组织级别:
-
集群 – 由postmaster控制,接受给定IP /端口组合的连接,包含一个或多个数据库,包括内置的
template0
,template1
和postgres
数据库。 由postgresql.conf
和pg_hba.conf
。 您的数据库群集通常由安装程序或程序包为您创建。 不要将集群作为计算集群或一般英语语义的正常含义混淆。 -
数据库 – 包含一个或多个模式或模式 。 连接到Pg时连接到特定数据库。
-
模式 – 包含包含关系的 对象 。 如果未另行指定,则用户创建的任何内容都将进入
public
模式。 查询可以显式地引用多个模式中的对象,或者通过search_path隐式引用。 -
对象 – 特定于PostgreSQL,模式中存在的任何东西(包括关系)。
-
关系 – 外观和行为类似于表格的东西,如视图和表格
-
其他对象也驻留在模式中,如函数,强制转换,索引,序列,运算符,聚合等。
-
关系是一个表(或看起来像一个的东西,例如一个视图),也就是说,它是一个行的集合,都具有相同的字段,并给出一些名称来引用它们。
数据库是在某些逻辑分组中保持在一起的关系和其他实体(如触发器,函数和规则)的集合。