使用说明 - Amazon Redshift
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

使用说明

要授予关于对象的权限,您必须满足以下条件之一:

  • 是对象所有者。

  • 是超级用户。

  • 拥有该对象和权限的授予权限。

例如,以下命令使用户 HR 能够对 employees 表执行 SELECT 命令并对其他用户授予和撤销相同的权限。

grant select on table employees to HR with grant option;

HR 无法授予 SELECT 之外的任何操作的权限或 employees 表之外的任何其他表的权限。

再例如,以下命令使用户 HR 能够对 employees 表执行 ALTER 命令并对其他用户授予和撤销相同的权限。

grant ALTER on table employees to HR with grant option;

HR 无法授予除 ALTER 之外的任何操作的权限或 employees 表之外的任何其他表的权限。

获得视图的权限并不意味着对基础表具有权限。同样,获得 schema 的权限并不意味着对该 schema 中的表具有权限。而是显式授予对基础表的访问权限。

要授予针对 Amazon Lake Formation 表的权限,与表的外部架构关联的 IAM 角色必须有权授予对外部表的权限。以下示例创建具有关联 IAM 角色 myGrantor 的外部架构。IAM 角色 myGrantor 有权向其他角色授予权限。GRANT 命令使用与外部架构关联的 IAM 角色 myGrantor 的权限来向 IAM 角色 myGrantee 授予权限。

create external schema mySchema from data catalog database 'spectrum_db' iam_role 'arn:aws:iam::123456789012:role/myGrantor' create external database if not exists;
grant select on external table mySchema.mytable to iam_role 'arn:aws:iam::123456789012:role/myGrantee';

如果您向 IAM 角色授予 ALL 权限,则会在相关的启用了 Lake Formation 的 Data Catalog 中授予各个权限。例如,以下 GRANT ALL 会导致在 Lake Formation 控制台中显示授予的各个权限(SELECT、ALTER、DROP、DELETE 和 INSERT)。

grant all on external table mySchema.mytable to iam_role 'arn:aws:iam::123456789012:role/myGrantee';

超级用户可以访问所有对象,不管设置对象权限的 GRANT 和 REVOKE 命令如何。

列级访问控制的使用说明

以下使用说明适用于 Amazon Redshift 表和视图上的列级权限。这些说明描述了表;除非我们明确指出例外,否则相同的说明适用于视图。

  • 对于 Amazon Redshift 表,您只能在列级别授予 SELECT 和 UPDATE 权限。对于 Amazon Redshift 视图,您只能在列级别授予 SELECT 权限。

  • ALL 关键字是在表上列级 GRANT 的上下文中使用时组合的 SELECT 和 UPDATE 权限的同义词。

  • 如果您没有表中所有列的 SELECT 权限,则执行 SELECT * 操作将仅返回您有权访问的那些列。

  • 在以下情况下,SELECT * 不会仅扩展到可访问的列:

    • 您无法使用 SELECT * 创建仅包含可访问列的常规视图。

    • 您无法使用 SELECT * 创建仅包含可访问列的实体化视图。

  • 如果对表或视图具有 SELECT 或 UPDATE 权限并添加一列,则您对表或视图及其所有列仍具有相同的权限。

  • 只有表的拥有者或超级用户才能授予列级权限。

  • 列级权限不支持 WITH GRANT OPTION 子句。

  • 您不能同时在表级别和列级别保持相同的权限。例如,用户 data_scientist 不能既对表 employee 具有 SELECT 权限,又对列 employee.department 具有 SELECT 权限。在对表和表中的列授予相同权限时,请考虑以下结果:

    • 如果用户对表具有表级权限,则在列级别授予相同权限不起作用。

    • 如果用户对表具有表级权限,则撤消表中一个或多个列的相同权限将返回错误。而应撤消表级别的权限。

    • 如果用户具有列级权限,则在表级别授予相同权限将返回错误。

    • 如果用户具有列级权限,则在表级别撤消相同的权限将撤消对表上所有列的列和表权限。

  • 您不能为后期绑定视图授予列级权限。

  • 要创建实体化视图,您必须对基表具有表级 SELECT 权限。即使您对特定列具有列级权限,也无法仅在这些列上创建实体化视图。但是,您可以授予对于实体化视图(类似于常规视图)的列的 SELECT 权限。

  • 要查找列级别权限的授予,请使用 PG_ATTRIBUTE_INFO 视图。

