

 从补丁 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/)。

# GRANT
<a name="r_GRANT"></a>

为用户或角色定义访问权限。

权限包括各种访问选项，例如读取表和视图中的数据、写入数据、创建表和删除表的功能。使用此命令可授予对表、数据库、架构、函数、过程、语言或列的特定权限。要撤销对数据库对象的权限，请使用 [REVOKE](r_REVOKE.md) 命令。

权限还包括以下数据共享生产者访问选项：
+  向使用者命名空间和账户授予数据共享访问权限。
+  通过在数据共享中添加或删除对象来授予更改数据共享的权限。
+  通过在数据共享中添加或删除使用者命名空间来授予共享数据共享的权限。

数据共享使用者访问选项如下：
+ 向用户授予对通过数据共享创建的数据库或指向此类数据库的外部架构的完全访问权限。
+ 向用户授予对通过数据共享创建的数据库的对象级权限，就像对本地数据库对象一样。要授予此级别的权限，在从数据共享创建数据库时必须使用 WITH PERMISSIONS 子句。有关更多信息，请参阅 [CREATE DATABASE](r_CREATE_DATABASE.md)。

有关数据共享权限的更多信息，请参阅[您可以向数据共享授予的权限](permissions-datashares.md)。

权限还包括以下 Amazon Redshift 联合身份验证权限目录：
+ 向用户和角色授予表级别权限。
+ 授予对表、视图和实体化视图的精细列级别权限。
+ 向用户和角色授予限定范围权限。
+ 授予对 Amazon Redshift 联合身份验证权限目录的数据库级别权限。

