创建PostgreSQL只读用户错误:关系_foo的权限被拒绝

时间:2014-09-03 17:32:03

标签: sql postgresql privileges ckan

尝试在PostgreSQL中创建只读用户时遇到问题。

我希望用户ckan_default在数据库datastore_default中创建表。 我希望readonlyuser在datastore_default中读取由ckan_default创建的表。 我希望此规则适用于将由ckan_default创建的表,而不仅仅是已创建的表。

GRANT CONNECT ON DATABASE datastore_default TO readonlyuser;
GRANT USAGE ON SCHEMA public TO readonlyuser;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO readonlyuser;
ALTER DEFAULT PRIVILEGES FOR USER readonlyuser IN SCHEMA public GRANT SELECT ON TABLES TO readonlyuser;

实际上我运行的完整脚本是

sudo -u postgres psql postgres -f /tmp/set_permissions.sql

--content of /tmp/set_permissions.sql
REVOKE CREATE ON SCHEMA public FROM PUBLIC;
REVOKE USAGE ON SCHEMA public FROM PUBLIC;
GRANT CREATE ON SCHEMA public TO ckan_default;
GRANT USAGE ON SCHEMA public TO ckan_default;
GRANT CREATE ON SCHEMA public TO ckan_default;
GRANT USAGE ON SCHEMA public TO ckan_default;
REVOKE CONNECT ON DATABASE ckan_default FROM readonlyuser;
GRANT CONNECT ON DATABASE datastore_default TO readonlyuser;
GRANT USAGE ON SCHEMA public TO readonlyuser;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO readonlyuser;
ALTER DEFAULT PRIVILEGES FOR USER ckan_default IN SCHEMA public
   GRANT SELECT ON TABLES TO readonlyuser;

我阅读了这篇文章How do you create a read-only user in PostgreSQL,我尝试了它,或者它不适用于将要创建的表格。

有关详细信息和完整脚本,请查看pastebin http://pastebin.com/psDifhwd

1 个答案:

答案 0 :(得分:0)

我怀疑所有用户的seach_path都设置为典型的默认值

"$user",public

这意味着没有架构资格的_foo会解析为$user._foo -
ckan_default._foockan_default readonlyuser._foo readonlyuser的{​​{1}}。

用以下方法重复测试:

sudo -u postgres psql -d datastore_default -U ckan_default -c 'CREATE TABLE public._foo()'
sudo -u postgres psql -d datastore_default -U ckan_default -c 'SELECT * FROM public._foo'
sudo -u postgres psql -d datastore_default -U readonlyuser -c 'SELECT * FROM public._foo'

如果是这种情况,请考虑更改每个用户的默认search_path

ALTER ROLE ckan_default SET search_path=public;
ALTER ROLE readonlyuser SET search_path=public;

或任何适合您的需求 另请考虑更改postgresql.conf中的默认设置。

更多相关答案: