

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

# CREATE USER
<a name="r_CREATE_USER"></a>

创建新的数据库用户。数据库用户可以根据他们的权限和角色，在数据库中检索数据、运行命令和执行其他操作。您必须是数据库超级用户才能执行此命令。

## 所需的权限
<a name="r_CREATE_USER-privileges"></a>

以下是 CREATE USER 所需的权限：
+ Superuser
+ 具有 CREATE USER 权限的用户

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

```
CREATE USER name [ WITH ]
PASSWORD { 'password' | 'md5hash' | 'sha256hash' | DISABLE }
[ option [ ... ] ]

where option can be:

CREATEDB | NOCREATEDB
| CREATEUSER | NOCREATEUSER
| SYSLOG ACCESS { RESTRICTED | UNRESTRICTED }
| IN GROUP groupname [, ... ]
| VALID UNTIL 'abstime'
| CONNECTION LIMIT { limit | UNLIMITED }
| SESSION TIMEOUT limit
| EXTERNALID external_id
```

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

 *name*   
要创建的用户的名称。用户名称不能为 `PUBLIC`。有关有效名称的更多信息，请参阅[名称和标识符](r_names.md)。

WITH  
可选关键字。Amazon Redshift 将会忽略 WITH

PASSWORD \$1 '*password*' \$1 '*md5hash*' \$1 '*sha256hash*' \$1 DISABLE \$1  
设置用户的密码。  
默认情况下，用户可以更改自己的密码，除非密码被禁用。要禁用用户的密码，请指定 DISABLE。禁用某个用户的密码后，将从系统中删除该密码，而此用户只能使用临时 Amazon Identity and Access Management (IAM) 用户凭证进行登录。有关更多信息，请参阅[使用 IAM 身份验证生成数据库用户凭证](https://docs.amazonaws.cn/redshift/latest/mgmt/generating-user-credentials.html)。只有超级用户才能启用或禁用密码。您不能禁用超级用户的密码。要启用密码，请运行 [ALTER USER](r_ALTER_USER.md) 并指定密码。  
您可采用明文、MD5 哈希字符串或 SHA256 哈希字符串的形式指定密码。  
 使用 Amazon Web Services 管理控制台、Amazon CLI 或 Amazon Redshift API 启动新集群时，必须为初始数据库用户提供一个明文密码。您稍后可以使用 [ALTER USER](r_ALTER_USER.md) 更改密码。
对于明文，密码必须遵循以下约束：  
+ 它的长度必须介于 8 到 64 个字符之间。
+ 它必须包含至少一个大写字母、一个小写字母和一个数字。
+ 它可以使用带有 ASCII 代码 33–126 的任何 ASCII 字符，但 '（单引号）、"（双引号）、\$1、/ 或 @ 除外。
作为以明文形式传递 CREATE USER 密码参数的更安全的替代方法，您可以指定包含密码和用户名的 MD5 哈希。  
当您指定 MD5 哈希字符串时，CREATE USER 命令将检查是否存在有效的 MD5 哈希字符串，但它不会验证字符串的密码部分。在这种情况下，可以创建无法用于登录数据库的密码（如空字符串）。
要指定 MD5 密码，请执行以下步骤：  

1. 联接密码和用户名。

   例如，对于密码 `ez` 和用户 `user1`，联接后的字符串为 `ezuser1`。

1. 将联接后的字符串转换为 32 字符 MD5 哈希字符串。您可以使用任何 MD5 实用工具创建哈希字符串。以下示例使用 Amazon Redshift [MD5 函数](r_MD5.md) 和联接运算符 (\$1\$1) 返回 32 字符的 MD5 哈希字符串。

   ```
   select md5('ez' || 'user1');
                           
   md5
   --------------------------------
   153c434b4b77c89e6b94f12c5393af5b
   ```

1. 在 MD5 哈希字符串前面联接“`md5`”并提供联接后的字符串作为 *md5hash* 参数。

   ```
   create user user1 password 'md5153c434b4b77c89e6b94f12c5393af5b';
   ```

1. 使用登录凭证登录数据库。

   对于此示例，请使用密码 `user1` 以 `ez` 的身份登录。
还有一种安全的替代方法，即指定密码字符串的 SHA-256 哈希值；您也可以提供自己的有效 SHA-256 摘要和用于创建摘要的 256 位加密盐。  
+ 摘要 – 哈希函数的输出。
+ 加密盐 – 随机生成的与密码相结合使用的数据，帮助减少哈希函数输出中的模式。

```
'sha256|Mypassword'
```

```
'sha256|digest|256-bit-salt'
```
在以下示例中，Amazon Redshift 生成并管理加密盐。  

```
CREATE USER admin PASSWORD 'sha256|Mypassword1';
```
在以下示例中，提供了有效的 SHA-256 摘要和用于创建摘要的 256 位加密盐。  
要指定密码并使用您自己的加密盐对其进行哈希处理，请按照以下步骤操作：  

1. 创建 256 位加密盐。您可以通过使用任何十六进制字符串生成器生成长度为 64 个字符的字符串来获取加密盐。在本例中，加密盐为 `c721bff5d9042cf541ff7b9d48fa8a6e545c19a763e3710151f9513038b0f6c6`。

1.  使用 FROM\$1HEX 函数将您的加密盐转换为二进制。这是因为 SHA2 函数需要加密盐的二进制表示。查看以下语句。

   ```
   SELECT FROM_HEX('c721bff5d9042cf541ff7b9d48fa8a6e545c19a763e3710151f9513038b0f6c6');
   ```

1.  使用 CONCAT 函数将加密盐附加到密码。在本示例中，密码为 `Mypassword1`。查看以下语句。

   ```
   SELECT CONCAT('Mypassword1',FROM_HEX('c721bff5d9042cf541ff7b9d48fa8a6e545c19a763e3710151f9513038b0f6c6'));
   ```

1. 使用 SHA2 函数根据您的密码和加密盐组合创建摘要。查看以下语句。

   ```
   SELECT SHA2(CONCAT('Mypassword1',FROM_HEX('c721bff5d9042cf541ff7b9d48fa8a6e545c19a763e3710151f9513038b0f6c6')), 0);
   ```

1.  使用前面步骤中的摘要和加密盐来创建用户。查看以下语句。

   ```
   CREATE USER admin PASSWORD 'sha256|821708135fcc42eb3afda85286dee0ed15c2c461d000291609f77eb113073ec2|c721bff5d9042cf541ff7b9d48fa8a6e545c19a763e3710151f9513038b0f6c6';
   ```

1. 使用登录凭证登录数据库。

    对于此示例，请使用密码 `admin` 以 `Mypassword1` 的身份登录。
如果在未指定哈希函数的情况下设置纯文本形式的密码，则会将用户名用作加密盐生成 MD5 摘要。

CREATEDB \$1 NOCREATEDB   
CREATEDB 选项允许新用户创建数据库。默认值为 NOCREATEDB。

CREATEUSER \$1 NOCREATEUSER   
使用 CREATEUSER 选项可以创建具备所有数据库权限的超级用户，包括 CREATE USER。默认值为 NOCREATEUSER。有关更多信息，请参阅 [超级用户](r_superusers.md)。

SYSLOG ACCESS \$1 RESTRICTED \$1 UNRESTRICTED \$1  <a name="create-user-syslog-access"></a>
一个子句，它指定用户必须对 Amazon Redshift 系统表和视图具有的访问级别。  
拥有 SYSLOG ACCESS RESTRICTED 权限的普通用户在用户可见的系统表和视图中只能查看该用户生成的行。默认值为 RESTRICTED。  
拥有 SYSLOG ACCESS UNRESTRICTED 权限的普通用户可以查看用户可见的系统表和视图中的所有行，包括其他用户生成的行。UNRESTRICTED 不向普通用户授予对超级用户可见的表的访问权限。只有超级用户可以查看超级用户可见的表。  
如果向用户授予对系统表的无限制访问权限，用户便可以看到由其他用户生成的数据。例如，STL\$1QUERY 和 STL\$1QUERYTEXT 包含 INSERT、UPDATE 和 DELETE 语句的完整文本（其中可能包含敏感的用户生成数据）。
SVV\$1TRANSACTIONS 中的所有行都对所有用户可见。  
有关更多信息，请参阅 [系统表和视图中的数据可见性](cm_chap_system-tables.md#c_visibility-of-data)。

IN GROUP *groupname*   
指定用户所属的现有组的名称。可列出多个组名。

VALID UNTIL *abstime*   
VALID UNTIL 选项设置一个绝对时间，用户的密码在该时间后将不再有效。默认情况下，密码没有时间限制。

CONNECTION LIMIT \$1 *limit* \$1 UNLIMITED \$1   
允许用户同时打开的数据库连接的最大数量。此限制不适用于超级用户。使用 UNLIMITED 关键字设置允许的并行连接的最大数量。对每个数据库的连接数量可能也会施加限制。有关更多信息，请参阅 [CREATE DATABASE](r_CREATE_DATABASE.md)。默认为 UNLIMITED。要查看当前连接，请查询 [STV\$1SESSIONS](r_STV_SESSIONS.md) 系统视图。  
如果用户及数据库连接限制均适用，当用户尝试连接时，必须有一个同时低于这两个限制的未使用的连接槽可用。

SESSION TIMEOUT *limit*  
会话保持非活动或空闲状态的最长时间（秒）。范围在 60 秒（1 分钟）到 1,728,000 秒（20 天）之间。如果没有为用户设置会话超时，则应用集群设置。有关更多信息，请参阅《Amazon Redshift 管理指南》**中的 [Amazon Redshift 中的配额和限制](https://docs.amazonaws.cn/redshift/latest/mgmt/amazon-redshift-limits.html)。  
设置会话超时时，它仅应用于新会话。  
要查看有关活动用户会话的信息，包括开始时间、用户名和会话超时，请查询 [STV\$1SESSIONS](r_STV_SESSIONS.md) 系统视图。要查看有关用户会话历史记录的信息，请查询 [STL\$1SESSIONS](r_STL_SESSIONS.md) 视图。要检索有关数据库用户的信息（包括会话超时值），请查询 [SVL\$1USER\$1INFO](r_SVL_USER_INFO.md) 视图。

EXTERNALID *external\$1id*  
用户的标识符，与身份提供者关联。用户必须已禁用密码。有关更多信息，请参阅 [Amazon Redshift 的原生身份提供者 (IdP) 联合身份验证](https://docs.amazonaws.cn/redshift/latest/mgmt/redshift-iam-access-control-native-idp.html)。

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

默认情况下，所有用户都对 PUBLIC schema 具有 CREATE 和 USAGE 权限。要禁止用户在数据库的 PUBLIC schema 中创建对象，请使用 REVOKE 命令删除该权限。

使用 IAM 身份验证创建数据库用户凭证时，您可能希望创建能够仅使用临时凭证登录的超级用户。您不能禁用超级用户的密码，但可以使用随机生成的 MD5 哈希字符串创建一个未知密码。

```
create user iam_superuser password 'md5A1234567890123456780123456789012' createuser;
```

无论 `enable_case_sensitive_identifier` 配置选项的设置如何，系统都会保留双引号括起来的 *username* 的大小写。有关更多信息，请参阅 [enable\$1case\$1sensitive\$1identifier](r_enable_case_sensitive_identifier.md)。

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

以下命令创建一个名为 dbuser 的用户，密码为“abcD1234”，具有数据库创建权限，连接限制为 30。

```
create user dbuser with password 'abcD1234' createdb connection limit 30;
```

 查询 PG\$1USER\$1INFO 目录表，查看有关数据库用户的详细信息。

```
select * from pg_user_info;
         
 usename   | usesysid | usecreatedb | usesuper | usecatupd | passwd   | valuntil | useconfig | useconnlimit
-----------+----------+-------------+----------+-----------+----------+----------+-----------+-------------
 rdsdb     |        1 | true        | true     | true      | ******** | infinity |           |
 adminuser |      100 | true        | true     | false     | ******** |          |           | UNLIMITED
 dbuser    |      102 | true        | false    | false     | ******** |          |           | 30
```

在以下示例中，账户密码在 2017 年 6 月 10 日前有效。

```
create user dbuser with password 'abcD1234' valid until '2017-06-10';
```

 以下示例创建一个具有包含特殊字符的区分大小写的密码的用户。

```
create user newman with password '@AbC4321!';
```

 要在 MD5 密码中使用一个反斜线（“\$1”），请在源字符串中用另一个反斜杠对该反斜杠进行转义。以下示例创建一个名为 `slashpass` 的用户并使用一个反斜杠（“`\`”）作为密码。

```
select md5('\\'||'slashpass');
         
md5
--------------------------------
0c983d1a624280812631c5389e60d48c
```

使用 md5 密码创建用户。

```
create user slashpass password 'md50c983d1a624280812631c5389e60d48c';
```

下面的示例创建了一个名为 `dbuser` 的用户，其空闲会话超时设置为 120 秒。

```
CREATE USER dbuser password 'abcD1234' SESSION TIMEOUT 120;
```

下面的示例创建了一个名为 `bob` 的用户。命名空间为 `myco_aad`。这只是一个示例。要成功运行该命令，您必须具有已注册的身份提供商。有关更多信息，请参阅 [Amazon Redshift 的原生身份提供者 (IdP) 联合身份验证](https://docs.amazonaws.cn/redshift/latest/mgmt/redshift-iam-access-control-native-idp.html)。

```
CREATE USER myco_aad:bob EXTERNALID "ABC123" PASSWORD DISABLE;
```