我看到了这两个错误的并列,鉴于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
因此它确实以数据库的形式存在,但不以关系的形式存在。我该如何纠正这个问题?潜在的问题是什么?我有点不知所措。谢谢
我的猜测是您真的想递归访问数据库中每个关系(表和视图)GRANT的SELECT权限angel_research_production。正确的?
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 ]
来自GRANT的手册。请注意该ALL TABLES IN SCHEMA条款。用法:
ALL TABLES IN SCHEMA
GRANT SELECT ON ALL TABLES IN SCHEMA public TO angel_research;
如果所有用户定义的对象都在public 架构中(请参见下文),则可以解决问题。
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输出中,您将看到:
psql
\h GRANT
GRANT { { CREATE | CONNECT | TEMPORARY | TEMP } [, ...] | ALL [ PRIVILEGES ] } ON DATABASE database_name [, ...] TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ]
这表明,你可以将权限GRANT到数据库中CREATE,CONNECT和TEMPORARY。SELECT数据库上没有权限。
CREATE
CONNECT
TEMPORARY
Pg有四个组织级别:
集群-由邮政局长控制,接受一个给定的IP /端口组合连接,包含一个或多个 数据库 ,包括内置template0,template1和postgres数据库。由postgresql.conf和控制pg_hba.conf。数据库集群通常是由安装程序或软件包为您创建的。不要与作为计算群集的群集的正常含义或通用的英语含义混淆。
template0
template1
postgres
postgresql.conf
pg_hba.conf
数据库-包含一个或多个 图式 或 模式 。当您连接到Pg时,您将连接到特定的数据库。
模式-包含 对象( 包括 关系) 。如果没有另外指定,则用户创建的所有内容都将进入public架构。查询可以显式引用多个模式中的对象,也可以通过search_path隐式地引用对象。
对象-某种程度上特定于PostgreSQL,模式中存在的任何内容(包括关系)。
关系-外观和行为类似于表,视图和表的事物
其他对象也驻留在模式中,例如函数,强制类型转换,索引,序列,运算符,集合等。