有关授予 ASSUMEROLE 权限的使用说明

以下使用说明适用于在 Amazon Redshift 中授予 ASSUMEROLE 权限。

您可以使用 ASSUMEROLE 权限,通过 IAM 角色控制数据库用户、角色或组对 COPY、UNLOAD、EXTERNAL FUNCTION 或 CREATE MODEL 等命令的访问权限。向用户、角色或组授予对 IAM 角色的 ASSUMEROLE 权限后,该用户、角色或组可以在运行命令时代入该角色。ASSUMEROLE 权限让您可以根据需要授予对相应命令的访问权限。

只有数据库超级用户才可以授予或撤销用户、角色和组的 ASSUMEROLE 权限。超级用户始终保留 ASSUMEROLE 权限。

要为用户、角色和组启用 ASSUMEROLE 权限,超级用户需要执行以下两项操作:

  • 在集群上运行以下语句一次:

    revoke assumerole on all from public for all;
  • 向用户、角色和组授予相应命令的 ASSUMEROLE 权限。

在授予 ASSUMEROLE 权限时,您可以在 ON 子句中指定角色链接。您可以使用逗号来分隔角色链中的角色,例如 Role1,Role2,Role3。如果在授予 ASSUMEROLE 权限时指定了角色链接,则在执行由 ASSUMEROLE 权限授予的操作时,必须指定角色链。在执行由 ASSUMEROLE 权限授予的操作时,您无法在角色链中指定各个角色。例如,如果某个用户、角色或组被授予角色链 Role1,Role2,Role3,则不能仅指定 Role1 来执行操作。

如果用户尝试执行 COPY、UNLOAD、EXTERNAL FUNCTION 或 CREATE MODEL 操作,但尚未被授予 ASSUMEROLE 权限,则会显示类似于以下内容的消息。

ERROR: User awsuser does not have ASSUMEROLE permission on IAM role "arn:aws:iam::123456789012:role/RoleA" for COPY

要列出已通过 ASSUMEROLE 权限授予对 IAM 角色和命令的访问权限的用户,请参阅HAS_ASSUMEROLE_PRIVILEGE。要列出已授予您指定的用户的 IAM 角色和命令权限,请参阅PG_GET_IAM_ROLE_BY_USER。要列出已被授权访问您指定的 IAM 角色的用户、角色和组,请参阅 PG_GET_GRANTEE_BY_IAM_ROLE

有关授予机器学习权限的使用说明

您不能直接授予或撤销与机器学习函数相关的权限。机器学习函数属于机器学习模型,其权限通过模型来控制。相反,您可以授予与机器学习模型相关的权限。以下示例演示如何向所有用户授予权限,以便运行与 customer_churn 模型关联的机器学习函数。

GRANT EXECUTE ON MODEL customer_churn TO PUBLIC;

您还可以向用户授予对机器学习模型 customer_churn 的所有权限。

GRANT ALL on MODEL customer_churn TO ml_user;

如果架构中有机器学习函数,则授予与机器学习函数相关的 EXECUTE 权限将失败,即使该机器学习函数已通过 GRANT EXECUTE ON MODEL 获得 EXECUTE 权限。我们建议在使用 CREATE MODEL 命令时,通过单独的架构将机器学习函数单独保存在单独架构本身中。以下示例演示了如何执行此操作。

CREATE MODEL ml_schema.customer_churn FROM customer_data TARGET churn FUNCTION ml_schema.customer_churn_prediction IAM_ROLE default SETTINGS ( S3_BUCKET 'your-s3-bucket' );