有没有办法可以撤消用户对目录对象(即information_schema)和PostgreSQL表(即pg_catalog)的权限?我已经尝试了几件事并且在网上搜寻。我没有运气。我读到的唯一有用的是我可能不想从系统表中删除“public”,以防用户定义的函数依赖于其中一个模式中的对象。下面的命令是我没有使用的一小部分快照,除了单个表。
REVOKE ALL PRIVILEGES ON SCHEMA pg_catalog FROM PUBLIC; -- didn't work
REVOKE ALL PRIVILEGES ON SCHEMA pg_catalog FROM public; -- didn't work
REVOKE ALL PRIVILEGES ON SCHEMA pg_catalog FROM user1; -- didn't work
REVOKE SELECT ON pg_catalog.pg_roles FROM user1; -- worked
REVOKE SELECT ON pg_catalog.pg_database FROM user1; -- didn't work
REVOKE ALL PRIVILEGES ON SCHEMA pg_catalog FROM g_users; -- didn't work
REVOKE SELECT ON pg_catalog.pg_database FROM g_users; -- didn't work
有什么想法吗?或者这是不可能的?感谢...
莱斯利
答案 0 :(得分:9)
让我帮你解决这个问题:
第一:因为pg_catalog
归超级用户 postgres 所有,因此请务必使用此角色登录服务器:
pg_catalog schema permission
第二:确保您连接到正确数据库,该数据库需要 GRANT / REVOKE 权限。 GRANT / REVOKE仅影响您连接到的当前数据库。这意味着在您使用超级用户帐户登录后,发出: \ c [数据库] 以连接到该数据库,shell将更改为: [数据库] =>
3rd :pg_catalog
中的表默认授予SELECT到PUBLIC:tables in pg_catalog。因此,您必须运行REVOKE SELECT FROM PUBLIC,然后将GRANT SELECT运行到适当的用户:
在PEMA的ppg_catalog中重新选择所有表格;
GRANT SELECT ON TABLE [table] TO [user];
对于数据库中的列表表: pg_class 和 pg_namespace 。
这就是全部:)
答案 1 :(得分:4)
你想要完成的是在PostgreSQL中被设计拒绝。
如果用户无法访问pg_catalog
架构(当您尝试使用REVOKE
命令时),他/她将无法运行最简单的SELECT查询 - 计划程序将无法访问表定义。
您的目标可能通过REVOKE
访问所有架构来实现 - 因此仅将用户锁定在其私有架构中(使用CREATE SCHEMA AUTHORIZATION username
)。
如果GRANT
已经public
任何权限,则您无法有选择地阻止一个用户 - 您只能REVOKE ... FROM public
。