如何限制PostgreSQL只读用户调用pg_sleep函数?
限制PostgreSQL只读用户调用pg_sleep()的方法
这事儿用PostgreSQL原生的权限系统就能轻松搞定,步骤很直接,我给你一步步拆解:
第一步:以超级用户身份登录数据库
你需要用拥有超级权限的用户(比如默认的postgres用户)连接到目标数据库,只有超级用户才能修改内置系统函数的权限。第二步:撤销所有用户对pg_sleep的默认执行权限
PostgreSQL里的pg_sleep有两个重载版本(分别接受integer和double precision类型的参数),得把两个都处理到。执行以下两条命令:REVOKE EXECUTE ON FUNCTION pg_sleep(integer) FROM PUBLIC; REVOKE EXECUTE ON FUNCTION pg_sleep(double precision) FROM PUBLIC;这里的
PUBLIC代表所有用户,撤销后默认情况下没有用户能调用这个函数了。第三步:给需要使用pg_sleep的合法用户/角色授权
如果有其他用户或角色需要正常使用pg_sleep,可以单独给他们授予权限。比如给名为db_admin的角色授权:GRANT EXECUTE ON FUNCTION pg_sleep(integer), pg_sleep(double precision) TO db_admin;第四步:验证效果
切换到你的只读用户,尝试执行SELECT pg_sleep(10);,此时应该会收到类似这样的错误提示:ERROR: permission denied for function pg_sleep
额外注意事项
- 如果你的只读用户继承了某个拥有
pg_sleep执行权限的角色,那你需要要么撤销该角色的对应权限,要么修改只读用户的INHERIT属性(执行ALTER ROLE readonly_user NOINHERIT;),避免权限继承导致限制失效。 - 这个操作是持久化的,除非你重新授权,否则所有后续创建的新用户默认都无法调用
pg_sleep。
内容的提问来源于stack exchange,提问作者Abimanyu
相关产品推荐
相关产品推荐

