PostgreSQL 15升级后public schema权限授予无效及权限变化咨询
PostgreSQL权限问题解答
问题1:已授予schema权限为何仍提示权限不足?
可能有以下几个原因:
- 搜索路径未包含public:切换到
trololo用户后执行SHOW search_path;,如果public不在返回的路径列表里,直接CREATE TABLE会尝试在搜索路径的第一个schema中创建,若该schema无权限就会报错。此时要么显式指定schema创建表(CREATE TABLE public.你的表名(...);),要么修改搜索路径(SET search_path TO public;)。 - 权限通过无继承属性的角色获得:如果权限是授予给某个角色,再将角色授予
trololo时用了NOINHERIT参数,那么trololo默认不会继承该角色的权限。需要执行SET ROLE <对应角色名>;才能激活角色权限。 - 权限实际未生效:检查是否存在后续的
REVOKE操作,或者public schema的所有者被修改,导致之前的GRANT权限被覆盖。可以重新执行一次GRANT ALL ON schema public TO trololo;再测试。
问题2:PostgreSQL 12升级到15后,为何需要同时授予schema权限?
这是因为PostgreSQL 14对public schema的默认权限做了变更:
- 在PostgreSQL 13及更早版本中,public schema默认会给
PUBLIC角色(所有用户)授予CREATE和USAGE权限,所以普通用户默认就能在public里创建表,只需要后续给表权限即可操作。 - 从PostgreSQL 14开始,默认只给
PUBLIC角色保留USAGE权限,移除了CREATE权限。因此现在用户要在public schema中创建对象(比如表),必须显式授予CREATE(或ALL)权限,否则即使有表权限也无法创建对象。
内容的提问来源于stack exchange,提问作者Kifsif
相关产品推荐
相关产品推荐

