

 Amazon Redshift 將不再支援從修補程式 198 開始建立新的 Python UDFs。現有 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/)。

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 使用 Amazon Redshift 中的聯合查詢來查詢資料
<a name="federated-overview"></a>

透過在 Amazon Redshift 中使用*聯合查詢*，您可以跨操作資料庫、資料倉儲和資料湖查詢和分析資料。使用聯合查詢功能，您可以在外部資料庫的即時資料上將來自 Amazon Redshift 的查詢與跨 Amazon Redshift 和 Amazon S3 環境的查詢整合在一起。聯合查詢可以使用 Amazon RDS for PostgreSQL、Amazon Aurora PostgreSQL 相容版本、Amazon RDS for MySQL 和 Amazon Aurora MySQL 相容版本中的外部資料庫。

您可以使用聯合查詢，將即時資料整合為商業智慧 (BI) 和報告應用程式的一部分。例如，若要讓資料擷取至 Amazon Redshift 更容易，您可以使用聯合查詢來執行下列動作：
+ 直接查詢操作資料庫。
+ 快速套用變換。
+ 將資料載入到目標資料表，而不需要複雜的擷取、轉換、載入 (ETL) 管道。

為了減少透過網路的資料移動並改善效能，Amazon Redshift 會將聯合查詢的部分計算直接分配到遠端操作資料庫。Amazon Redshift 也會視需要使用其平行處理能力來支援執行這些查詢。

當執行聯合查詢時，Amazon Redshift 會先從領導者節點建立用戶端與 RDS 或 Aurora DB 叢集 DB 執行個體的連線，以擷取資料表中繼資料。從運算節點中，Amazon Redshift 會發出述詞向下推送的子查詢並擷取結果資料列。然後，Amazon Redshift 會在運算節點之間分配結果資料列，以便進一步處理。

傳送至 Amazon Aurora PostgreSQL 資料庫或 Amazon RDS for PostgreSQL 資料庫的查詢相關詳細資訊記錄在系統檢視 [SVL\$1FEDERATED\$1QUERY](r_SVL_FEDERATED_QUERY.md) 中。

**Topics**
+ [開始使用 PostgreSQL 的聯合查詢](getting-started-federated.md)
+ [開始使用聯合查詢至 PostgreSQL 搭配 AWS CloudFormation](getting-started-federated-CF.md)
+ [開始使用 MySQL 的聯合查詢](getting-started-federated-mysql.md)
+ [建立秘密和 IAM 角色來使用聯合查詢](federated-create-secret-iam-role.md)
+ [使用聯合查詢的範例](federated_query_example.md)
+ [Amazon Redshift 與支援的 PostgreSQL 和 MySQL 資料庫之間的資料類型差異](federated-data-types.md)
+ [使用 Amazon Redshift 存取聯合資料時的注意事項](federated-limitations.md)

# 開始使用 PostgreSQL 的聯合查詢
<a name="getting-started-federated"></a>

若要建立聯合查詢，您可以遵循以下一般方法：

