postgres=# \l List of databases Name | Owner | Encoding | Collate | Ctype | Access privileges ---------------+--------------+-----------+-------------+-------------+------------------------------- postgres | postgres | sql_ASCII | C | C | project2_core | atm_project2 | UTF8 | de_DE.UTF-8 | de_DE.UTF-8 | project2=CTc/project2 template0 | postgres | sql_ASCII | C | C | =c/postgres + | | | | | postgres=CTc/postgres template1 | postgres | sql_ASCII | C | C | =c/postgres + | | | | | postgres=CTc/postgres (5 rows)
到现在为止还挺好.现在我创建一个用户:
postgres=# CREATE ROLE dietrich ENCRYPTED PASSWORD 'md5XXX' LOGIN NOCREATEROLE NOCREATEDB NOSUPERUSER
$psql -h localhost -p 5432 -U dietrich -W project2_core Password for user dietrich: psql: FATAL: permission denied for database "project2_core" DETAIL: User does not have CONNECT privilege.
这是我的预期.现在奇怪的东西开始了.我授予用户CONNECT:
postgres=# GRANT CONNECT ON DATABASE project2_core TO dietrich; GRANT postgres=# \l List of databases Name | Owner | Encoding | Collate | Ctype | Access privileges ---------------+--------------+-----------+-------------+-------------+------------------------------- postgres | postgres | sql_ASCII | C | C | project2_core | atm_project2 | UTF8 | de_DE.UTF-8 | de_DE.UTF-8 | project2=CTc/project2+ | | | | | dietrich=c/project2 template0 | postgres | sql_ASCII | C | C | =c/postgres + | | | | | postgres=CTc/postgres template1 | postgres | sql_ASCII | C | C | =c/postgres + | | | | | postgres=CTc/postgres (5 rows)
在没有任何进一步授权的情况下,允许用户创建表:
$psql -h localhost -p 5432 -U dietrich -W project2_core Password for user dietrich: psql (9.2.3) SSL connection (cipher: DHE-RSA-AES256-SHA,bits: 256) Type "help" for help. project2_core=> create table adsf (); CREATE TABLE project2_core=> \d List of relations Schema | Name | Type | Owner --------+------+-------+---------- public | adsf | table | dietrich (1 row)
在我明确地对模式进行GRANT USAGE然后在表上进行GRANT SELECT之前,我原本以为不允许用户做任何事情.
我的错误在哪里?我究竟做错了什么?我怎样才能实现我想要的(在明确授予她适当权利之前,不允许新用户做任何事情.
我迷路了,非常感谢你的帮助:)
编辑按照@ daniel-verite的建议,我现在在创建数据库后立即撤销所有操作.用户dietrich不允许再创建表.好.但是:现在,也不允许数据库的所有者project2创建表.即使在数据库上发布GRANT ALL PRIVILEGES project2_core TO project2并在SCHEMA public TO project2上发布GRANT ALL PRIVILEGES,我收到错误错误:没有选择要创建的模式,以及当我专门尝试创建表时public.WHATEVER();,我得到错误:架构公众的权限被拒绝.我究竟做错了什么?
REVOKE ALL ON schema public FROM public;
编辑:在上面的命令之后,只有超级用户可以在公共模式中创建新对象,这是不切实际的.假设应该为非超级用户foo_user授予此权限,则应该使用以下命令:
GRANT ALL ON schema public TO foo_user;
要知道ALL对于模式意味着什么,我们必须参考GRANT in the doc,(在PG 9.2中,有不少于14种形式的GRANT语句适用于不同的东西……).对于模式来说,它似乎意味着CREATE和USAGE.
另一方面,GRANT ALL PRIVILEGES ON DATABASE …将授予CONNECT和CREATE和TEMP,但在此上下文中的CREATE与模式有关,而不是永久表.
关于此错误:错误:没有选择要创建的模式,它在尝试创建没有模式限定的对象时发生(如在create table foo(…)中),同时缺少在任何模式中创建它的权限SEARCH_PATH.