将用户限制在 PostgreSQL 中的一个模式?

Restrict user to one schema in PostgreSQL?

是否可以在 PostgreSQL 中创建只能访问单个模式的用户?

这是我尝试过的:

REVOKE ALL ON DATABASE testdb FROM public;
GRANT CONNECT ON DATABASE testdb TO testuser;

当我以 testuser 身份连接时,我确实无法访问实际数据:

> SELECT * FROM some_table;
ERROR:  permission denied for relation some_table

但是,我仍然可以列出所有其他模式中的所有表等:

SELECT * FROM pg_tables;
     schemaname     |                 tablename                 | tableowner | tablespace | hasindexes | hasrules | hastriggers | rowsecurity
--------------------+-------------------------------------------+------------+------------+------------+----------+-------------+-------------
 test2              | foo                                       | postgres   |            | t          | f        | f           | f
 test2              | bar                                       | postgres   |            | t          | f        | f           | f
...

不可能将 PostgreSQL 配置为用户只能看到他或她有权访问的系统目录中的那些对象。

如果您需要这样的设置,您应该为每个用户创建一个数据库。

我可以这样做:

GRANT USAGE ON SCHEMA schema_name TO user_name;
ALTER USER user_name SET search_path = schema_name;

像这样的 ALTER USER 语句是一种永久设置模式搜索路径的方法,就像您使用

设置单个会话的模式搜索路径一样
SET SEARCH_PATH= schema_name_1, schema_name_2;