PostgreSQL从pg_catalog表中撤消权限

时间:2013-12-12 21:36:38

标签: postgresql permissions

有没有办法可以撤消用户对目录对象(即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

有什么想法吗?或者这是不可能的?感谢...

莱斯利

2 个答案:

答案 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

HTH,请问是否不清楚。