

 从补丁 198 开始，Amazon Redshift 将不再支持创建新的 Python UDF。现有的 Python UDF 将继续正常运行至 2026 年 6 月 30 日。有关更多信息，请参阅[博客文章](https://aws.amazon.com/blogs/big-data/amazon-redshift-python-user-defined-functions-will-reach-end-of-support-after-june-30-2026/)。

# 使用说明
<a name="r_GRANT-usage-notes"></a>

要授予关于对象的权限，您必须满足以下条件之一：
+ 是对象所有者。
+ 是超级用户。
+ 拥有该对象和权限的授予权限。

例如，以下命令使用户 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 中的表具有权限。而是显式授予对基础表的访问权限。

要授予针对 AWS 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 命令如何。

## 列级访问控制的使用说明
<a name="r_GRANT-usage-notes-clp"></a>

以下使用说明适用于 Amazon Redshift 表和视图上的列级权限。这些说明描述了表；除非我们明确指出例外，否则相同的说明适用于视图。
+ 对于 Amazon Redshift 表，您只能在列级别授予 SELECT 和 UPDATE 权限。对于 Amazon Redshift 视图，您只能在列级别授予 SELECT 权限。
+ ALL 关键字是在表上列级 GRANT 的上下文中使用时组合的 SELECT 和 UPDATE 权限的同义词。
+ 如果您没有表中所有列的 SELECT 权限，则执行 SELECT \$1 操作将仅返回您有权访问的那些列。使用视图时，SELECT \$1 操作会尝试访问视图中的所有列。如果您并没有访问所有列的权限，则这些查询会失败，并出现权限被拒绝错误。
+ 在以下情况下，SELECT \$1 不会仅扩展到可访问的列：
  + 您无法使用 SELECT \$1 创建仅包含可访问列的常规视图。
  + 您无法使用 SELECT \$1 创建仅包含可访问列的实体化视图。
+ 如果对表或视图具有 SELECT 或 UPDATE 权限并添加一列，则您对表或视图及其所有列仍具有相同的权限。
+ 只有表的拥有者或超级用户才能授予列级权限。
+ 列级权限不支持 WITH GRANT OPTION 子句。
+ 您不能同时在表级别和列级别保持相同的权限。例如，用户 `data_scientist` 不能既对表 `employee` 具有 SELECT 权限，又对列 `employee.department` 具有 SELECT 权限。在对表和表中的列授予相同权限时，请考虑以下结果：
  + 如果用户对表具有表级权限，则在列级别授予相同权限不起作用。
  + 如果用户对表具有表级权限，则撤消表中一个或多个列的相同权限将返回错误。而应撤消表级别的权限。
  + 如果用户具有列级权限，则在表级别授予相同权限将返回错误。
  + 如果用户具有列级权限，则在表级别撤消相同的权限将撤消对表上所有列的列和表权限。
+ 您不能为后期绑定视图授予列级权限。
+ 要创建实体化视图，您必须对基表具有表级 SELECT 权限。即使您对特定列具有列级权限，也无法仅在这些列上创建实体化视图。但是，您可以授予对于实体化视图（类似于常规视图）的列的 SELECT 权限。
+ 要查找列级别权限的授予，请使用 [PG\$1ATTRIBUTE\$1INFO](r_PG_ATTRIBUTE_INFO.md) 视图。

## 有关授予 ASSUMEROLE 权限的使用说明
<a name="r_GRANT-usage-notes-assumerole"></a>

以下使用说明适用于在 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\$1ASSUMEROLE\$1PRIVILEGE](r_HAS_ASSUMEROLE_PRIVILEGE.md)。要列出已授予您指定的用户的 IAM 角色和命令权限，请参阅[PG\$1GET\$1IAM\$1ROLE\$1BY\$1USER](PG_GET_IAM_ROLE_BY_USER.md)。要列出已被授权访问您指定的 IAM 角色的用户、角色和组，请参阅 [PG\$1GET\$1GRANTEE\$1BY\$1IAM\$1ROLE](PG_GET_GRANTEE_BY_IAMROLE.md)。

## 有关授予机器学习权限的使用说明
<a name="r_GRANT-usage-notes-create-model"></a>

您不能直接授予或撤销与机器学习函数相关的权限。机器学习函数属于机器学习模型，其权限通过模型来控制。相反，您可以授予与机器学习模型相关的权限。以下示例演示如何向所有用户授予权限，以便运行与 `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 'amzn-s3-demo-bucket'
);
```