使用相同凭证,DataGrip查询Redshift表提示权限拒绝的原因
问题
我在VSCode中可通过以下Python脚本创建或删除Redshift表:
def write_to_RS(query): try: secret_arn = session.client('secretsmanager').get_secret_value(SecretId=rs_secret_id)['ARN'] # Initializing Redshift client logger.info("Initializing Redshift's client ...") config = Config(connect_timeout=180, read_timeout=180) client_redshift = session.client("redshift-data", config=config) client_redshift.execute_statement(Database=db, SecretArn=secret_arn, Sql=query, ClusterIdentifier=cluster_id) permissions_update = "GRANT ALL ON ALL TABLES IN SCHEMA my_schema TO GROUP admin" client_redshift.execute_statement(Database=db, SecretArn=secret_arn, Sql=permissions_update, ClusterIdentifier=cluster_id) except Exception as e: raise Exception(e) q = """ CREATE TABLE IF NOT EXISTS address ( account_id INT, street VARCHAR, city VARCHAR, country VARCHAR ) """ write_to_RS(q) # write_to_RS('DROP TABLE address')
但使用相同凭证在DataGrip中直接打开或查询该表(如select count(*) from address)时,抛出错误:[42501] ERROR: permission denied for relation address。请问这是什么原因?是否public schema存在不可修改的默认权限?
分析与解决
- 权限授权范围不包含新创建的表:脚本中执行的
GRANT ALL ON ALL TABLES IN SCHEMA my_schema TO GROUP admin仅对执行该语句前已存在的表生效,刚创建的address表不在这个范围内,所以没有被授予权限。 - 用户组归属验证:确认DataGrip使用的凭证对应的用户是否属于
admin组,若不在该组,组权限无法作用于该用户。 - schema默认权限配置:如果表默认创建在
publicschema下(脚本未指定schema时的默认行为),检查public的默认权限:-- 查看public schema默认权限 SELECT nspname, defaclacl FROM pg_namespace WHERE nspname = 'public'; -- 配置默认权限,让admin组自动拥有新表权限 ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL ON TABLES TO GROUP admin; - 单独为已创建表授权:针对已存在的
address表,执行单独授权:GRANT ALL ON TABLE address TO GROUP admin;
内容的提问来源于stack exchange,提问作者Raksha
相关产品推荐
相关产品推荐

