跳至内容

如何在 Amazon Redshift 中授予对外部架构的访问权限?

3 分钟阅读
0

我的用户无法访问 Amazon Redshift 集群的外部架构中的对象。

简短描述

当您在 Amazon Redshift 中使用外部架构时,可能会收到以下错误消息:

  • “Permission denied”
  • “Operation is not supported”
  • “External tables are not supported in views”

AWS Lake Formation 权限配置不正确也可能导致 Amazon Redshift Spectrum 出现错误。要解决此问题,必须在外部架构级别授予权限,而非表级别。

解决方法

授予访问外部架构中对象的权限

当 Amazon Redshift 用户无权访问外部架构中的对象时,他们可能会收到以下错误:

“ERROR: permission denied for schema external_schema_name”

要向用户授予权限,请完成以下步骤:

  1. 打开 Amazon Redshift 控制台

  2. 以超级用户身份登录。

  3. 运行以下命令,以验证用户对其想要访问的外部架构的权限:

    SELECT *
    FROM SVV_SCHEMA_PRIVILEGES
    WHERE identity_name = 'name_of_the_user/role/group' AND namespace_name = 'external_schema_name';

    **注意:**请将 name_of_the_user/role/group 替换为您要授予访问权限的用户、角色或组的名称。将 external_schema_name 替换为外部架构的名称。

    如果上述命令未返回 USAGE 权限类型,则表明用户、角色或组无权查询外部架构。

  4. 运行以下 GRANT 命令之一以授予使用外部架构的权限:

    GRANT USAGE ON SCHEMA external_schema_name TO user_name;
    GRANT USAGE ON SCHEMA external_schema_name TO role role_name;
    GRANT USAGE ON SCHEMA external_schema_name TO group group_name;

    **注意:**请将 external_schema_name 替换为外部架构的名称。将 user_namerole_namegroup_name 替换为您要授予访问权限的用户、角色或组。

解决数据共享权限问题

当您尝试授予对外部架构中对象的权限时,可能会收到以下错误消息:

“ERROR: Operation is not supported through datashares”。

此错误会在以下情况下发生:

  • 外部架构来自您通过数据共享创建的数据库。
  • 原始数据共享未包含 WITH PERMISSIONS 子句。

要解决此问题,请从包含 WITH PERMISSION 子句的数据共享中重新创建数据库。

完成以下步骤:

  1. 运行以下命令以删除现有的数据共享数据库:

    DROP database database_created_from_datashare_name;

    **注意:**请将 database_created_from_datashare_name 替换为您的数据库名称。

  2. 运行以下命令以重新创建数据库:

    CREATE DATABASE database_created_from_datashare_name
    WITH PERMISSIONS
    FROM DATASHARE 'datashare_name'
    OF ACCOUNT 'account_number'
    NAMESPACE 'namespace_uuid';

    **注意:**请将 database_created_from_datashare_name 替换为您的数据库名称,将 datashare_name 替换为您的数据共享的名称。将 account number 替换为您的 AWS 账号,将 namespace_uuid 替换为您的命名空间的通用唯一标识符 (UUID)。

  3. 运行以下命令以创建外部架构:

    CREATE EXTERNAL SCHEMA external_schema_name
    FROM REDSHIFT DATABASE database_created_from_datashare_name
    SCHEMA schema_in_database_created_from_datashare;

    **注意:**请将 external_schema_name 替换为外部架构的名称,将 database_created_from_datashare_name 替换为您的数据库名称。将 schema_in_database_created_from_datashare 替换为您通过数据共享创建的架构的名称。

  4. 运行以下命令以授予使用权限:

    GRANT USAGE on SCHEMA external_schema_name to user_name;
    GRANT USAGE ON SCHEMA database_created_from_datashare_name.schema_in_datashare_name TO user_name;

    **注意:**请将 external_schema_name 替换为外部架构名称。将 user_name 替换为您要授予使用权限的用户的名称。将 database_created_from_datashare_name 替换为您通过数据共享创建的数据库的名称,将 schema_in_datashare_name 替换为您的架构名称。

  5. 运行以下 SELECT 命令以授予访问特定表的权限:

    GRANT SELECT ON
    TABLE database_created_from_datashare_name.schema_in_datashare_name.table_name
    TO user_name;

    **注意:**请将 database_created_from_datashare_name 替换为您通过数据共享创建的数据库的名称,将 schema_in_datashare_name 替换为您的架构名称。将 table_name 替换为您的表名称,将 user_name 替换为您的用户名。

    要授予对架构中所有表的访问权限,请运行以下命令:

    GRANT SELECT ON
    ALL TABLES IN SCHEMA database_created_from_datashare_name.schema_in_datashare_name
    TO user_name;

    **注意:**请将 database_created_from_datashare_name 替换为您通过数据共享创建的数据库的名称,将 schema_in_datashare_name 替换为您的架构名称。将 user_name 替换为您的用户名。

解决外部架构的 Lake Formation 权限问题

确认您已为 AWS Glue Data Catalog 启用了 Lake Formation,且您的 Amazon Redshift 集群的 AWS Identity and Access Management (IAM) 角色具有所需的 AWS Glue Data Catalog 权限。

有关详细信息,请参阅 Redshift Spectrum 和 AWS Lake Formation管理 Lake Formation 权限

通过外部架构实现精细化访问控制

在 Amazon Redshift Spectrum 中使用 Lake Formation 或角色链接实现精细化访问控制。您可以在架构级别、表级别或列级别授予权限。

有关详细信息,请参阅 Restrict Amazon Redshift Spectrum external table access to Amazon Redshift IAM users and groups using role chaining(使用角色链接限制 Amazon Redshift IAM 用户和组对 Amazon Redshift Spectrum 外部表的访问)Granting permissions on Data Catalog resources(授予 Data Catalog 资源权限)

在创建包含外部表的视图时,请使用 WITH NO SCHEMA BINDING 子句

当您创建引用外部表的视图时,可能会收到以下错误消息:

“ERROR: External tables are not supported in views”。

要解决此问题,请运行以下命令,以使用 WITH NO SCHEMA BINDING 子句创建视图:

CREATE OR REPLACE VIEW view_name AS
SELECT * FROM external_schema_name.external_table_name
WITH NO SCHEMA BINDING ;

**注意:**请将 external_schema_name 替换为外部架构名称,将 external_table_name 替换为外部表的名称。

相关信息

SVV_EXTERNAL_SCHEMAS

将 CREATE DATABASE 与数据共享结合使用的参数

参数

AWS 官方已更新 1 年前