

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 使用以下命令连接到 Snowflake 数据仓库 AWS Schema Conversion Tool
<a name="CHAP_Source.Snowflake"></a>

您可以使用 AWS SCT 将架构、代码对象和应用程序代码从 Snowflake 转换为 Amazon Redshift。

## 将 Snowflake 用作源数据库的权限
<a name="CHAP_Source.Snowflake.Permissions"></a>

您可以使用 `SECURITYADMIN` 角色和 `SECURITYADMIN` 会话上下文创建具有权限的角色并向该角色授予用户名。

以下示例创建了最低权限并将其授予 `min_privs` 用户。

```
create role role_name;
grant role role_name to role sysadmin;
grant usage on database db_name to role role_name;
grant usage on schema db_name.schema_name to role role_name;             
grant usage on warehouse datawarehouse_name to role role_name;
grant monitor on database db_name to role role_name;
grant monitor on warehouse datawarehouse_name to role role_name;
grant select on all tables in schema db_name.schema_name to role role_name;
grant select on future tables in schema db_name.schema_name to role role_name;
grant select on all views in schema db_name.schema_name to role role_name;
grant select on future views in schema db_name.schema_name to role role_name;
grant select on all external tables in schema db_name.schema_name to role role_name;
grant select on future external tables in schema db_name.schema_name to role role_name;
grant usage on all sequences in schema db_name.schema_name to role role_name;
grant usage on future sequences in schema db_name.schema_name to role role_name;
grant usage on all functions in schema db_name.schema_name to role role_name;
grant usage on future functions in schema db_name.schema_name to role role_name;
grant usage on all procedures in schema db_name.schema_name to role role_name;
grant usage on future procedures in schema db_name.schema_name to role role_name;
create user min_privs password='real_user_password'  
DEFAULT_ROLE = role_name DEFAULT_WAREHOUSE = 'datawarehouse_name';
grant role role_name to user min_privs;
```

在上述示例中，替换以下占位符：
+ 将 *`role_name`* 替换为具有只读权限的角色名称。
+ 将 `db_name` 替换为源数据库的名称。
+ 将 `schema_name` 替换为源架构的名称。
+ 将 *`datawarehousename`* 替换为所需数据仓库的名称。
+ 将 `min_privs` 替换为具有最低权限的用户名。

`DEFAULT_ROLE` 和 `DEFAULT_WAREHOUSE` 参数是密钥敏感的。

## 配置对 Amazon S3 的安全访问权限
<a name="CHAP_Source.Snowflake.IAM"></a>

Amazon S3 存储桶的安全和访问权限管理策略允许 Snowflake 访问 S3 存储桶、从中读取数据并将数据写入存储桶。您可以使用 Snowflake `STORAGE INTEGRATION` 对象类型配置私有 Amazon S3 存储桶的安全访问权限。Snowflake 存储集成对象将身份验证责任委托给 Snowflake 身份和访问权限管理实体。

有关更多信息，请参阅 Snowflake 文档中的[配置 Snowflake 存储集成以访问 Amazon S3](https://docs.snowflake.com/en/user-guide/data-load-s3-config-storage-integration.html)。

## 连接到作为源的 Snowflake
<a name="CHAP_Source.Snowflake.Connecting"></a>

使用 AWS Schema Conversion Tool按照以下过程连接到源数据库。

**连接到 Snowflake 源数据库**

1. 在中 AWS Schema Conversion Tool，选择**添加来源**。

1. 选择 **Snowflake**，然后选择**下一步**。

   此时显示**添加源**对话框。

1. 对于**连接名称**，输入数据库的名称。 AWS SCT 会在左侧面板的树中显示此名称。

1. 使用来自的数据库凭据 AWS Secrets Manager 或手动输入：
   + 要使用 Secrets Manager 中的数据库凭证，请按照以下说明进行操作：

     1. 对于 **AWS 密钥**，输入密钥名称。

     1. 选择**填充**可使用 Secrets Manager 中的数据库凭证自动填写数据库连接对话框中的所有值。

     有关使用 Secrets Manager 中的数据库凭证的信息，请参阅[AWS Secrets Manager 在中配置 AWS Schema Conversion Tool](CHAP_UserInterface.SecretsManager.md)。
   + 要手动输入 Snowflake 源数据仓库连接信息，请按照以下说明进行操作：  
****    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/SchemaConversionTool/latest/userguide/CHAP_Source.Snowflake.html)

1. 选择 “**测试连接**” 以验证是否 AWS SCT 可以连接到您的源数据库。

1. 选择**连接**以连接到源数据库。

## Snowflake 作为源的限制
<a name="CHAP_Source.Snowflake.Limitations"></a>