1. 設定從您的 Amazon Redshift 叢集到 Amazon RDS 或 Aurora PostgreSQL DB 執行個體的連線。

   若要這樣做，請確定 RDS PostgreSQL 或 Aurora PostgreSQL DB 執行個體可以接受來自 Amazon Redshift 叢集的連線。我們建議您的 Amazon Redshift 叢集和 Amazon RDS 或 Aurora PostgreSQL 執行個體位於相同的虛擬私有雲端 (VPC) 和子網路群組中。如此一來，您就可以將 Amazon Redshift 叢集的安全群組新增至 RDS 或 Aurora PostgreSQL DB 執行個體的安全群組傳入規則。

   您也可以設定 VPC 對等，或其他允許 Amazon Redshift 與 RDS 或 Aurora PostgreSQL 執行個體建立連線的網路。如需 VPC 網路的相關資訊，請參閱以下內容。
   + 《Amazon VPC 對等互連指南》**中的[什麼是 VPC 對等互連？](https://docs.aws.amazon.com/vpc/latest/peering/what-is-vpc-peering.html)
   + 《Amazon RDS 使用者指南》**中的[在 VPC 中使用 DB 執行個體](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_VPC.WorkingWithRDSInstanceinaVPC.html)。
**注意**  
在某些情況下，您必須啟用增強型 VPC 路由：例如，如果您的 Amazon Redshift 叢集與 RDS 或 Aurora PostgreSQL 執行個體位於不同的 VPC 中，或者它們位於相同的 VPC 中，且您的路由需要這麼做。否則，當您執行聯合查詢時，您可能會收到逾時錯誤。

1. 在 中 AWS Secrets Manager 為您的 RDS PostgreSQL 和 Aurora PostgreSQL 資料庫設定秘密。然後參考 AWS Identity and Access Management (IAM) 存取政策和角色中的秘密。如需詳細資訊，請參閱[建立秘密和 IAM 角色來使用聯合查詢](federated-create-secret-iam-role.md)。
**注意**  
如果您的叢集使用增強型 VPC 路由，您可能需要為 AWS Secrets Manager設定界面 VPC 端點。當您 Amazon Redshift 叢集的 VPC 和子網路無法存取公有 AWS Secrets Manager 端點時，這是必要的。當您使用 VPC 介面端點時，VPC 中的 Amazon Redshift 叢集與 之間的通訊 AWS Secrets Manager 會從 VPC 私下路由至端點介面。如需詳細資訊，請參閱《Amazon VPC 使用者指南》**中的[建立介面端點](https://docs.aws.amazon.com/vpc/latest/userguide/vpce-interface.html#create-interface-endpoint)。

1. 套用您先前在 Amazon Redshift 叢集中建立的 IAM 角色。如需詳細資訊，請參閱[建立秘密和 IAM 角色來使用聯合查詢](federated-create-secret-iam-role.md)。

1. 使用外部結構描述連接到 RDS PostgreSQL 和 Aurora PostgreSQL 資料庫。如需詳細資訊，請參閱[CREATE EXTERNAL SCHEMA](r_CREATE_EXTERNAL_SCHEMA.md)。如需如何使用聯合查詢的範例，請參閱[使用聯合查詢的範例](federated_query_example.md)。

1. 執行參考 RDS PostgreSQL 和 Aurora PostgreSQL 資料庫之外部結構描述的 SQL 查詢。

# 開始使用聯合查詢至 PostgreSQL 搭配 AWS CloudFormation
<a name="getting-started-federated-CF"></a>

您可以使用聯合查詢在操作資料庫之間進行查詢。在本入門指南中，您可以使用範例 AWS CloudFormation 堆疊來啟用從 Amazon Redshift 叢集到 Aurora PostgreSQL 無伺服器資料庫的聯合查詢，以自動化設定。您可以快速啟動並執行，而不必執行 SQL 陳述式來佈建資源。

堆疊會建立外部結構描述，並參考您的 Aurora PostgreSQL 執行個體，其中包含具有範例資料的資料表。您可以從 Redshift 叢集中查詢外部結構描述中的資料表。

如果您想要透過執行 SQL 陳述式來設定外部結構描述，而不使用 CloudFormation 來開始使用聯合查詢，請參閱 [開始使用 PostgreSQL 的聯合查詢](getting-started-federated.md)。

在針對聯合查詢執行 CloudFormation 堆疊之前，請確定您具有 Amazon Aurora PostgreSQL 相容版無伺服器資料庫，且已開啟資料 API。您可以在資料庫屬性中開啟資料 API。如果找不到設定，請再次確認您執行的是 Aurora PostgreSQL 的無伺服器執行個體。此外，請確定您擁有使用 RA3 節點的 Amazon Redshift 叢集。我們建議將 Redshift 叢集和無伺服器 Aurora PostgreSQL 執行個體放在相同的虛擬私有雲端 (VPC) 和子網路群組中。如此一來，您就可以將 Amazon Redshift 叢集的安全群組新增至 Aurora PostgreSQL 資料庫執行個體的安全群組傳入規則。

如需開始設定 Amazon Redshift 叢集的相關資訊，請參閱[開始使用 Amazon Redshift 佈建資料倉儲](https://docs.aws.amazon.com/redshift/latest/gsg/new-user.html)。如需使用 CloudFormation 設定資源的詳細資訊，請參閱[什麼是 AWS CloudFormation？](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/Welcome.html)。如需設定 Aurora DB 叢集資料庫的詳細資訊，請參閱[建立 Aurora DB 叢集 Serverless v1 DB 叢集](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/aurora-serverless.create.html)。

## 為 Redshift 聯合查詢啟動 CloudFormation 堆疊
<a name="getting-started-federated-CF-stack"></a>

使用下列程序啟動適用於 Amazon Redshift 的 CloudFormation 堆疊，以啟用聯合查詢。在執行此操作之前，請確定您已設定 Amazon Redshift 叢集和無伺服器 Aurora PostgreSQL 執行個體。

**為聯合查詢啟動 CloudFormation 堆疊**

1. 按一下此處的[https://console.aws.amazon.com/cloudformation/home?#/stacks/new?stackName=FederatedQuery&templateURL=https://s3.amazonaws.com/redshift-downloads/docs-downloads/FederatedQuery.yml](https://console.aws.amazon.com/cloudformation/home?#/stacks/new?stackName=FederatedQuery&templateURL=https://s3.amazonaws.com/redshift-downloads/docs-downloads/FederatedQuery.yml)以啟動 AWS 管理主控台中的 CloudFormation 服務。

   如果出現系統提示，請登入。

   堆疊建立程序會隨即啟動，並參考儲存在 Amazon S3 中的 CloudFormation 範本檔案。CloudFormation *範本*是 JSON 格式的文字檔案，可宣告構成堆疊 AWS 的資源。

1. 選擇**下一步**以輸入堆疊詳細資料。

1. 在**參數**底下，為叢集輸入下列內容：
   + Amazon Redshift 叢集名稱，例如 **ra3-consumer-cluster**
   + 特定的資料庫名稱，例如 **dev**
   + 資料庫使用者的名稱，例如 **consumeruser**

   同時輸入 Aurora DB 叢集資料庫的參數，包括使用者、資料庫名稱、連接埠和端點。我們建議您使用測試叢集和測試無伺服器資料庫，因為堆疊會建立數個資料庫物件。

   選擇**下一步**。

   堆疊選項隨即出現。

1. 選擇**下一步**以接受預設設定。

1. 在**功能**下，選擇**我確認 AWS CloudFormation 可能會建立 IAM 資源。**

1. 選擇**建立堆疊**。

選擇**建立堆疊**。CloudFormation 會佈建範本資源 (大約需要 10 分鐘)，並建立外部結構描述。

如果建立堆疊時發生錯誤，請執行下列動作：
+ 檢視 CloudFormation **事件**索引標籤，以取得有助於您解決錯誤的資訊。
+ 請確定您輸入正確的 Amazon Redshift 叢集名稱、資料庫名稱和資料庫使用者名稱。同時檢查 Aurora PostgreSQL 執行個體的參數。
+ 請確定您的叢集具有 RA3 節點。
+ 請確定您的資料庫和 Redshift 叢集位於相同的子網路和安全群組中。

## 從外部結構描述查詢資料
<a name="getting-started-federated-CF-stack-query"></a>

若要使用下列程序，請確定您在所述叢集和資料庫上有執行查詢所需的許可。

**使用聯合查詢來查詢外部資料庫**

1. 使用用戶端工具 (例如 Redshift 查詢編輯器) 連線至您在建立堆疊時輸入的 Redshift 資料庫。

1. 查詢堆疊所建立的外部結構描述。

   ```
   select * from svv_external_schemas;
   ```

   [SVV\$1EXTERNAL\$1SCHEMAS](r_SVV_EXTERNAL_SCHEMAS.md) 檢視會傳回可用外部結構描述的相關資訊。在此情況下，會傳回堆疊所建立的外部結構描述 (`myfederated_schema`)。如果您有任何設定，可能還會傳回其他外部結構描述。檢視也會傳回結構描述的關聯資料庫。資料庫是您在建立堆疊時輸入的 Aurora DB 叢集資料庫。堆疊會將資料表新增到 Aurora DB 叢集資料庫 (稱為 `category`) 及另一個資料表 (稱為 `sales`)。

1. 在參考您 Aurora PostgreSQL 資料庫的外部結構描述中的資料表上執行 SQL 查詢。查詢如下列範例所示。

   ```
   SELECT count(*) FROM myfederated_schema.category;
   ```

   `category` 資料表會傳回幾個記錄。您也可以從 `sales` 資料表中傳回記錄。

   ```
   SELECT count(*) FROM myfederated_schema.sales;
   ```

   如需更多範例，請參閱[使用聯合查詢的範例](federated_query_example.md)。

# 開始使用 MySQL 的聯合查詢
<a name="getting-started-federated-mysql"></a>

若要建立 MySQL 資料庫的聯合查詢，您可以遵循以下一般方法：

1. 設定從您的 Amazon Redshift 叢集到 Amazon RDS 或 Aurora MySQL DB 執行個體的連線。

   若要這樣做，請確定 RDS MySQL 或 Aurora MySQL DB 執行個體可以接受來自 Amazon Redshift 叢集的連線。我們建議您的 Amazon Redshift 叢集和 Amazon RDS 或 Aurora MySQL 執行個體位於相同的虛擬私有雲端 (VPC) 和子網路群組中。如此一來，您就可以將 Amazon Redshift 叢集的安全群組新增至 RDS 或 Aurora MySQL DB 執行個體的安全群組傳入規則。

   您也可以設定 VPC 對等，或其他允許 Amazon Redshift 與 RDS 或 Aurora MySQL 執行個體建立連線的網路。如需 VPC 網路的相關資訊，請參閱以下內容。
   + 《Amazon VPC 對等互連指南》**中的[什麼是 VPC 對等互連？](https://docs.aws.amazon.com/vpc/latest/peering/what-is-vpc-peering.html)
   + 《Amazon RDS 使用者指南》**中的[在 VPC 中使用 DB 執行個體](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_VPC.WorkingWithRDSInstanceinaVPC.html)。
**注意**  
如果您的 Amazon Redshift 叢集與 RDS 或 Aurora MySQL 執行個體位於不同的 VPC 中，請啟用增強型 VPC 路由。否則，當您執行聯合查詢時，您可能會收到逾時錯誤。

1. 在 中 AWS Secrets Manager 為您的 RDS MySQL 和 Aurora MySQL 資料庫設定秘密。然後參考 AWS Identity and Access Management (IAM) 存取政策和角色中的秘密。如需詳細資訊，請參閱[建立秘密和 IAM 角色來使用聯合查詢](federated-create-secret-iam-role.md)。
**注意**  
如果您的叢集使用增強型 VPC 路由，您可能需要為 AWS Secrets Manager設定界面 VPC 端點。當您 Amazon Redshift 叢集的 VPC 和子網路無法存取公有 AWS Secrets Manager 端點時，這是必要的。當您使用 VPC 界面端點時，VPC 中的 Amazon Redshift 叢集與 AWS Secrets Manager 之間的通訊必須私密地從您的 VPC 路由到端點界面。如需詳細資訊，請參閱《Amazon VPC 使用者指南》**中的[建立介面端點](https://docs.aws.amazon.com/vpc/latest/userguide/vpce-interface.html#create-interface-endpoint)。

1. 套用您先前在 Amazon Redshift 叢集中建立的 IAM 角色。如需詳細資訊，請參閱[建立秘密和 IAM 角色來使用聯合查詢](federated-create-secret-iam-role.md)。

1. 使用外部結構描述連接到 RDS MySQL 和 Aurora MySQL 資料庫。如需詳細資訊，請參閱[CREATE EXTERNAL SCHEMA](r_CREATE_EXTERNAL_SCHEMA.md)。如需如何使用聯合查詢的範例，請參閱[搭配 MySQL 使用聯合查詢的範例](federated_query_example.md#federated_query_example_mysql)。

1. 執行參考 RDS MySQL 和 Aurora MySQL 資料庫之外部結構描述的 SQL 查詢。

# 建立秘密和 IAM 角色來使用聯合查詢
<a name="federated-create-secret-iam-role"></a>

下列步驟顯示如何建立秘密和 IAM 角色，與聯合查詢搭配使用。

## 先決條件
<a name="federated-create-secret-prerequisites"></a>

確定您具備下列先決條件來建立秘密和 IAM 角色，與聯合查詢搭配使用：
+ 具有使用者名稱和密碼驗證的 RDS PostgreSQL、Aurora PostgreSQL DB 執行個體、RDS MySQL 或 Aurora MySQL DB 執行個體。
+ 具備支援聯合查詢叢集維護版本的 Amazon Redshift 叢集。

**使用 建立秘密 （使用者名稱和密碼） AWS Secrets Manager**

1. 使用擁有您 RDS 或 Aurora DB 叢集執行個體的帳戶登入 Secrets Manager 主控台。

1. 選擇**儲存新機密**。

1. 選擇 **RDS 資料庫的登入資料**圖磚。針對 **使用者名稱**和**密碼**，輸入您執行個體的值。確認或為**加密金鑰**選擇值。然後選擇您秘密將會存取的 RDS 資料庫。
**注意**  
我們建議您使用預設加密金鑰 (`DefaultEncryptionKey`)。如果您使用自訂加密金鑰，則必須將用於存取該秘密的 IAM 角色新增為金鑰使用者。

1. 輸入秘密的名稱，使用預設的選擇繼續建立步驟，然後選擇**儲存**。

1. 檢視您的秘密並記下您建立以識別秘密的**秘密 ARN** 值。

**使用秘密建立安全政策**

1. 登入 AWS 管理主控台 ，並在 https：//[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 開啟 IAM 主控台。

1. 使用與以下相似的 JSON 來建立政策。

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Sid": "AccessSecret",
               "Effect": "Allow",
               "Action": [
                   "secretsmanager:GetResourcePolicy",
                   "secretsmanager:GetSecretValue",
                   "secretsmanager:DescribeSecret",
                   "secretsmanager:ListSecretVersionIds"
               ],
               "Resource": "arn:aws:secretsmanager:us-west-2:123456789012:secret:my-rds-secret-VNenFy"
           },
           {
               "Sid": "VisualEditor1",
               "Effect": "Allow",
               "Action": [
                   "secretsmanager:GetRandomPassword",
                   "secretsmanager:ListSecrets"
               ],
               "Resource": "*"
           }
       ]
   }
   ```

------

   若要擷取秘密，您需要列出和讀取動作。我們建議您將資源限制在您建立的特定秘密。若要執行此動作，請使用秘密的 Amazon 資源名稱 (ARN) 來限制資源。您也可以使用 IAM 主控台上的視覺編輯器指定許可和資源。

1. 給予政策名稱並完成建立過程。

1. 導覽至 **IAM 角色**。

1. 為 **Redshift ‒ 可自訂**建立 IAM 角色。

1. 將您剛建立的 IAM 政策連接至現有的 IAM 角色，或是建立新的 IAM 角色並連接政策。

1. 在您 IAM 角色的**信任關係**索引標籤上，確認角色包含信任實體 `redshift.amazonaws.com`。

1. 請注意您建立的**角色 ARN**。這個 ARN 具備秘密的存取權限。

**將 IAM 角色連接至您的 Amazon Redshift 叢集**

1. 登入 AWS 管理主控台 ，並在 [https://console.aws.amazon.com/redshiftv2/](https://console.aws.amazon.com/redshiftv2/)：// 開啟 Amazon Redshift 主控台。

1. 在導覽選單上，選擇**叢集**。系統會 AWS 列出目前區域中您帳戶的叢集。

1. 選擇清單中的叢集名稱以檢視該叢集的詳細資訊。

1. 針對**動作**，選擇**管理 IAM 角色**。**管理 IAM 角色**頁面隨即出現。

1. 將您的 IAM 角色新增到叢集。

# 使用聯合查詢的範例
<a name="federated_query_example"></a>

下列範例顯示如何執行聯合查詢。使用連接到 Amazon Redshift 資料庫的 SQL 用戶端執行 SQL。

## 搭配 PostgreSQL 使用聯合查詢的範例
<a name="federated_query_example_postgres"></a>

以下範例會示範如何設定聯合查詢，參考 Amazon Redshift 資料庫、Aurora PostgreSQL 資料庫和 Amazon S3。此範例會示範聯合查詢的運作方式。若要在您自己的環境中執行它，請將其變更為符合您的環境。如需執行此動作的先決條件，請參閱[開始使用 PostgreSQL 的聯合查詢](getting-started-federated.md)。

建立參考 Aurora PostgreSQL 資料庫的外部結構描述。

```
CREATE EXTERNAL SCHEMA apg
FROM POSTGRES
DATABASE 'database-1' SCHEMA 'myschema'
URI 'endpoint to aurora hostname'
IAM_ROLE 'arn:aws:iam::123456789012:role/Redshift-SecretsManager-RO'
SECRET_ARN 'arn:aws:secretsmanager:us-west-2:123456789012:secret:federation/test/dataplane-apg-creds-YbVKQw';
```

建立另一個參考 Amazon S3 的外部結構描述，該結構描述使用 Amazon Redshift Spectrum。同時，將使用結構描述的許可授予 `public`。

```
CREATE EXTERNAL SCHEMA s3 
FROM DATA CATALOG 
DATABASE 'default' REGION 'us-west-2' 
IAM_ROLE 'arn:aws:iam::123456789012:role/Redshift-S3'; 

GRANT USAGE ON SCHEMA s3 TO public;
```

顯示 Amazon Redshift 資料表中的資料列數。

```
SELECT count(*) FROM public.lineitem;
            
  count
----------
25075099
```

顯示 Aurora PostgreSQL 資料表中的資料列數。

```
SELECT count(*) FROM apg.lineitem;
            
count
-------
11760
```

顯示 Amazon S3 中的資料列數。

```
SELECT count(*) FROM s3.lineitem_1t_part;
            
   count
------------
6144008876
```

從 Amazon Redshift、Aurora PostgreSQL 和 Amazon S3 建立資料表的檢視。這個檢視是用來執行您的聯合查詢。

```
CREATE VIEW lineitem_all AS
  SELECT l_orderkey,l_partkey,l_suppkey,l_linenumber,l_quantity,l_extendedprice,l_discount,l_tax,l_returnflag,l_linestatus,
         l_shipdate::date,l_commitdate::date,l_receiptdate::date, l_shipinstruct ,l_shipmode,l_comment 
  FROM s3.lineitem_1t_part 
  UNION ALL SELECT * FROM public.lineitem 
  UNION ALL SELECT * FROM apg.lineitem 
     with no schema binding;
```

搭配限制結果的述詞，顯示 `lineitem_all` 檢視中的資料列數。

```
SELECT count(*) from lineitem_all WHERE l_quantity = 10;
               
   count
-----------
123373836
```

找出每年 1 月某件項目的銷售數。

```
SELECT extract(year from l_shipdate) as year,
       extract(month from l_shipdate) as month,
       count(*) as orders
FROM lineitem_all
WHERE extract(month from l_shipdate) = 1
AND l_quantity < 2
GROUP BY 1,2
ORDER BY 1,2;

 year | month | orders
------+-------+---------
 1992 |     1 |  196019
 1993 |     1 | 1582034
 1994 |     1 | 1583181
 1995 |     1 | 1583919
 1996 |     1 | 1583622
 1997 |     1 | 1586541
 1998 |     1 | 1583198
 2016 |     1 |   15542
 2017 |     1 |   15414
 2018 |     1 |   15527
 2019 |     1 |     151
```

## 使用混合大小寫名稱的範例
<a name="federated_query_example_postgres-mixed"></a>

查詢支援的 PostgreSQL 遠端資料庫，該資料庫具有混合大小寫的資料庫、結構描述、資料表或資料欄名稱，然後將 `enable_case_sensitive_identifier` 設定為 `true`。如需此工作階段參數的相關資訊，請參閱 [enable\$1case\$1sensitive\$1identifier](r_enable_case_sensitive_identifier.md)。

```
SET enable_case_sensitive_identifier TO TRUE;
```

一般而言，資料庫和結構描述名稱是小寫的。下列範例顯示如何連線到支援的 PostgreSQL 遠端資料庫，該資料庫的資料庫和結構描述名稱為小寫，而資料表和資料欄的名稱則混合大小寫。

建立外部結構描述，並使其參考具有小寫資料庫名稱 (`dblower`) 和小寫結構描述名稱 (`schemalower`) 的 Aurora PostgreSQL 資料庫。

```
CREATE EXTERNAL SCHEMA apg_lower
FROM POSTGRES
DATABASE 'dblower' SCHEMA 'schemalower'
URI 'endpoint to aurora hostname'
IAM_ROLE 'arn:aws:iam::123456789012:role/Redshift-SecretsManager-RO'
SECRET_ARN 'arn:aws:secretsmanager:us-west-2:123456789012:secret:federation/test/dataplane-apg-creds-YbVKQw';
```

在執行查詢的工作階段中，將 `enable_case_sensitive_identifier` 設定為 `true`。

```
SET enable_case_sensitive_identifier TO TRUE;
```

執行聯合查詢以從 PostgreSQL 資料庫中選取所有資料。資料表 (`MixedCaseTab`) 和資料欄 (`MixedCaseName`) 具有混合大小寫的名稱。結果是一個資料列 (`Harry`)。

```
select * from apg_lower."MixedCaseTab";
```

```
 MixedCaseName
-------
 Harry
```

下列範例顯示如何連線到支援的 PostgreSQL 遠端資料庫，該資料庫的資料庫、結構描述、資料表和資料欄名稱混合大小寫。

將 `enable_case_sensitive_identifier` 設定為 `true`，然後再建立外部結構描述。如果 `enable_case_sensitive_identifier` 在建立外部結構描述之前未設定為 `true`，則會發生資料庫不存在錯誤。

建立外部結構描述，並使其參考具有混合大小寫資料庫名稱 (`UpperDB`) 和結構描述名稱 (`UpperSchema`) 的 Aurora PostgreSQL 資料庫。

```
CREATE EXTERNAL SCHEMA apg_upper
FROM POSTGRES
DATABASE 'UpperDB' SCHEMA 'UpperSchema'
URI 'endpoint to aurora hostname'
IAM_ROLE 'arn:aws:iam::123456789012:role/Redshift-SecretsManager-RO'
SECRET_ARN 'arn:aws:secretsmanager:us-west-2:123456789012:secret:federation/test/dataplane-apg-creds-YbVKQw';
```

執行聯合查詢以從 PostgreSQL 資料庫中選取所有資料。資料表 (`MixedCaseTab`) 和資料欄 (`MixedCaseName`) 具有混合大小寫的名稱。結果是一個資料列 (`Harry`)。

```
select * from apg_upper."MixedCaseTab";
```

```
 MixedCaseName
-------
 Harry
```

## 搭配 MySQL 使用聯合查詢的範例
<a name="federated_query_example_mysql"></a>

以下範例會示範如何設定參考 Aurora MySQL 資料庫的聯合查詢。此範例會示範聯合查詢的運作方式。若要在您自己的環境中執行它，請將其變更為符合您的環境。如需執行此動作的先決條件，請參閱[開始使用 MySQL 的聯合查詢](getting-started-federated-mysql.md)。

本範例取決於下列先決條件：
+ 在 Aurora MySQL 資料庫的 Secrets Manager 中設定的秘密。IAM 存取政策和角色中會參考此秘密。如需詳細資訊，請參閱[建立秘密和 IAM 角色來使用聯合查詢](federated-create-secret-iam-role.md)。
+ 已設定連結 Amazon Redshift 和 Aurora MySQL 的安全群組。

建立參考 Aurora MySQL 資料庫的外部結構描述。

```
CREATE EXTERNAL SCHEMA amysql
FROM MYSQL
DATABASE 'functional'
URI 'endpoint to remote hostname'
IAM_ROLE 'arn:aws:iam::123456789012:role/Redshift-SecretsManager-RO'
SECRET_ARN 'arn:aws:secretsmanager:us-west-2:123456789012:secret:federation/test/dataplane-apg-creds-YbVKQw';
```

執行 Aurora MySQL 資料表的範例 SQL 選取，以顯示 Aurora MySQL 中員工資料表中的一個資料列。

```
SELECT level FROM amysql.employees LIMIT 1;
            
 level
-------
     8
```

# Amazon Redshift 與支援的 PostgreSQL 和 MySQL 資料庫之間的資料類型差異
<a name="federated-data-types"></a>

下表顯示 Amazon Redshift 資料類型對對應 Amazon RDS PostgreSQL 或 Aurora PostgreSQL 資料類型的映射。

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/redshift/latest/dg/federated-data-types.html)

下列 RDS PostgreSQL 和 Aurora PostgreSQL 資料類型會轉換為 Amazon Redshift 中的 VARCHAR(64K)：
+ JSON、JSONB
+ 陣列
+ BIT、BIT VARYING
+ BYTEA
+ 複合類型
+ 日期和時間類型 INTERVAL、TIME、TIME WITH TIMEZONE
+ 列舉類型
+ 貨幣類型
+ 網路地址類型
+ 數字類型 SERIAL、BIGSERIAL、SMALLSERIAL 和 MONEY 
+ 物件識別碼類型
+ pg\$1lsn 類型
+ 虛擬類型
+ 範圍類型
+ 文字搜尋類型
+ TXID\$1SNAPSHOT
+ UUID
+ XML 類型 

下表顯示 Amazon Redshift 資料類型至對應 Amazon RDS MySQL 或 Aurora MySQL 資料類型的映射。

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/redshift/latest/dg/federated-data-types.html)

當 TIME資料超出範圍 (00:00:00 – 24:00:00) 時，就會產生錯誤。

下列 RDS MySQL 和 Aurora MySQL 資料類型會轉換為 Amazon Redshift 中的 VARCHAR(64K)：
+ BIT
+ BINARY
+ VARBINARY
+ TINYBLOB、BLOB、MEDIUMBLOB、LONGBLOB
+ TINYTEXT、TEXT、MEDIUMTEXT、LONGTEXT
+ ENUM
+ SET
+ SPATIAL

# 使用 Amazon Redshift 存取聯合資料時的注意事項
<a name="federated-limitations"></a>

某些 Amazon Redshift 功能不支援存取聯合資料。您可以在下面找到相關的限制和考量。

以下是將聯合查詢與 Amazon Redshift 搭配使用時的限制及考量：
+ 聯合查詢支援讀取外部資料來源。您無法在外部資料來源中寫入或建立資料庫物件。
+ 在某些情況下，您可能會在與 Amazon Redshift 不同的 AWS 區域中存取 Amazon RDS 或 Aurora 資料庫叢集資料庫。在這些情況下，您通常會因為跨 AWS 區域傳輸資料而產生網路延遲和帳單費用。我們建議您使用 Aurora 全域資料庫，搭配 AWS 與 Amazon Redshift 叢集位於相同區域中的本機端點。Aurora 全域資料庫使用專用的基礎設施來進行跨越任意兩個 AWS 區域的儲存體類型複寫，其延遲一般低於 1 秒。
+ 請考慮存取 Amazon RDS 或 Aurora DB 叢集的成本。例如，使用此功能存取 Aurora DB 叢集時，Aurora DB 叢集會根據 IOPS 計費。
+ 聯合查詢不會啟用從 RDS 或 Aurora DB 叢集存取 Amazon Redshift 的功能。
+ 聯合查詢僅適用於同時使用 Amazon Redshift 和 Amazon RDS 或 Aurora 資料庫叢集 AWS 的區域。
+ 聯合查詢目前不支援 `ALTER SCHEMA`。若要變更結構描述，請使用 `DROP` 再使用 `CREATE EXTERNAL SCHEMA`。
+ 聯合查詢不會使用並行擴展。
+ 聯合查詢目前不支援透過 PostgreSQL 外部資料包裝程式存取。
+ 對 RDS MySQL 或 Aurora MySQL 的聯合查詢支援 READ COMMITTED 層級上的交易隔離。
+ 如果未指定，Amazon Redshift 會連線到連接埠 3306 上的 RDS for MySQL 或 Aurora MySQL。在為 MySQL 建立外部結構描述之前，請先確認 MySQL 連接埠號碼。
+ 如果未指定，Amazon Redshift 會連線到連接埠 5432 上的 RDS PostgreSQL 或 Aurora PostgreSQL。在為 PostgreSQL 建立外部結構描述之前，請先確認 PostgreSQL 連接埠號碼。
+ 當從 MySQL 擷取 TIMESTAMP 和 DATE 資料類型時，零值會視為 NULL。
+ 如果使用 Aurora DB 叢集資料庫讀取器端點，可能會發生「無效快照集」錯誤。這可以透過以下其中一個方法來避免：
  + 使用特定的 Aurora DB 叢集執行個體端點 (而非使用 Aurora DB 叢集的叢集端點)。此方法會針對 PostgreSQL 資料庫的結果使用 REPEATABLE READ 交易隔離。
  + 使用 Aurora DB 叢集讀取器端點，並將工作階段的 `pg_federation_repeatable_read` 設定為 false。此方法會針對 PostgreSQL 資料庫的結果使用 READ COMMITTED 交易隔離。如需 Aurora DB 叢集讀取器端點的相關資訊，請參閱《Amazon Aurora 使用者指南》**中的 [Aurora DB 叢集端點類型](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/Aurora.Overview.Endpoints.html#Aurora.Overview.Endpoints.Types)。如需 `pg_federation_repeatable_read` 的資訊，請參閱「[pg\$1federation\$1repeatable\$1read](r_pg_federation_repeatable_read.md)」。

以下是針對 PostgreSQL 資料庫使用聯合查詢時交易的考量：
+ 如果查詢由聯合資料表組成，則領導者節點會在遠端資料庫上啟動 READ ONLY REPEATABLE READ 交易。在 Amazon Redshift 交易期間會一直保留此交易。
+ 領導者節點透過呼叫 `pg_export_snapshot` 來建立遠端資料庫的快照，並對受影響的表進行讀取鎖定。
+ 運算節點會啟動交易，並使用在領導者節點上建立的快照，向遠端資料庫發出查詢。

## 支援的聯合資料庫版本
<a name="federated-limitations-engine-versions"></a>

Amazon Redshift 外部結構描述可參考外部 RDS PostgreSQL 或 Aurora PostgreSQL 中的資料庫。當其這樣做時，適用下列限制：
+ 建立參考 Aurora DB 叢集的外部結構描述時，Aurora PostgreSQL 資料庫的版本必須是 9.6 或更新版本。
+ 建立參考 Amazon RDS 的外部結構描述時，Amazon RDS PostgreSQL 資料庫的版本必須是 9.6 或更新版本。

Amazon Redshift 外部結構描述可參考外部 RDS MySQL 或 Aurora MySQL 中的資料庫。當其這樣做時，適用下列限制：
+ 建立參考 Aurora DB 叢集的外部結構描述時，Aurora MySQL 資料庫的版本必須是 5.6 或更新版本。
+ 建立參考 Amazon RDS 的外部結構描述時，RDS MySQL 資料庫的版本必須是 5.6 或更新版本。