无法撤销自定义schema中函数的EXECUTE执行权限
问题根本原因
PostgreSQL 内置一个所有角色默认继承的隐式公共角色 PUBLIC,默认新创建的函数都会自动为 PUBLIC 角色授予 EXECUTE 执行权限。你仅撤销了 doctor 角色显式持有的函数权限,但是 doctor 角色继承自 PUBLIC 的执行权限仍然生效,因此还是可以正常调用函数。
修复方案
- 先撤销
PUBLIC角色对目标函数的默认执行权限:REVOKE EXECUTE ON FUNCTION app.my_function() FROM PUBLIC; - 按需给其他需要调用该函数的角色单独授予执行权限即可,示例如下:
-- 假设需要给admin角色开放权限 GRANT EXECUTE ON FUNCTION app.my_function() TO admin;
其他排查点
- 确认撤销权限时的函数签名与实际创建的函数完全匹配,包含参数类型:如果函数实际定义为带参数的
app.my_function(text),你撤销权限时写无参的app.my_function()会匹配不到目标函数,权限撤销不会生效。 - 确认
doctor角色没有继承其他持有该函数执行权限的角色权限,如果存在继承关系,需要同步撤销对应父角色的权限或者调整角色继承关系。
内容的提问来源于stack exchange,提问作者lawayben
相关产品推荐
相关产品推荐

