我是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;
当我从用户admin在名为“ crap”的表上写一个简单的SELECT语句时,上面的确导致了以下错误:ERROR: permission denied for relation crap
。
但是,我现在无法拥有任何权限的用户admin可以执行以下操作:DROP TABLE crap;
起作用了??
我对此感到非常惊讶。该用户不是Postgres超级用户。如何删除删除特定用户表的权限?
答案 0 :(得分: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();