你如何在 postgresql 9.4 上撤销用户的创建表?

rch*_*rch 6 postgresql permissions postgresql-9.4

我正在尝试创建一个 postgresql 用户,该用户可以选择但不能在数据库上创建或删除、插入等,但我终生无法弄清楚如何阻止用户创建自己的表。

到目前为止我所做的:

create database test;
create role readonly;
alter role readonly with login;
alter role readonly with encrypted password 'test';
revoke all on schema public from public;
revoke all on schema public from readonly;
revoke all on database test from public;
revoke all on database test from readonly;
grant connect on database test to readonly;
Run Code Online (Sandbox Code Playgroud)

然而,当我以只读身份登录到数据库时,我仍然可以不受惩罚地创建表。我错过了什么?

dez*_*zso 6

根据文档,在模式中创建表所需的内容是CREATE在该模式上。您认为您撤销了此操作,但根据您的经验,这并没有真正发生 - 唯一合理的解释是Daniel 的评论:您正在撤销对另一个数据库模式的访问权限。

当您清除它时,您仍然需要授予/撤销以下内容:

  • GRANT USAGE ON SCHEMA public TO readonly; 能够访问那里的对象
  • REVOKE ALL ON ALL TABLES IN SCHEMA public FROM public, readonly;
  • GRANT SELECT ON ALL TABLES IN SCHEMA public TO readonly;
  • 并且,如果您打算稍后添加新对象(表),您也必须设置默认权限。


Hen*_*sev 5

根据文档,您需要执行以下查询:

REVOKE CREATE ON SCHEMA public FROM PUBLIC;

它从所有用户(所有者和超级用户除外)撤销对架构public 的CREATE 权限,因此您必须将其明确授予需要此权限的用户。

  • 我最近在 PostgreSQL 10.5 上遇到了类似的问题,现有的答案在 PostgreSQL 9.4 和更新版本上都不适合我。这就是为什么我决定发布我自己的答案。 (2认同)