

 从补丁 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-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
```