You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 20:08:12