只读用户能够创建表

Win*_*upp 3 sql postgresql database-permissions

我在 PostgreSQL 中创建了一个只读用户,它仍然能够创建表:

我创建了一个测试数据库,然后创建了一个readonly2用户。只给它 2 个表的选择权限。当我以readonly2用户身份登录此数据库时,我仍然可以创建表:

create database test1
create user readonly2 with password 'readonly';
grant select on test1 to readonly2
grant select on test2 to readonly2
Run Code Online (Sandbox Code Playgroud)

其中test1test2是测试数据库中的 2 个表。

现在,当我以readonly2用户身份登录测试数据库时,我可以创建表:

test=> create table test55 (id int);
CREATE TABLE
Run Code Online (Sandbox Code Playgroud)

我只想创建一个具有选择权限的只读用户。我不想授予创建表权限。

Erw*_*ter 5

每个表都是在 Postgres 的模式中创建的。要创建表,角色必须具有schemaCREATE权限。根据文档:

创建

... 对于模式,允许在模式内创建新对象。

要在其中创建的表的默认架构是当前search_path.

search_path 中的第一个模式通常是与用户或模式同名的模式public

并且public架构带有默认权限:

还可以允许用户在其他人的模式中创建对象。为此,CREATE需要授予架构上的特权。请注意,在默认情况下,每个人都有CREATE,并USAGE在模式public特权

大胆强调我的。

你可以改变它:

REVOKE CREATE ON SCHEMA public FROM PUBLIC;
Run Code Online (Sandbox Code Playgroud)

一定要先考虑后果……

(要么,要么角色是超级用户。)

  • 我做了同样的事情..撤销了该用户的创建权限`revoke create on schema public from readonly2`重新启动了数据库引擎,即使这样我也能够在测试数据库中创建表 (2认同)
  • @ user3669651:但它*不*相同。从 `readonly2` 撤销权限不会改变这样一个事实,即*每个*用户都可以在 `public` 模式中创建表,直到你从角色 `public` 中撤销...... (2认同)