有关管理对 Amazon Redshift 联合身份验证权限目录的权限的更多信息，请参阅[管理 Amazon Redshift 联合身份验证权限目录上的访问控制授权/撤销](federated-permissions-managing-access.md)。有关 Amazon Redshift 联合身份验证权限目录支持的授予/撤销语法的更多信息，请参阅[授予/撤销](https://docs.aws.amazon.com/redshift/latest/dg/federated-permissions-managing-access.html#federated-permissions-managing-access-grant-revoke)。

权限还包括 AWS IAM Identity Center 联合用户的 CONNECT 权限。此权限使管理员能够在每个已启用 Amazon Redshift 联合身份验证权限的 Amazon Redshift 工作组或集群中，通过精细权限控制用户访问权限。Amazon Redshift 管理员可以指定哪些 AWS IAM Identity Center 联合用户或组有权直接连接到 Amazon Redshift 工作组，从而提供对每个工作组或集群上的 AWS IAM Identity Center 用户访问权限的精细控制。

您还可以授予角色来管理数据库权限，以及控制用户可以对您的数据执行的操作。通过定义角色并向用户分配角色，您可以限制这些用户能够执行的操作，例如限制用户只能使用 CREATE TABLE 和 INSERT 命令。有关 CREATE ROLE 命令的更多信息，请参阅 [CREATE ROLE](r_CREATE_ROLE.md)。Amazon Redshift 有一些系统定义的角色，您也可以使用这些角色向用户授予特定权限。有关更多信息，请参阅 [Amazon Redshift 系统定义的角色](r_roles-default.md)。

您只能将对于外部架构的 GRANT 或 REVOKE USAGE 权限授予使用 ON SCHEMA 语法的数据库用户和用户组。将 ON EXTERNAL SCHEMA 与 AWS Lake Formation 搭配使用时，您只能向 AWS Identity and Access Management (IAM) 角色授予 GRANT 和 REVOKE 权限。有关权限的列表，请参阅“语法”。

对于存储过程，唯一可以授予的权限是 EXECUTE。

您不能在以下事务数据块内的（外部资源）上运行 GRANT：(BEGIN ... END)。有关事务的更多信息，请参阅 [Amazon Redshift 中的隔离级别](c_serial_isolation.md)。

要查看已向用户授予了数据库的哪些权限，请使用 [HAS\$1DATABASE\$1PRIVILEGE](r_HAS_DATABASE_PRIVILEGE.md)。要查看已向用户授予了针对架构的哪些权限，请使用 [HAS\$1SCHEMA\$1PRIVILEGE](r_HAS_SCHEMA_PRIVILEGE.md)。要查看已向用户授予了表的哪些权限，请使用 [HAS\$1TABLE\$1PRIVILEGE](r_HAS_TABLE_PRIVILEGE.md)。

## 语法
<a name="r_GRANT-synopsis"></a>



```
GRANT { { SELECT | INSERT | UPDATE | DELETE | DROP | REFERENCES | ALTER | TRUNCATE } [,...] | ALL [ PRIVILEGES ] }
    ON { [ TABLE ] table_name [, ...] | ALL TABLES IN SCHEMA schema_name [, ...] }
    TO { username [ WITH GRANT OPTION ] | ROLE role_name | GROUP group_name | PUBLIC } [, ...]

GRANT { { CREATE | USAGE | TEMPORARY | TEMP | ALTER } [,...] | ALL [ PRIVILEGES ] }
    ON DATABASE db_name [, ...]
    TO { username [ WITH GRANT OPTION ] | ROLE role_name | GROUP group_name | PUBLIC } [, ...]

GRANT { { CREATE | USAGE | ALTER | DROP } [,...] | ALL [ PRIVILEGES ] }
    ON SCHEMA schema_name [, ...]
    TO { username [ WITH GRANT OPTION ] | ROLE role_name | GROUP group_name | PUBLIC } [, ...]

GRANT { EXECUTE | ALL [ PRIVILEGES ] }
    ON { FUNCTION function_name ( [ [ argname ] argtype [, ...] ] ) [, ...] | ALL FUNCTIONS IN SCHEMA schema_name [, ...] }
    TO { username [ WITH GRANT OPTION ] | ROLE role_name | GROUP group_name | PUBLIC } [, ...]

GRANT { EXECUTE | ALL [ PRIVILEGES ] }
    ON { PROCEDURE procedure_name ( [ [ argname ] argtype [, ...] ] ) [, ...] | ALL PROCEDURES IN SCHEMA schema_name [, ...] }
    TO { username [ WITH GRANT OPTION ] | ROLE role_name | GROUP group_name | PUBLIC } [, ...]

GRANT USAGE
    ON LANGUAGE language_name [, ...]
    TO { username [ WITH GRANT OPTION ] | ROLE role_name | GROUP group_name | PUBLIC } [, ...]             

GRANT { { ALTER | DROP} [,...] | ALL [ PRIVILEGES ] }
    ON COPY JOB job_name [,...]
    TO { username [ WITH GRANT OPTION ] | ROLE role_name | GROUP group_name | PUBLIC } [, ...]

GRANT { { ALTER | DROP | USAGE } [,...] | ALL [ PRIVILEGES ] }
    ON TEMPLATE [database_name.][schema_name.]template_name [,...]
    TO { username [ WITH GRANT OPTION ] | ROLE role_name | GROUP group_name | PUBLIC } [, ...]
```

### 授予表的列级别权限
<a name="grant-column-level"></a>

以下是 Amazon Redshift 表和视图上的列级别权限的语法。

```
GRANT { { SELECT | UPDATE } ( column_name [, ...] ) [, ...] | ALL [ PRIVILEGES ] ( column_name [,...] ) }
     ON { [ TABLE ] table_name [, ...] }

     TO { username | ROLE role_name | GROUP group_name | PUBLIC } [, ...]
```

### 授予 ASSUMEROLE 权限
<a name="grant-assumerole-permissions"></a>

以下是向具有指定角色的用户和组授予 ASSUMEROLE 权限的语法。要开始使用 ASSUMEROLE 权限，请参阅[有关授予 ASSUMEROLE 权限的使用说明](r_GRANT-usage-notes.md#r_GRANT-usage-notes-assumerole)。

```
GRANT ASSUMEROLE
       ON { 'iam_role' [, ...] | default | ALL }
       TO { username | ROLE role_name | GROUP group_name | PUBLIC } [, ...]
       FOR { ALL | COPY | UNLOAD | EXTERNAL FUNCTION | CREATE MODEL } [, ...]
```

### 授予将 Redshift Spectrum 与 Lake Formation 集成的权限
<a name="grant-spectrum-integration-with-lf-syntax"></a>

以下是 Redshift Spectrum 与 Lake Formation 集成的语法。

```
GRANT { SELECT | ALL [ PRIVILEGES ] } ( column_list )
    ON EXTERNAL TABLE schema_name.table_name
    TO { IAM_ROLE iam_role } [, ...] [ WITH GRANT OPTION ]

GRANT { { SELECT | ALTER | DROP | DELETE | INSERT }  [, ...] | ALL [ PRIVILEGES ] }
    ON EXTERNAL TABLE schema_name.table_name [, ...]
    TO { { IAM_ROLE iam_role } [, ...] | PUBLIC } [ WITH GRANT OPTION ]

GRANT { { CREATE | ALTER | DROP }  [, ...] | ALL [ PRIVILEGES ] }
    ON EXTERNAL SCHEMA schema_name [, ...]
    TO { IAM_ROLE iam_role } [, ...] [ WITH GRANT OPTION ]
```

### 授予数据共享权限
<a name="grant-datashare-syntax"></a>

**生产者端数据共享权限**  
以下是使用 GRANT 向用户或角色授予 ALTER 或 SHARE 权限的语法。用户可以使用 ALTER 权限更改数据共享，也可以向具有 SHARE 权限的使用者授予使用权限。您只能向用户和角色授予对数据共享的 ALTER 和 SHARE 权限。

```
GRANT { ALTER | SHARE } ON DATASHARE datashare_name
    TO { username [ WITH GRANT OPTION ] | ROLE role_name | GROUP group_name | PUBLIC } [, ...]
```

以下是使用 GRANT 授予 Amazon Redshift 上的数据共享使用权限的语法。您可以使用 USAGE 权限向使用者授予对数据共享的访问权限。您不能将此权限授予用户或用户组。此权限也不支持 GRANT 语句的 WITH GRANT OPTION。只有具有先前针对数据共享授予了他们 SHARE 权限的用户或用户组才能运行此类型的 GRANT 语句。

```
GRANT USAGE
    ON DATASHARE datashare_name
    TO NAMESPACE 'namespaceGUID' | ACCOUNT 'accountnumber' [ VIA DATA CATALOG ]
```

以下是如何向 Lake Formation 账户授予数据共享使用权的一个示例。

```
GRANT USAGE ON DATASHARE salesshare TO ACCOUNT '123456789012' VIA DATA CATALOG;
```

**使用者端数据共享权限**  
以下是根据数据共享创建的特定数据库或 schema 的 GRANT 数据共享使用权限的语法。

使用者访问通过数据共享创建的数据库所需的其他权限会有所不同，具体取决于用于从数据共享创建数据库的 CREATE DATABASE 命令是否使用 WITH PERMISSIONS 子句。有关 CREATE DATABASE 命令和 WITH PERMISSIONS 子句的更多信息，请参阅[CREATE DATABASE](r_CREATE_DATABASE.md)。

**未使用 WITH PERMISSIONS 子句创建的数据库**  
在不使用 WITH PERMISSIONS 子句的情况下，对通过数据共享创建的数据库授予 USAGE 权限时，无需对共享数据库中的对象单独授予权限。在不使用 WITH PERMISSIONS 子句的情况下，获准使用从数据共享创建的数据库的实体可以自动访问数据库中的所有对象。

**使用 WITH PERMISSIONS 子句创建的数据库**  
如果共享数据库是使用 WITH PERMISSIONS 子句从数据共享中创建的，则在授予数据库 USAGE 权限时，使用者端实体仍必须获得共享数据库中数据库对象的相关权限才能访问这些对象，就像对本地数据库对象授予权限一样。要向通过数据共享创建的数据库中的对象授予权限，请使用由三部分组成的语法 `database_name.schema_name.object_name`。要向外部架构中指向共享数据库中共享架构的对象授予权限，请使用由两部分组成的语法 `schema_name.object_name`。

```
GRANT USAGE ON { DATABASE shared_database_name [, ...] | SCHEMA shared_schema}
    TO { username | ROLE role_name | GROUP group_name | PUBLIC } [, ...]
```

### 授予限定范围权限
<a name="grant-scoped-syntax"></a>

限定范围权限允许您向用户或角色授予对数据库或架构中某一类型的所有对象的访问权限。具有限定范围权限的用户和角色对数据库或架构中的所有当前和未来对象具有指定权限。

您可以在 [SVV\$1DATABASE\$1PRIVILEGES](r_SVV_DATABASE_PRIVILEGES.md) 中查看数据库级限定权限的范围。您可以在 [SVV\$1SCHEMA\$1PRIVILEGES](r_SVV_SCHEMA_PRIVILEGES.md) 中查看架构级限定权限的范围。

有关限定范围权限的更多信息，请参阅[限定范围权限](t_scoped-permissions.md)。

以下是向用户和角色授予限定范围权限的语法。

```
GRANT { CREATE | USAGE | ALTER | DROP } [,...] | ALL [ PRIVILEGES ] }
FOR SCHEMAS IN
DATABASE db_name 
TO { username [ WITH GRANT OPTION ] | ROLE role_name } [, ...]

GRANT 
{ { SELECT | INSERT | UPDATE | DELETE | DROP | ALTER | TRUNCATE | REFERENCES } [, ...] } | ALL [PRIVILEGES] } }
FOR TABLES IN
{SCHEMA schema_name [DATABASE db_name ] | DATABASE db_name }
TO { username [ WITH GRANT OPTION ] | ROLE role_name} [, ...]

GRANT { EXECUTE | ALL [ PRIVILEGES ] }
FOR FUNCTIONS IN 
{SCHEMA schema_name [DATABASE db_name ] | DATABASE db_name }
TO { username [ WITH GRANT OPTION ] | ROLE role_name | } [, ...]

GRANT { EXECUTE | ALL [ PRIVILEGES ] }
FOR PROCEDURES IN
{SCHEMA schema_name [DATABASE db_name ] | DATABASE db_name }
TO { username [ WITH GRANT OPTION ] | ROLE role_name | } [, ...]

GRANT USAGE
FOR LANGUAGES IN
{DATABASE db_name}
TO { username [ WITH GRANT OPTION ] | ROLE role_name } [, ...]  

GRANT { { CREATE | ALTER | DROP} [,...] | ALL [ PRIVILEGES ] }
FOR COPY JOBS 
IN DATABASE db_name
TO { username [ WITH GRANT OPTION ] | ROLE role_name } [, ...]

GRANT { { ALTER | DROP | USAGE } [,...] | ALL [ PRIVILEGES ] }
FOR TEMPLATES IN
{SCHEMA schema_name [DATABASE db_name ] | DATABASE db_name }
TO { username [ WITH GRANT OPTION ] | ROLE role_name } [, ...]
```

请注意，范围限定的权限不区分函数的权限和过程的权限。例如，以下语句授予 `bob` 对架构 `Sales_schema` 中函数和过程的 `EXECUTE` 权限。

```
GRANT EXECUTE FOR FUNCTIONS IN SCHEMA Sales_schema TO bob;
```

### 授予机器学习权限
<a name="grant-model-syntax"></a>

以下是有关 Amazon Redshift 上机器学习模型权限的语法。

```
GRANT CREATE MODEL
    TO { username [ WITH GRANT OPTION ] | ROLE role_name | GROUP group_name | PUBLIC } [, ...]

GRANT { EXECUTE | ALL [ PRIVILEGES ] }
    ON MODEL model_name [, ...]

    TO { username [ WITH GRANT OPTION ] | ROLE role_name | GROUP group_name | PUBLIC } [, ...]
```

### 授予角色权限
<a name="grant-roles"></a>

以下是在 Amazon Redshift 中授予角色的语法。

```
GRANT { ROLE role_name } [, ...] TO { { user_name [ WITH ADMIN OPTION ] } | ROLE role_name }[, ...]
```

以下是向角色授予对 Amazon Redshift 的系统权限的语法。请注意，您只能向角色授予权限，而不能向用户授予权限。

```
GRANT
  {
    { CREATE USER | DROP USER | ALTER USER |
    CREATE SCHEMA | DROP SCHEMA |
    ALTER DEFAULT PRIVILEGES |
    ACCESS CATALOG | ACCESS SYSTEM TABLE
    CREATE TABLE | DROP TABLE | ALTER TABLE |
    CREATE OR REPLACE FUNCTION | CREATE OR REPLACE EXTERNAL FUNCTION |
    DROP FUNCTION |
    CREATE OR REPLACE PROCEDURE | DROP PROCEDURE |
    CREATE OR REPLACE VIEW | DROP VIEW |
    CREATE MODEL | DROP MODEL |
    CREATE DATASHARE | ALTER DATASHARE | DROP DATASHARE |
    CREATE LIBRARY | DROP LIBRARY |
    CREATE ROLE | DROP ROLE |
    TRUNCATE TABLE
    VACUUM | ANALYZE | CANCEL |
    IGNORE RLS | EXPLAIN RLS | 
    EXPLAIN MASKING }[, ...]
  }
  | { ALL [ PRIVILEGES ] }
TO ROLE role_name [, ...]
```

### 授予对安全性策略的解释权限
<a name="grant-row-level-security"></a>

以下语法用于授予解释 EXPLAIN 计划中查询的安全性策略筛选条件的权限。可能的安全性策略包括行级安全性策略和动态数据掩蔽策略。

```
GRANT EXPLAIN { RLS | MASKING } TO ROLE rolename 
```

以下语法用于授予为查询绕开行级别安全性策略的权限。此语法不适用于动态数据掩蔽策略。

```
GRANT IGNORE RLS TO ROLE rolename 
```

以下语法用于授予对指定安全性策略的查找表权限。可能的安全性策略包括行级安全性策略和动态数据掩蔽策略。

```
GRANT SELECT ON [ TABLE ] table_name [, ...]
TO { RLS | MASKING } POLICY policy_name [, ...]
```

### 授予连接权限
<a name="grant-connection-permissions"></a>

以下语法用于向 AWS IAM Identity Center 联合用户（或组）授予连接到工作组/集群的权限：

```
GRANT CONNECT [ON WORKGROUP]
TO [USER] <prefix>:<username> | ROLE <prefix>:<rolename> | PUBLIC;
```

## 参数
<a name="r_GRANT-parameters"></a>

SELECT   <a name="grant-select"></a>
授予使用 SELECT 语句从表或视图中选择数据的权限。对于 UPDATE 或 DELETE 操作，也需要 SELECT 权限来引用现有的列值。

INSERT   <a name="grant-insert"></a>
授予使用 INSERT 语句或 COPY 语句将数据加载到表中的权限。

UPDATE   <a name="grant-update"></a>
授予使用 UPDATE 语句更新表列的权限。UPDATE 操作也需要 SELECT 权限，因为这些操作必须引用表列才能确定要更新哪些行或者计算列的新值。

DELETE  <a name="grant-delete"></a>
授予从表中删除数据行的权限。DELETE 操作也需要 SELECT 权限，因为这些操作必须引用表列才能确定要删除哪些行。

DROP  <a name="grant-drop"></a>
根据数据库对象，向用户或角色授予以下权限：  
+  对于表，DROP 授予删除表或视图的权限。有关更多信息，请参阅 [DROP TABLE](r_DROP_TABLE.md)。
+  对于数据库，DROP 授予删除数据库的权限。有关更多信息，请参阅 [DROP DATABASE](r_DROP_DATABASE.md)。
+  对于架构，DROP 授予删除架构的权限。有关更多信息，请参阅 [DROP SCHEMA](r_DROP_SCHEMA.md)。

REFERENCES   <a name="grant-references"></a>
授予创建外键约束的权限。您必须授予对被引用表和引用表的此权限；否则，用户将无法创建约束。

ALTER  <a name="grant-alter"></a>
根据数据库对象，向用户或用户组授予以下权限：  
+ 对于表，ALTER 授予更改表或视图的权限。有关更多信息，请参阅 [ALTER TABLE](r_ALTER_TABLE.md)。
+ 对于数据库，ALTER 授予更改数据库的权限。有关更多信息，请参阅 [ALTER DATABASE](r_ALTER_DATABASE.md)。
+ 对于模式，ALTER 授予更改模式的权限。有关更多信息，请参阅 [ALTER SCHEMA](r_ALTER_SCHEMA.md)。
+ 对于外部表，ALTER 授予对为 Lake Formation 启用的 AWS Glue Data Catalog 中的表进行更改的权限。此权限仅在使用 Lake Formation 时适用。

TRUNCATE  <a name="grant-truncate"></a>
授予截断表的权限。如果没有此权限，则只有表的拥有者或超级用户才可以截断表。有关 TRUNCATE 命令的更多信息，请参阅 [TRUNCATE](r_TRUNCATE.md)。

ALL [ PRIVILEGES ]   <a name="grant-all"></a>
一次性向指定的用户或角色授予所有可用权限。PRIVILEGES 关键字是可选的。  
GRANT ALL ON SCHEMA 不会授予对外部架构的 CREATE 权限。  
您可以针对为 Lake Formation 启用的 AWS Glue Data Catalog 中的表授予 ALL 权限。在这种情况下，各个权限（如 SELECT、ALTER 等）将记录在 Data Catalog 中。  
 Amazon Redshift 不支持 RULE 和 TRIGGER 权限。有关更多信息，请转至 [不支持的 PostgreSQL 功能](c_unsupported-postgresql-features.md)。

ASSUMEROLE  <a name="assumerole"></a>
向具有指定角色的用户、角色或组授予运行 COPY、UNLOAD、EXTERNAL FUNCTION 和 CREATE MODEL 命令的权限。用户、角色或组在运行指定的命令时代入该角色。要开始使用 ASSUMEROLE 权限，请参阅[有关授予 ASSUMEROLE 权限的使用说明](r_GRANT-usage-notes.md#r_GRANT-usage-notes-assumerole)。

ON [ TABLE ] *table\$1name*   <a name="grant-on-table"></a>
授予对表或视图的指定权限。TABLE 关键字是可选的。您可以在一个语句中列出多个表和视图。

ON ALL TABLES IN SCHEMA *schema\$1name*   <a name="grant-all-tables"></a>
授予对被引用架构中的所有表和视图的指定权限。

( *column\$1name* [,...] ) ON TABLE *table\$1name*   <a name="grant-column-level-privileges"></a>
向用户、组或 PUBLIC 授予对 Amazon Redshift 表或视图的指定列的指定权限。

( *column\$1list* ) ON EXTERNAL TABLE *schema\$1name.table\$1name*   <a name="grant-external-table-column"></a>
向 IAM 角色授予对引用架构中 Lake Formation 表的指定列的指定权限。

ON EXTERNAL TABLE *schema\$1name.table\$1name*   <a name="grant-external-table"></a>
向 IAM 角色授予对引用架构中指定 Lake Formation 表的指定权限。

ON EXTERNAL SCHEMA *schema\$1name*   <a name="grant-external-schema"></a>
向 IAM 角色授予对引用架构的指定权限。

ON *iam\$1role*   <a name="grant-iam_role"></a>
向 IAM 角色授予指定权限。

TO *username*   <a name="grant-to"></a>
指示接收权限的用户。

TO IAM\$1ROLE *iam\$1role*   <a name="grant-to-iam-role"></a>
指示接收权限的 IAM 角色。

WITH GRANT OPTION   <a name="grant-with-grant"></a>
指示接收权限的用户随之可以将相同的权限授予其他用户。您无法将 WITH GRANT OPTION 授予组或 PUBLIC。

ROLE *role\$1name*   <a name="grant-role"></a>
将权限授予角色。

GROUP *group\$1name*   <a name="grant-group"></a>
将权限授予用户组。可以是逗号分隔的列表，用于指定多个用户组。

PUBLIC   <a name="grant-public"></a>
向所有用户授予指定的权限，包括以后创建的用户。PUBLIC 表示一个始终包含所有用户的组。单个用户的权限包含向 PUBLIC 授予的权限、向用户所属的所有组授予的权限以及向用户单独授予的任何权限。  
将 PUBLIC 授予 Lake Formation EXTERNAL TABLE 会将权限授予 Lake Formation *所有人*组。

CONNECT [ON WORKGROUP] TO \$1 [USER] <prefix>:<username> \$1 ROLE <prefix>:<rolename> \$1 PUBLIC \$1  
向 AWS IAM Identity Center 联合用户或组授予连接到工作组或集群的权限。该前缀标识身份提供者。在将权限授予 PUBLIC 后，该权限将适用于所有 AWS IAM Identity Center 联合用户，包括以后创建的用户。只有在工作组或集群上启用了 Amazon Redshift 联合身份验证权限时，此权限才适用。

CREATE   <a name="grant-create"></a>
根据数据库对象，向用户或用户组授予以下权限：  
+ 对于数据库，CREATE 允许用户在数据库中创建 schemas。
+ 对于 schema，CREATE 允许用户在 schema 中创建对象。要重命名对象，用户必须具有 CREATE 权限并拥有要重命名的对象。
+ Amazon Redshift Spectrum 外部 schema 不支持 CREATE ON SCHEMA。要授予在外部 schema 中使用外部表的权限，请向需要访问权限的用户授予 USAGE ON SCHEMA。仅允许外部 schema 的所有者或超级用户在外部 schema 中创建外部表。要移交外部 schema 的所有权，请使用 [ALTER SCHEMA](r_ALTER_SCHEMA.md) 更改所有者。

TEMPORARY \$1 TEMP   <a name="grant-temporary"></a>
授予在指定的数据库中创建临时表的权限。要运行 Amazon Redshift Spectrum 查询，数据库用户必须有权在数据库中创建临时表。  
默认情况下，向用户授予权限以通过其在 PUBLIC 组中自动获得的成员资格来创建临时表。要删除任何用户创建临时表的权限，请撤销 PUBLIC 组的 TEMP 权限。然后，明确授予特定用户或用户组创建临时表的权限。

ON DATABASE *db\$1name*   <a name="grant-database"></a>
授予对数据库的指定权限。

USAGE   <a name="grant-usage"></a>
授予对特定架构的 USAGE 权限，这将使用户能够访问该架构中的对象。必须单独为本地 Amazon Redshift 架构授予对这些对象执行特定操作的权限（例如，对表的 SELECT 或 UPDATE 权限）。默认情况下，所有用户都对 PUBLIC 架构具有 CREATE 和 USAGE 权限。  
 使用 ON SCHEMA 语法向外部 Schema 授予 USAGE 权限时，无需单独授予对外部 Schema 中对象的操作。相应的目录权限控制对外部 Schema 对象的细粒度权限。

ON SCHEMA *schema\$1name*   <a name="grant-schema"></a>
授予对数据库的指定权限。  
Amazon Redshift Spectrum 外部架构不支持 GRANT ALL ON SCHEMA 中的 GRANT CREATE ON SCHEMA 和 CREATE 权限。要授予在外部 schema 中使用外部表的权限，请向需要访问权限的用户授予 USAGE ON SCHEMA。仅允许外部 schema 的所有者或超级用户在外部 schema 中创建外部表。要移交外部 schema 的所有权，请使用 [ALTER SCHEMA](r_ALTER_SCHEMA.md) 更改所有者。

EXECUTE ON ALL FUNCTIONS IN SCHEMA *schema\$1name*  <a name="grant-all-functions"></a>
授予对被引用架构中的所有函数的指定权限。  
对于在 pg\$1catalog 命名空间中定义的 pg\$1proc 内置条目，Amazon Redshift 不支持 GRANT 或 REVOKE 语句。

EXECUTE ON PROCEDURE *procedure\$1name*   <a name="grant-procedure"></a>
授予对特定存储过程的 EXECUTE 权限。由于存储过程名称可重载，因此您必须包含过程的参数列表。有关更多信息，请参阅 [命名存储过程](stored-procedure-naming.md)。

EXECUTE ON ALL PROCEDURES IN SCHEMA *schema\$1name*  <a name="grant-all-procedures"></a>
授予对被引用架构中所有存储过程的指定权限。

USAGE ON LANGUAGE *language\$1name*   
授予对某种语言的 USAGE 权限。  
从 2025 年 11 月 1 日起，Amazon Redshift 将不再支持创建新的 Python UDF。现有的 Python UDF 将继续正常运行至 2026 年 6 月 30 日。从 2026 年 7 月 1 日起，Amazon Redshift 将不再支持 Python UDF。我们建议您在 2025 年 11 月 1 日之前，将现有 Python UDF 迁移到 Lambda UDF。有关创建和使用 Lambda UDF 的信息，请参阅[标量 Lambda UDF](udf-creating-a-lambda-sql-udf.md)。有关将现有 Python UDF 转换为 Lambda UDF 的信息，请参阅[博客文章](https://aws.amazon.com/blogs/big-data/amazon-redshift-python-user-defined-functions-will-reach-end-of-support-after-june-30-2026/)。
需要 USAGE ON LANGUAGE 权限才能运行 [CREATE FUNCTION](r_CREATE_FUNCTION.md) 命令来创建用户定义函数 (UDF)。有关更多信息，请参阅 [UDF 安全性和权限](udf-security-and-privileges.md)。  
需要 USAGE ON LANGUAGE 权限才能通过运行 [CREATE PROCEDURE](r_CREATE_PROCEDURE.md) 命令来创建存储过程。有关更多信息，请参阅 [存储过程的安全性和权限](stored-procedure-security-and-privileges.md)。  
对于 Python UDF，使用 `plpythonu`。对于 SQL UDF，使用 `sql`。对于存储过程，请使用 `plpgsql`。

ON COPY JOB *job\$1name*  <a name="on-copy-job"></a>
授予对复制作业的指定权限。

FOR \$1 ALL \$1 COPY \$1 UNLOAD \$1 EXTERNAL FUNCTION \$1 CREATE MODEL \$1 [, ...]   <a name="grant-for"></a>
指定被授予权限的 SQL 命令。您可以指定 ALL 以授予对 COPY、UNLOAD、EXTERNAL FUNCTION 和 CREATE MODEL 语句的权限。此子句仅适用于授予 ASSUMEROLE 权限。

ALTER  
向用户授予 ALTER 权限，以便将对象添加到数据共享中或从中删除，或设置属性 PUBLICACCESSIBLE。有关更多信息，请参阅 [ALTER DATASHARE](r_ALTER_DATASHARE.md)。

SHARE  
向用户和用户组授予将数据使用者添加到数据共享的权限。要使特定使用者（账户或命名空间）能够从其集群访问数据共享，需要此权限。使用者可以相同或不同的 AWS 账户，集群命名空间与全局唯一标识符 (GUID) 指定的集群命名空间相同或不同。

ON DATASHARE *datashare\$1name*   <a name="grant-datashare"></a>
授予对被引用数据共享的指定权限。有关使用者访问控制粒度的信息，请参阅 [Amazon Redshift 中不同级别的数据共享](datashare-overview.md#granularity)。

USAGE  
将 USAGE 授予同一账户中的使用者账户或命名空间时，该账户中的特定使用者账户或命名空间可以以只读方式访问数据共享和数据共享的对象。

TO NAMESPACE 'clusternamespace GUID'  
指示同一账户中的一个命名空间，使用者可以在其中接收对数据共享的指定权限。命名空间使用 128 位的字符数字 GUID。

TO ACCOUNT 'accountnumber' [ VIA DATA CATALOG ]  
指示使用者可以在其中接收对数据共享的指定权限的另一个账号。指定‘VIA DATA CATALOG’表示向 Lake Formation 账户授予使用数据共享的权限。省略此参数意味着您向拥有该集群的账户授予使用权限。

ON DATABASE *shared\$1database\$1name> [, ...]*   <a name="grant-datashare"></a>
授予对在指定数据共享中创建的指定数据库的指定使用权限。

ON SCHEMA* shared\$1schema*   <a name="grant-datashare"></a>
授予对在指定数据共享中创建的指定架构的指定权限。

FOR \$1 SCHEMAS \$1 TABLES \$1 FUNCTIONS \$1 PROCEDURES \$1 LANGUAGES \$1 COPY JOBS\$1 IN   
指定要向其授予权限的数据库对象。IN 后面的参数定义了所授予权限的范围。

CREATE MODEL  
向特定用户或用户组授予 CREATE MODEL 权限。

ON MODEL *model\$1name*  
授予对特定模型的 EXECUTE 权限。

ACCESS CATALOG  
授予查看该角色可访问对象的相关元数据的权限。

\$1 role \$1 [, ...]  
要向其他角色、用户或 PUBLIC 授予的角色。  
PUBLIC 表示一个始终包含所有用户的组。单个用户的权限包含向 PUBLIC 授予的权限、向用户所属的所有组授予的权限以及向用户单独授予的任何权限。

TO \$1 \$1 *user\$1name* [ WITH ADMIN OPTION ] \$1 \$1 role \$1[, ...]  
将指定角色授予具有 WITH ADMIN OPTION 权限的指定用户、其他角色或 PUBLIC。  
WITH ADMIN OPTION 条件句会向所有被授予者提供所有授予的角色的管理选项。

EXPLAIN \$1 RLS \$1 MASKING \$1 TO ROLE *rolename*  
向角色授予解释 EXPLAIN 计划中查询的安全性策略筛选条件的权限。RLS 授予解释行级安全性策略筛选条件的权限。MASKING 授予解释动态数据掩蔽策略筛选条件的权限。

IGNORE RLS TO ROLE *rolename*   
向角色授予绕开某个查询的行级别安全性策略的权限。

TO \$1 RLS \$1 MASKING \$1 POLICY *policy\$1name*  
指示接收权限的安全性策略。TO RLS POLICY 表示行级安全性策略。TO MASKING POLICY 表示动态数据掩蔽策略。

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

要了解有关 GRANT 使用说明的更多信息，请参阅[使用说明](r_GRANT-usage-notes.md)。

## 示例
<a name="r_GRANT-examples-link"></a>

有关如何使用 GRANT 的示例，请参阅[示例](r_GRANT-examples.md)。

# 使用说明
<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'
);
```

# 示例
<a name="r_GRANT-examples"></a>

 以下示例向用户 `fred` 授予对 SALES 表的 SELECT 权限。

```
grant select on table sales to fred;
```

以下示例向用户 `fred` 授予对 QA\$1TICKIT schema 中所有表的 SELECT 权限。

```
grant select on all tables in schema qa_tickit to fred;
```

以下示例向用户组 QA\$1USERS 授予对 schema QA\$1TICKIT 的全部 schema 权限。Schema 权限包括 CREATE 和 USAGE。USAGE 向用户授予访问 schema 中对象的权限，但不授予对这些对象的 INSERT 或 SELECT 之类的权限。单独授予对每个对象的权限。

```
create group qa_users;
grant all on schema qa_tickit to group qa_users;
```

以下示例向组 QA\$1USERS 中的所有用户授予对 QA\$1TICKIT schema 中的 SALES 表的所有权限。

```
grant all on table qa_tickit.sales to group qa_users;
```

以下示例向组 QA\$1USERS 和 RO\$1USERS 中的所有用户授予对 QA\$1TICKIT 架构中的 SALES 表的所有权限。

```
grant all on table qa_tickit.sales to group qa_users, group ro_users;
```

以下示例向组 QA\$1USERS 中的所有用户授予对 QA\$1TICKIT schema 中的 SALES 表的 DROP 权限。

```
grant drop on table qa_tickit.sales to group qa_users;>
```

以下命令序列说明，具有对 schema 的访问权限并不表示授予对 schema 中的表的权限。

```
create user schema_user in group qa_users password 'Abcd1234';
create schema qa_tickit;
create table qa_tickit.test (col1 int);
grant all on schema qa_tickit to schema_user;

set session authorization schema_user;
select current_user;


current_user
--------------
schema_user
(1 row)


select count(*) from qa_tickit.test;


ERROR: permission denied for relation test [SQL State=42501]


set session authorization dw_user;
grant select on table qa_tickit.test to schema_user;
set session authorization schema_user;
select count(*) from qa_tickit.test;


count
-------
0
(1 row)
```

以下命令序列说明，具有对视图的访问权限并不意味着具有对基础表的访问权限。虽然名为 VIEW\$1USER 的用户已被授予 VIEW\$1DATE 的所有权限，但该用户无法从 DATE 表中选择数据。

```
create user view_user password 'Abcd1234';
create view view_date as select * from date;
grant all on view_date to view_user;
set session authorization view_user;
select current_user;


current_user
--------------
view_user
(1 row)


select count(*) from view_date;


count
-------
365
(1 row)


select count(*) from date;


ERROR:  permission denied for relation date
```

以下示例向用户 `cust_name` 授予对 `cust_phone` 表的 `cust_profile` 和 `user1` 列的 SELECT 权限。

```
grant select(cust_name, cust_phone) on cust_profile to user1;
```

以下示例向 `cust_name` 组授予对 `cust_phone` 和 `cust_contact_preference` 列的 SELECT 权限，并授予对 `cust_profile` 表的 `sales_group` 列的 UPDATE 权限。

```
grant select(cust_name, cust_phone), update(cust_contact_preference) on cust_profile to group sales_group;
```

下面的示例演示如何使用 ALL 关键字向 `cust_profile` 组授予对 `sales_admin` 表的三列的 SELECT 和 UPDATE 权限。

```
grant ALL(cust_name, cust_phone,cust_contact_preference) on cust_profile to group sales_admin;
```

以下示例向用户 `cust_name` 授予对 `cust_profile_vw` 视图的 `user2` 列的 SELECT 权限。

```
grant select(cust_name) on cust_profile_vw to user2;
```

## 授予数据共享访问权限的示例
<a name="r_GRANT-examples-datashare"></a>

以下示例显示了 GRANT 数据共享对特定数据库或基于数据共享创建的 schema 的使用权限。

在以下示例中，生产者端管理员向指定命名空间授予对 `salesshare` 数据共享的 USAGE 权限。

```
GRANT USAGE ON DATASHARE salesshare TO NAMESPACE '13b8833d-17c6-4f16-8fe4-1a018f5ed00d';
```

在以下示例中，使用者端管理员向 `Bob` 授予对 `sales_db` 的 USAGE 权限。

```
GRANT USAGE ON DATABASE sales_db TO Bob;
```

在以下示例中，使用者端管理员向 `Analyst_role` 角色授予对 `sales_schema` 架构的 GRANT USAGE 权限。`sales_schema` 是一个指向 sales\$1db 的外部架构。

```
GRANT USAGE ON SCHEMA sales_schema TO ROLE Analyst_role;
```

此时，`Bob` 和 `Analyst_role` 可以访问 `sales_schema` 和 `sales_db` 中的所有数据库对象。

以下示例显示了对共享数据库中的对象授予额外的对象级权限。只有在用于创建共享数据库的 CREATE DATABASE 命令使用了 WITH PERMISSIONS 子句时，才需要这些额外的权限。如果 CREATE DATABASE 命令未使用 WITH PERMISSIONS，则在共享数据库上授予 USAGE 权限将授予对该数据库中所有对象的完全访问权限。

```
GRANT SELECT ON sales_db.sales_schema.tickit_sales_redshift to Bob;
```

## 授予限定范围权限的示例
<a name="r_GRANT-examples-scoped"></a>

以下示例将 `Sales_db` 数据库中所有当前和将来架构的使用权限授予给 `Sales` 角色。

```
GRANT USAGE FOR SCHEMAS IN DATABASE Sales_db TO ROLE Sales;
```

以下示例向用户 `alice` 授予对 `Sales_db` 数据库中所有当前和未来表的 SELECT 权限，同时还向 `alice` 授予权限以向其他用户授予对 `Sales_db` 中表的限定范围权限。

```
GRANT SELECT FOR TABLES IN DATABASE Sales_db TO alice WITH GRANT OPTION;
```

以下示例向用户 `bob` 授予对 `Sales_schema` 架构中函数的 EXECUTE 权限。

```
GRANT EXECUTE FOR FUNCTIONS IN SCHEMA Sales_schema TO bob;
```

以下示例向 `Sales` 角色授予对 `ShareDb` 数据库 `ShareSchema` 架构中所有表的所有权限。指定架构时，您可以使用由两部分组成的格式 `database.schema` 指定架构的数据库。

```
GRANT ALL FOR TABLES IN SCHEMA ShareDb.ShareSchema TO ROLE Sales;
```

下面的示例与前一个示例相同。您可以使用 `DATABASE` 关键字而不是使用由两部分组成的格式来指定数据库。

```
GRANT ALL FOR TABLES IN SCHEMA ShareSchema DATABASE ShareDb TO ROLE Sales;
```

## 授予 ASSUMEROLE 权限的示例
<a name="r_GRANT-examples-assumerole"></a>

下面是授予 ASSUMEROLE 权限的示例。

以下示例显示了 REVOKE 语句，超级用户可以在集群上运行一次该语句，以便为用户和组启用 ASSUMEROLE 权限。然后，超级用户向用户和组授予相应命令的 ASSUMEROLE 权限。有关为用户和组启用 ASSUMEROLE 权限的信息，请参阅[有关授予 ASSUMEROLE 权限的使用说明](r_GRANT-usage-notes.md#r_GRANT-usage-notes-assumerole)。

```
revoke assumerole on all from public for all;
```

以下示例向用户 `reg_user1` 授予 IAM 角色 `Redshift-S3-Read` 的 ASSUMEROLE 权限来执行 COPY 操作。

```
grant assumerole on 'arn:aws:iam::123456789012:role/Redshift-S3-Read'
to reg_user1 for copy;
```

以下示例向用户 `reg_user1` 授予 IAM 角色链 `RoleA`、`RoleB` 的 ASSUMEROLE 权限来执行 UNLOAD 操作。

```
grant assumerole
on 'arn:aws:iam::123456789012:role/RoleA,arn:aws:iam::210987654321:role/RoleB'
to reg_user1
for unload;
```

以下是使用 IAM 角色链 `RoleA`、`RoleB` 执行 UNLOAD 命令的示例。

```
unload ('select * from venue limit 10')
to 's3://companyb/redshift/venue_pipe_'
iam_role 'arn:aws:iam::123456789012:role/RoleA,arn:aws:iam::210987654321:role/RoleB';
```

以下示例向用户 `reg_user1` 授予 IAM 角色 `Redshift-Exfunc` 的 ASSUMEROLE 权限来创建外部函数。

```
grant assumerole on 'arn:aws:iam::123456789012:role/Redshift-Exfunc'
to reg_user1 for external function;
```

以下示例向用户 `reg_user1` 授予 IAM 角色 `Redshift-model` 的 ASSUMEROLE 权限来创建机器学习模型。

```
grant assumerole on 'arn:aws:iam::123456789012:role/Redshift-ML'
to reg_user1 for create model;
```

## 授予 ROLE 权限的示例
<a name="r_GRANT-examples-role"></a>

下面的示例将向 user1 授予 sample\$1role1。

```
CREATE ROLE sample_role1;
GRANT ROLE sample_role1 TO user1;
```

以下示例使用 WITH ADMIN OPTION 将 sample\$1role1 授予 user1，为用户 1 设置当前会话，而 user1 将 sample\$1role1 授予 user2。

```
GRANT ROLE sample_role1 TO user1 WITH ADMIN OPTION;
SET SESSION AUTHORIZATION user1;
GRANT ROLE sample_role1 TO user2;
```

下面的示例将向 sample\$1role2 授予 sample\$1role1。

```
GRANT ROLE sample_role1 TO ROLE sample_role2;
```

下面的示例将向 sample\$1role3 和 sample\$1role4 授予 sample\$1role2。然后尝试将 sample\$1role3 授予 sample\$1role1。

```
GRANT ROLE sample_role2 TO ROLE sample_role3;
GRANT ROLE sample_role3 TO ROLE sample_role2;
ERROR: cannot grant this role, a circular dependency was detected between these roles
```

下面的示例将向 sample\$1role1 授予 CREATE USER 系统权限。

```
GRANT CREATE USER TO ROLE sample_role1;
```

下面的示例将向 user1 授予系统定义角色 `sys:dba`。

```
GRANT ROLE sys:dba TO user1;
```

下面的示例尝试将循环依赖关系中的 sample\$1role3 授予 sample\$1role2。

```
CREATE ROLE sample_role3;
GRANT ROLE sample_role2 TO ROLE sample_role3;
GRANT ROLE sample_role3 TO ROLE sample_role2; -- fail
ERROR:  cannot grant this role, a circular dependency was detected between these roles
```