撤销用户对DROP表的权限

3
我是PostgreSQL的忠实粉丝,但有一个内置用户管理方面的问题我搞不清楚。
我的问题是我已经设置了pgAdmin,并将一些非开发人员手动更新特定表中的数据。因此,我创建了一个名为“admin”的新用户,并希望限制此用户的权限。
我尝试使用以下查询(来自另一个用户)删除用户的所有权限:
REVOKE ALL PRIVILEGES ON ALL TABLES IN SCHEMA public FROM admin;
REVOKE ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public FROM admin;
REVOKE ALL PRIVILEGES ON ALL FUNCTIONS IN SCHEMA public FROM admin;

当我在名为“crap”的表上从用户管理员写一个简单的SELECT语句时,出现了以下错误:ERROR: permission denied for relation crap
但是,我能够使用现在不应该有任何权限的用户管理员执行以下操作:DROP TABLE crap; 这怎么可能呢?
我对此感到非常惊讶。这个用户不是Postgres超级用户。如何取消特定用户删除表的权限?

2
文档中:只有表所有者、架构所有者和超级用户才能删除表。那么这是谁的表? - undefined
感谢您的评论。SELECT * FROM pg_tables WHERE tablename = 'crap';显示了在这个例子中,用户"admin"并不是所有者。 - undefined
1个回答

0
你的权限等级有一级差距。
REVOKE ALL PRIVILEGES FROM SCHEMA public FROM <role_name>;

你正在影响表中的权限。你还必须上升到模式级别来保护创建/删除访问权限。你可能还想在数据库级别撤销访问权限,以保护模式。
REVOKE ALL PRIVILEGES FROM DATABASE <database_name> FROM <role_name>;

你也可以直接删除该用户。或者,你也可以简单地禁用该用户的登录权限。
ALTER ROLE <role_name> SET NOLOGIN;

如果这些方法对你不起作用,你可以选择一种稍微复杂一点的方式,创建一个event trigger来监视DROP TABLE事件,与角色进行比较,并决定是允许继续执行还是中止事务。
CREATE OR REPLACE FUNCTION no_admin_drop()
  RETURNS event_trigger LANGUAGE plpgsql AS $$
BEGIN
  IF CURRENT_USER = 'admin'::regrole THEN
    RAISE EXCEPTION 'command is disabled';
  END IF;
END;
$$;

CREATE EVENT TRIGGER no_admin_drop ON sql_drop
   EXECUTE FUNCTION no_admin_drop();

谢谢!我需要用户能够选择(SELECT),但不能删除(DROP)。所以移除用户不是一个选项。我尝试了你提到的撤销权限的方法(应该是使用ON而不是FROM吧):REVOKE ALL PRIVILEGES ON DATABASE prices_prod FROM admin; REVOKE ALL PRIVILEGES ON SCHEMA public FROM admin;但是这个名为“admin”的用户仍然能够删除表格...有什么想法吗? - undefined
我添加了另一个选项:事件触发器 - undefined
非常感谢!事件触发器确实可以实现我想要做的事情。我在另一个Stackoverflow帖子中看到了一些信息,并尝试按照那种方式去做。不幸的是,我正在使用Google Cloud SQL的PSQL实例,在那里他们不允许用户拥有超级用户角色,而这种系统触发器需要超级用户角色才能运行。 - undefined

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