只读用户能否创建表格?

4
我在PostgreSQL中创建了一个只读用户,但它仍能创建表格:
我创建了一个测试数据库,然后创建了一个名为readonly2的用户,并仅赋予其对两个表格的选择权限。当我以readonly2用户身份登录该数据库时,仍能创建表格。
create database test1
create user readonly2 with password 'readonly';
grant select on test1 to readonly2
grant select on test2 to readonly2

test1test2是test数据库中的两个表。

现在,当我使用只读用户readonly2登录测试用的数据库时,我可以创建表:

test=> create table test55 (id int);
CREATE TABLE

我只想创建一个只读用户,赋予查询权限。我不想授予创建表格的权限。


https://dev59.com/fXRA5IYBdhLWcg3w_C8w - Mihai
1个回答

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

CREATE

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

要创建表的默认模式是当前 search_path 的第一个模式。
搜索路径中的第一个模式通常是与用户同名的模式或模式public
而且public 模式带有默认特权:

也可以允许用户在别人的模式中创建对象。 要允许这样做,需要授予模式上的CREATE权限。 请注意,默认情况下,每个人都拥有对模式public的CREATEUSAGE权限

我强调了粗体字。
你可以更改它:
REVOKE CREATE ON SCHEMA public FROM PUBLIC;

请确保首先考虑后果...

(或者该角色是超级用户。)


2
我做了同样的事情... 撤销了用户的创建权限,即 revoke create on schema public from readonly2,重启了数据库引擎,然而即使这样,我仍然能够在测试数据库中创建表格。 - WinSupp
4
“但这并不是一样的。从readonly2撤销权限并不能改变每个用户都可以在public架构中创建表的事实,直到您从public角色中撤销权限为止…” - Erwin Brandstetter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接