我有一个PostgreSQL DB用户 "limited_user",我想只给一个表SELECT权限。
GRANT CONNECT ON DATABASE "db1" TO limited_user;
GRANT SELECT ON TABLE users to limited_user;
但当我尝试\dt时,该用户可以看到这个db1中的所有其他表,而他却可以对 "user "表进行SELECT操作,因为我给了他权限。我怎样才能撤销该用户的访问权限,使他不能看到其他表,而只能看到一个表?
你不能,至少在我所知道的任何直接的方式中不能。
表存在于模式命名空间中,而模式存在于数据库中。要给某一特定表的用户以访问权,意味着你还必须给该用户的 USAGE
表所属模式的权限。USAGE
不授予表本身的权限,只授予相关模式的权限。但是表 定义 是模式的一部分,所以 USAGE
确实允许用户看到表名(还有列名)。
但是,如果在同一模式中还有其他表,用户将无法看到 SELECT
从这些表格中,除非您还 GRANT SELECT
在这些表上,尽管他们将能够看到它们的存在。
这个答案 给了一个相当清晰的解释,权限系统。
编辑补充一下。实现类似结果的一种方法是这样的(使用 psql
):
sec_schema=# REVOKE ALL ON ALL TABLES IN SCHEMA sec_schema FROM restricted_user;
REVOKE
sec_schema=# REVOKE USAGE ON SCHEMA sec_schema FROM restricted_user;
REVOKE
sec_schema=# CREATE SCHEMA new_schema;
CREATE SCHEMA
sec_schema=# GRANT USAGE ON new_schema TO restricted_user;
GRANT
sec_schema=# CREATE VIEW new_schema.secret_view AS SELECT * from sec_schema.secret_table;
CREATE VIEW
sec_schema=# GRANT SELECT ON new_schema.secret_view TO restricted_user;
GRANT
这将删除对模式的所有访问 sec_schema
对于用户 restricted_user
但随后产生了 new_schema
和 new_schema.secret_view
这是一个覆盖在 sec_schema.secret_table
. 后。GRANT SELECT
用户将能够从表中读取数据。sec_schema.secret_table
通过视图,但他们将无法看到任何物体在 sec_schema
.