Redshift拥有列权限用户执行SELECT *遭权限拒绝,求助原因
问题:Redshift列级权限用户执行SELECT *触发权限拒绝
根据AWS文档,拥有表或视图列权限的用户应当仍可执行SELECT *操作,仅返回自身有权限的列。官方说明提到:
若您没有表中所有列的SELECT权限,执行SELECT *操作仅返回您有权限的列。
但实际测试时遇到权限拒绝问题,测试步骤及代码如下:
-- 创建测试用户 create user test password disable; -- 授予列级权限 GRANT USAGE ON SCHEMA source,processed,curated TO test; grant select (PERNR,TRFGR,BEGDA,ENDDA) on processed.PA0008 to test; -- 切换到测试用户执行测试 set session authorization "test"; select current_user; -- 显式指定有权限的列查询:成功 select begda,endda,pernr,trfgr from processed.pa0008 limit 100; -- 使用SELECT *查询:报错 select * from processed.pa0008 limit 100; -- ERROR: permission denied for relation pa0008
显式指定有权限的列查询可成功,但执行SELECT *时触发ERROR: permission denied for relation错误,请问原因是什么?
原因分析
这个问题的核心是Redshift的权限校验逻辑:
- 当仅授予用户列级SELECT权限,未授予任何表级SELECT权限时,执行
SELECT *会触发表级权限检查失败,直接返回权限拒绝。 - AWS文档描述的场景是用户已拥有表级SELECT权限,但被列级权限限制访问部分列的情况,此时
SELECT *才会自动过滤出用户有权限的列返回。
简单来说,SELECT *的执行前提是用户至少拥有表级的SELECT权限(哪怕是被列级权限限制),仅列级权限不足以让Redshift触发“过滤列返回”的逻辑,而是直接判定用户没有访问该表的权限。
解决方法:
- 给用户追加表级SELECT权限:
GRANT SELECT ON processed.PA0008 TO test;,此时再执行SELECT *就会返回有权限的列; - 或者始终保持显式指定有权限的列进行查询。
内容的提问来源于stack exchange,提问作者SimonB
相关产品推荐
相关产品推荐

