将Schema中的表的查询权限赋给其他用户,赋权后仍无法查询Schema中的表
问题现象
有权限的用户使用“GRANT SELECT ON all tables in schema schema_name TO u1”命令给u1用户赋予schema下表的权限后,u1用户仍然无法访问该schema下的表。
原因分析
将模式中的表或者视图对象授权给其他用户时,需要将表或视图所属的模式的USAGE权限同时授予该用户,如果没有该权限,则只能看到这些对象的名字,并不能实际进行对象访问。
如果要将该schema下未来创建的表的权限也赋予u1用户,则需使用ALTER DEFAULT PRIVILEGES更改默认权限。
处理方法
请使用具有schema权限的用户登录数据库,执行以下命令将schema中的表权限赋给指定的用户:
1 2 |
GRANT USAGE ON SCHEMA schema_name TO u1; GRANT SELECT ON ALL TABLES IN SCHEMA schema_name TO u1; |
执行以下命令,将schema中未来新建的表的权限也赋予指定的用户:
1
|
ALTER DEFAULT PRIVILEGES IN SCHEMA schema_name GRANT SELECT ON TABLES TO u1; |
上述SQL语句中的“GRANT SELECT”表示赋予的是表的查询权限,如果需要给其他用户赋予表的其他权限,请参考GRANT章节。
如果需要给某个用户赋权“可查询数据库所有schema里所有表”,可通过系统表PG_NAMESPACE查询出schema后授权。例如:
1
|
SELECT 'grant select on all tables in '|| nspname || 'to u1' FROM pg_namespace; |