以下是使用 Snowflake 作为来源时的限制： AWS SCT
+ 对象标识符在对象类型和父对象的上下文中必须是唯一的：  
**数据库**  
架构标识符在数据库中必须唯一。  
**架构**  
对象标识符（例如表和视图的标识符）在架构中必须是唯一的。  
**表格/视图**  
表中的列标识符必须唯一。
+ 大型和 xlarge 集群节点类型的最大表数为 9,900。8xlarge 集群节点类型的最大表数为 100,000。限制包括在查询处理或系统维护期间由用户定义或由 Amazon Redshift 创建的临时表。有关更多信息，请参阅 *Amazon Redshift 集群管理指南*中的 [Amazon Redshift 配额](https://docs.aws.amazon.com/redshift/latest/mgmt/amazon-redshift-limits.html)。
+ 对于存储过程，输入和输出参数的最大数量为 32。

## Snowflake 的源数据类型
<a name="CHAP_Source.Snowflake.DataTypes"></a>

接下来，您可以找到使用时支持的 Snowflake 源数据类型 AWS SCT 以及与 Amazon Redshift 目标的默认映射。


| Snowflake 数据类型 | Amazon Redshift 数据类型。 | 
| --- | --- | 
|  NUMBER  |  NUMERIC(38)  | 
|  NUMBER(p)  |  如果 p =< 4，则为 SMALLINT 如果 p => 5 且 =< 9，则为 INTEGER 如果 p => 10 且 =< 18，则为 BIGINT 如果 p => 19 则为 NUMERIC(p)   | 
|  NUMBER(p, 0)  |  如果 p =< 4，则为 SMALLINT 如果 p => 5 且 =< 9，则为 INTEGER 如果 p => 10 且 =< 18，则为 BIGINT 如果 p => 19 则为：NUMERIC(p,0)  | 
|  NUMBER(p, s)  |  如果 p => 1 且 =< 38，并且如果 s => 1 且 =< 37，那么 NUMERIC (p,s)   | 
|  FLOAT  | FLOAT | 
|  TEXT Unicode 字符最多 16,777,216 字节；每个字符最多 4 个字节。  |  VARCHAR(MAX)  | 
|  TEXT(p) Unicode 字符最多 65,535 字节；每个字符最多 4 个字节。  |  如果 p =< 65,535 那么，VARCHAR (p)  | 
|  TEXT(p) Unicode 字符最多 16,777,216 字节；每个字符最多 4 个字节。  |  如果 p => 65535 且 =< 16,777,216 则为 VARCHAR(MAX)  | 
|  BINARY 单字节字符最多 8,388,608 字节；每个字符 1 字节。  | VARCHAR(MAX) | 
|  BINARY(p) 单字节字符最多 65,535 字节；每个字符 1 字节。  | VARCHAR(p) | 
|  BINARY(p) 单字节字符最多 8,388,608 字节；每个字符 1 字节。  | VARCHAR(MAX) | 
|  BOOLEAN  | BOOLEAN | 
|  DATE  | DATE | 
|  TIME 介于 00:00:00 和 23:59:59.999999999 之间的时间值。  | VARCHAR(18) | 
|  TIME(f) 介于 00:00:00 和 23:59:59.9(f) 之间的时间值。  | VARCHAR(n) – 9 \$1 dt-attr-1 | 
|  TIMESTAMP\$1NTZ  | TIMESTAMP | 
|  TIMESTAMP\$1TZ  | TIMESTAMPTZ | 

## Snowflake 到 Amazon Redshift 的转换设置
<a name="CHAP_Source.Snowflake.ConversionSettings"></a>

**要编辑 Snowflake 到 Amazon Redshift 的转换设置，请在**中选择**设置 AWS SCT，然后选择转换设置。**从上方的列表中选择 Snowflake，然后选择 **Snowflake** — **Amazon Redshif** t。 AWS SCT 显示 Snowflake 到 Amazon Redshift 转换的所有可用设置。

中的 Snowflake 到 Amazon Redshift AWS SCT 的转换设置包括以下选项：
+ 限制转换后的代码中操作项的注释数量。

  对于在**转换后的代码中为所选严重性及更高的措施项添加注释**，请选择措施项的严重性。 AWS SCT 在转换后的代码中为选定严重性及更高的措施项添加注释。

  例如，要最大限度地减少转换后的代码中的注释数量，请选择**仅错误**。要在转换后的代码中包含所有操作项的注释，请选择**所有消息**。
+ 设置 AWS SCT 可以应用于您的目标 Amazon Redshift 集群的最大表数。

  对于**目标 Amazon Redshift 集群的最大表**数，请选择 AWS SCT 可以应用于您的 Amazon Redshift 集群的表数量。

  Amazon Redshift 具有限制了不同集群节点类型使用表数的配额。如果您选择 “**自动**”，则根据节点类型 AWS SCT 确定要应用于目标 Amazon Redshift 集群的表数量。或者，手动选择值。有关更多信息，请参阅《Amazon Redshift 管理指南》**中的 [Amazon Redshift 中的配额和限制](https://docs.aws.amazon.com/redshift/latest/mgmt/amazon-redshift-limits.html)。

  AWS SCT 转换您的所有源表，即使这超过了您的 Amazon Redshift 集群所能存储的容量。 AWS SCT 将转换后的代码存储在您的项目中，并且不会将其应用于目标数据库。如果应用转换后的代码时达到了 Amazon Redshift 集群的表配额，则 AWS SCT 会显示一条警告消息。此外，还要 AWS SCT 将表应用于您的目标 Amazon Redshift 集群，直到表的数量达到上限。
+ 对 Amazon Redshift 表列应用压缩。为此，请选择**使用压缩编码**。

  AWS SCT 使用默认 Amazon Redshift 算法自动为列分配压缩编码。有关更多信息，请参阅《Amazon Redshift 数据库开发人员指南》**中的[压缩编码](https://docs.aws.amazon.com/redshift/latest/dg/c_Compression_encodings.html)。

  默认情况下，Amazon Redshift 不对定义为排序键和分配键的列应用压缩。您可以更改此行为并对这些列进行压缩。为此，请选择**为 KEY 列使用压缩编码**。只有选择**使用压缩编码**选项时，才能选择此选项。

## Snowflake 到 Amazon Redshift 的转换优化设置
<a name="CHAP_Source.Snowflake.ConversionOptimizationSettings"></a>

**要编辑 Snowflake 到 Amazon Redshift 的转化优化设置，请在 AWS SCT中**选择 “**设置”，然后选择 “转化设置”。**从上方的列表中选择 **Snowflake**，然后选择 **Snowflake – Amazon Redshift**。在左侧窗格中，选择**优化策略**。 AWS SCT 显示 Snowflake 到 Amazon Redshift 转换的转化优化设置。

中的 Snowflake 到 Amazon Redshift AWS SCT 的转化优化设置包括以下选项：
+ 使用自动表优化。为此，请选择**使用 Amazon Redshift 自动调整表格**。

  自动表优化是 Amazon Redshift 中的一种自我调整过程，可自动优化表的设计。有关更多信息，请参阅《Amazon Redshift 数据库开发人员指南》**中的[使用自动表优化](https://docs.aws.amazon.com/redshift/latest/dg/t_Creating_tables.html)。

  要仅使用自动表优化，请在**初始键选择策略**中选择**无**。
+ 使用策略选择排序键和分配键。

  您可以使用 Amazon Redshift 元数据、统计信息或这两个选项选择排序键和分配键。对于**优化策略**选项卡上的**初始键选择策略**，请选择以下选项之一：
  + 使用元数据，忽略统计信息
  + 忽略元数据，使用统计信息
  + 使用元数据和统计信息

  根据您选择的选项，您可以选择优化策略。然后，请为每种策略输入值（0–100）。这些值定义了每种策略的权重。 AWS SCT 使用这些权重值定义每条规则如何影响分布键和排序键的选择。默认值基于 AWS 迁移最佳实践。

  您可以为**查找小型表**策略定义小型表的大小。在 “**最小表格行数**” 和 “**最大表格行数**” 中，输入表格中最小和最大行数以将其定义为小表。 AWS SCT 将`ALL`分配方式应用于小表。在这种情况下，向每个节点分配整个表的副本。
+ 配置策略详细信息。

  除了定义每种优化策略的权重外，您还可以配置优化设置。为此，请选择**转换优化**。
  + 对于**排序键列数限制**，在排序键中输入最大列数。
  + 在**倾斜阈值**中，输入列偏斜值的百分比 (0—100)。 AWS SCT 从分布键的候选列表中排除倾斜值大于阈值的列。 AWS SCT 将列的偏斜值定义为最常见值的出现次数与记录总数的百分比比率。
  + 对于**查询历史表中的前 N 个查询**，请输入要分析的最常用查询的数量（1–100）。
  + 在**选择统计数据用户**中，选择要分析查询统计数据的数据库用户。

  此外，在**优化策略**选项卡上，您可以为**查找小型表**策略定义小型表的大小。在 “**最小表格行数**” 和 “**最大表格行数**” 中，输入表格中最小和最大行数，将其视为一个小表。 AWS SCT 将`ALL`分配方式应用于小表。在这种情况下，向每个节点分配整个表的副本。