Redshift Serverless Zero-ETL物化视图权限异常问题求助
问题:Redshift Serverless自动刷新物化视图权限异常,BI用户无基表权限时查询报错
场景描述
通过Zero-ETL将DynamoDB数据同步到Redshift Serverless,创建自动刷新的物化视图供BI仪表板使用,仅希望BI用户拥有该物化视图的访问权限。执行以下SQL创建物化视图并授权:
CREATE MATERIALIZED VIEW messages AUTO REFRESH YES AS SELECT value.sender."S"::VARCHAR(10) AS sender, value.source."S"::VARCHAR(10) AS source, value.message."S"::VARCHAR(10) AS message, timestamp 'epoch' + timestamp * interval '1 second' AS datetime FROM "ddb_message"."public"."ddb-message"; GRANT SELECT ON TABLE messages TO bi_user;
根据AWS官方文档说明,访问物化视图无需拥有底层基表的SELECT权限,但bi_user查询物化视图时持续报错:
SQL Error [XX000]: ERROR: Relation ddb-message does not exist in the database.
仅当额外给bi_user授予基表的SELECT权限时才能正常查询,需明确问题原因及取消基表授权的解决方法。
问题原因
官方文档中“无需基表SELECT权限”的描述仅适用于基于普通内部表的物化视图。而Zero-ETL同步的DynamoDB表属于特殊的外部关联表,Redshift Serverless在处理这类基表的物化视图查询时,会默认验证用户对基表的访问权限(即使物化视图已存储快照数据),导致无基表权限的用户查询失败。
解决方法
方法1:授予基表USAGE权限(而非SELECT)
无需给BI用户开放基表的查询权限,仅授予基表及对应schema的USAGE权限即可:
-- 授予schema的USAGE权限 GRANT USAGE ON SCHEMA "ddb_message"."public" TO bi_user; -- 授予基表的USAGE权限 GRANT USAGE ON TABLE "ddb_message"."public"."ddb-message" TO bi_user; -- 取消之前授予的基表SELECT权限(如果已授予) REVOKE SELECT ON TABLE "ddb_message"."public"."ddb-message" FROM bi_user;
USAGE权限仅允许用户访问对象的元数据,无法直接查询基表数据,满足权限最小化需求。
方法2:使用SECURITY DEFINER创建物化视图
创建物化视图时添加WITH SECURITY DEFINER参数,使物化视图以创建者的身份执行查询。创建者需拥有基表的SELECT权限,后续BI用户仅需物化视图的SELECT权限即可:
-- 重新创建带SECURITY DEFINER的物化视图 CREATE MATERIALIZED VIEW messages AUTO REFRESH YES WITH SECURITY DEFINER AS SELECT value.sender."S"::VARCHAR(10) AS sender, value.source."S"::VARCHAR(10) AS source, value.message."S"::VARCHAR(10) AS message, timestamp 'epoch' + timestamp * interval '1 second' AS datetime FROM "ddb_message"."public"."ddb-message"; -- 确保BI用户仅拥有物化视图的SELECT权限 GRANT SELECT ON TABLE messages TO bi_user; -- 取消基表的SELECT权限(如果已授予) REVOKE SELECT ON TABLE "ddb_message"."public"."ddb-message" FROM bi_user;
注意:使用SECURITY DEFINER时需确保创建者的权限仅包含必要的基表访问权限,避免权限泄露风险。
内容的提问来源于stack exchange,提问作者Matt
相关产品推荐
相关产品推荐

