

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

# Amazon RDS for Db2 聯合
<a name="db2-federation"></a>

您可以使用 Amazon RDS for Db2 資料庫做為聯合資料庫。為 RDS for Db2 設定聯合之後，您將能夠從 RDS for Db2 資料庫存取及查詢多個資料庫的資料。聯合讓您無需將資料遷移至 RDS for Db2 資料庫，或將資料合併至單一資料庫。

透過使用 RDS for Db2 資料庫作為聯合資料庫，您可以繼續存取所有 RDS for Db2 功能，並充分利用各種功能 AWS 服務，同時將您的資料保存在不同的資料庫中。您可以設定連線相同類型不同資料庫的同質聯合，或連線不同類型不同資料庫的異質聯合。

您必須先將 RDS for Db2 中的 Db2 資料庫連線至遠端資料庫。然後，您可以針對所有連線的資料庫執行查詢。例如，您可以執行 SQL JOIN 陳述式，將 RDS for Db2 資料庫中的資料表與 z/OS 資料庫中遠端 Db2 中的資料表聯結。

**Topics**
+ [同質聯合](#db2-federation-homogeneous)
+ [異質聯合](#db2-federation-heterogeneous)

## 同質聯合
<a name="db2-federation-homogeneous"></a>

您可以在 RDS for Db2 資料庫與下列 Db2 系列產品之間設定同質聯合：
+ 適用於 Linux、UNIX、Windows (LUW) 的 Db2
+ Db2 iSeries
+ 適用於 z/OS 的 Db2

RDS for Db2 同質聯合不支援下列動作：
+ 執行 `CATALOG` 命令，以在 RDS for Db2 主機資料庫上設定節點目錄和遠端資料庫
+ 在 z/OS 上聯合至 Db2 時設定工作負載平衡 (WLB)
+ 設定 IBM 資料伺服器驅動程式組態檔案 (`db2dsdriver.cfg`)

RDS for Db2 同質聯合有下列要求：
+ 您必須在 `UNFENCED` 模式下建立 DRDA 包裝函式。如果沒有，則聯合無法在 RDS for Db2 中運作。
+ 您必須允許從 RDS for Db2 主機資料庫到遠端主機資料庫的傳入和傳出流量。如需詳細資訊，請參閱[建立安全群組以存取在您的 VPC 中您的資料庫執行個體](CHAP_SettingUp.md#CHAP_SettingUp.SecurityGroup)。

**Topics**
+ [步驟 1：建立 DRDA 包裝函式和聯合伺服器](#db2-federation-homogeneous-create)
+ [步驟 2：建立使用者映射](#db2-federation-homogeneous-map)
+ [步驟 3：檢查連線](#db2-federation-homogeneous-check)

### 步驟 1：建立 DRDA 包裝函式和聯合伺服器
<a name="db2-federation-homogeneous-create"></a>

對於同質聯合，請建立 DRDA 包裝函式和聯合伺服器。與遠端主機的連線是使用 `HOST`、`PORT` 和 `DBNAME`。

根據遠端 Db2 資料庫的類型，選擇下列其中一種方法：
+ **適用於 Linux、UNIX 和 Windows (LUX) 資料庫的 Db2** – 執行下列 SQL 命令。在下列範例中，將 {{server\_name}} 取代為您要用於聯合的伺服器名稱。將 {{db2\_version}} 取代為您遠端 Db2 資料庫的版本。將 {{username}} 和 {{password}} 取代為您要連線之遠端 Db2 資料庫的憑證。將 {{db\_name}}、{{dns\_name}} 和 {{port}} 取代為您要連線之遠端 Db2 資料庫的適當值。

  ```
  create wrapper drda options(DB2_FENCED 'N');
  create server {{server_name}} type DB2/LUW wrapper drda version '{{db2_version}}' authorization "{{master_username}}" password "{{master_password}}" options (add DBNAME '{{db_name}}',add HOST '{{dns_name}}',add PORT '{{port}}');
  ```

  **範例**

  ```
  create wrapper drda options(DB2_FENCED 'N');
  create server SERVER1 type DB2/LUW wrapper drda version '11.5' authorization "sysuser" password "******" options (add DBNAME 'TESTDB2',add HOST 'ip-123-45-67-899.us-west-1.compute.internal',add PORT '25010');
  ```
+ **Db2 iSeries** – 執行下列 SQL 命令。在下列範例中，將 {{wrapper\_name}} 和 {{library\_name}} 取代為 DRDA 包裝函式和[包裝函式程式庫檔案](https://www.ibm.com/docs/en/db2/11.5?topic=wrapper-db2-library-files)的名稱。將 {{server\_name}} 取代為您要用於聯合的伺服器名稱。將 {{db2\_version}} 取代為您遠端 Db2 資料庫的版本。將 {{username}} 和 {{password}} 取代為您要連線之遠端 Db2 資料庫的憑證。將 {{dns\_name}}、{{port}} 和 {{db\_name}} 取代為您要連線之遠端 Db2 資料庫的適當值。

  ```
  create wrapper {{wrapper_name}} library '{{library name}}' options(DB2_FENCED 'N');
  create server {{server_name}} type db2/mvs version {{db2_version}} wrapper {{wrapper_name}} authorization "{{sername}}" password "{{password}}" options (HOST '{{dns_name}}', PORT '{{port}}', DBNAME '{{db_name}}');
  ```

  **範例**

  ```
  create wrapper WRAPPER1 library 'libdb2drda.so' options(DB2_FENCED 'N');
  create server SERVER1 type db2/mvs version 11 wrapper WRAPPER1 authorization "sysuser" password "******" options (HOST 'test1.123.com', PORT '446', DBNAME 'STLEC1');
  ```
+ **Db2 for z/OS** – 執行下列 SQL 命令。在下列範例中，將 {{wrapper\_name}} 和 {{library\_name}} 取代為 DRDA 包裝函式和[包裝函式程式庫檔案](https://www.ibm.com/docs/en/db2/11.5?topic=wrapper-db2-library-files)的名稱。將 {{server\_name}} 取代為您要用於聯合的伺服器名稱。將 {{db2\_version}} 取代為您遠端 Db2 資料庫的版本。將 {{username}} 和 {{password}} 取代為您要連線之遠端 Db2 資料庫的憑證。將 {{dns\_name}}、{{port}} 和 {{db\_name}} 取代為您要連線之遠端 Db2 資料庫的適當值。

  ```
  create wrapper {{wrapper_name}} library '{{library_name}}' options(DB2_FENCED 'N');
  create server {{server_name}} type db2/mvs version {{db2_version}} wrapper {{wrapper_name}} authorization "{{username}}" password "{{password}}" options (HOST '{{dns_name}}', PORT '{{port}}', DBNAME '{{db_name}}');
  ```

  **範例**

  ```
  create wrapper WRAPPER1 library 'libdb2drda.so' OPTIONS(DB2_FENCED 'N');
  create server SERVER1 type db2/mvs version 11 wrapper WRAPPER1 authorization "sysuser" password "******" options (HOST 'test1.123.com', PORT '446', DBNAME 'STLEC1');
  ```

### 步驟 2：建立使用者映射
<a name="db2-federation-homogeneous-map"></a>

執行下列 SQL 命令，建立使用者映射，將聯合伺服器與您的資料來源伺服器建立關聯。在下列範例中，將 {{server\_name}} 取代為您要執行作業的遠端伺服器之名稱。這是您在[步驟 1](#db2-federation-homogeneous-create) 中建立的伺服器。將 {{username}} 和 {{password}} 取代為此遠端伺服器的憑證。

```
create user mapping for user server {{server_name}} options (REMOTE_AUTHID '{{username}}', REMOTE_PASSWORD '{{password}}');
```

如需詳細資訊，請參閱 IBM Db2 文件中的[使用者映射](https://www.ibm.com/docs/en/db2/11.5?topic=systems-user-mappings)。

### 步驟 3：檢查連線
<a name="db2-federation-homogeneous-check"></a>

檢查連線，確認已成功設定您的聯合。開啟工作階段，使用 SET PASSTHRU 命令將原生 SQL 命令傳送至遠端資料來源，然後在遠端資料伺服器上建立資料表。

1. 開啟並關閉工作階段，將 SQL 提交至資料來源。在下列範例中，將 {{server\_name}} 取代為您在步驟 1 中為聯合建立的伺服器之名稱。

   ```
   set passthru {{server_name}};
   ```

1. 建立新的資料表。在下列範例中，將 {{column\_name}}、{{data\_type}} 和 {{value}} 取代為資料表的適當項目。

   ```
   create table {{table_name}} ( {{column_name}} {{data_type}}({{value}}), {{column_name}} {{data_type}}({{value}});
   ```

    如需詳細資訊，請參閱 IBM Db2 文件中的 [CREATE TABLE 陳述式](https://www.ibm.com/docs/en/db2-event-store/2.0.0?topic=statements-create-table)。

1. 建立索引、將資料列的值插入資料表，然後重設連線。重設連線會捨棄連線，但會保留後端程序。在下列範例中，將 {{index\_name}}、{{table\_name}}、{{Column\_name}} 和 {{columnx\_value}} 取代為您的資訊。

   ```
   create index {{index_name}} on {{table_name}}({{column_name}});
   insert into {{table_name}} values({{column1_value}},{{column2_value}},{{column3_value}});
   insert into {{table_name}} values({{column1_value}},{{column2_value}},{{column3_value}});
   set passthru reset;
   
   connect reset;
   ```

1. 連線至遠端 Db2 資料庫，為您的遠端伺服器建立暱稱，然後執行作業。當您完成存取遠端 Db2 資料庫中的資料時，請重設，然後終止連線。在下列範例中，將 {{database\_name}} 取代為遠端 Db2 資料庫的名稱。將 {{nickname}} 取代為名稱。將 {{server\_name}} 和 {{table\_name}} 取代為您要在其中執行作業之伺服器的遠端伺服器和資料表的名稱。將 {{username}} 取代為遠端伺服器的資訊。將 {{sql\_command}} 取代為要在遠端伺服器上執行的作業。

   ```
   connect to {{database_name}};
   create nickname {{nickname}} for {{server_name}}."{{username}}"."{{table_name}}";
   select {{sql_command}} from {{nickname}};
   connect reset;
   terminate;
   ```

**範例**

下列範例會建立傳遞工作階段，以允許聯合伺服器 `testdb10` 上的作業。

接著，它會使用具有不同資料類型的三個資料欄來建立資料表 `t1`。

然後，範例會在資料表 `t1` 的三個資料欄上建立索引 `i1_t1`。隨後，它會插入兩個資料列，其中包含這三個資料欄的值，然後中斷連線。

最後，此範例會連線至遠端 Db2 資料庫 `testdb2`，並在聯合伺服器 `testdb10` 中為資料表` t1`建立暱稱。它會使用該資料來源的使用者名稱 `TESTUSER` 來建立暱稱。SQL 命令會從資料表 `t1` 輸出所有資料。範例隨即中斷連線並結束工作階段。

```
set passthru testdbl0;

create table t1 ( c1 decimal(13,0), c2 char(200), c3 int);

create index i1_t1 on t1(c3);
insert into t1 values(1,'Test',1);
insert into t1 values(2,'Test 2',2);
connect reset;

connect to testdb2;
create nickname remote_t1 for testdbl0."TESTUSER"."T1";
select * from remote_t1;
connect reset;
terminate;
```

## 異質聯合
<a name="db2-federation-heterogeneous"></a>

您可以在 RDS for Db2 資料庫與其他資料來源 (例如 Oracle 和 Microsoft SQL Server) 之間設定異質聯合。如需 Db2 LUW 所支援資料來源的完整清單，請參閱 IBM 支援網站上的 [Db2 LUW V11.5 中綁定的聯合資料來源支援矩陣](https://www.ibm.com/support/pages/data-source-support-matrix-federation-bundled-db2-luw-v115)。

RDS for Db2 異質聯合不支援下列項目：
+ 其他資料來源的原生包裝函式
+ 其他資料來源的 JDBC 包裝函式
+ 聯合到 Sybase、Informix 和 Teradata 資料來源，因為這些資料來源需要在 RDS for Db2 上安裝用戶端軟體

RDS for Db2 異質聯合有下列要求：
+ RDS for Db2 僅支援 ODBC 包裝函式方法。
+ 如果您建立包裝函式的明確定義，則必須將 `DB2_FENCED` 選項設定為 `'N'`。如需 ODBC 有效包裝函式選項的清單，請參閱 IBM Db2 文件中的 [ODBC 選項](https://www.ibm.com/docs/en/db2/11.5?topic=options-odbc)。
+ 您必須允許從 RDS for Db2 主機資料庫到遠端主機資料庫的傳入和傳出流量。如需詳細資訊，請參閱[建立安全群組以存取在您的 VPC 中您的資料庫執行個體](CHAP_SettingUp.md#CHAP_SettingUp.SecurityGroup)。

如需有關聯合到 Oracle 的資訊，請參閱 IBM 支援網站上的[如何使用 Db2 聯合和 ODBC 驅動程式查詢 Oracle？](https://www.ibm.com/support/pages/node/6431133)。

如需支援聯合的資料來源詳細資訊，請參閱 IBM 支援網站上的 [Db2 LUW V11.5 中綁定的聯合資料來源支援矩陣](https://www.ibm.com/support/pages/node/957245)。

**Topics**
+ [步驟 1：建立 ODBC 包裝函式](#db2-federation-heteogenous-define-wrapper)
+ [步驟 2：建立聯合伺服器](#db2-federation-heterogeneous-create)
+ [步驟 3：建立使用者映射](#db2-federation-heterogeneous-map)
+ [步驟 4：檢查連線](#db2-federation-heterogeneous-check)

### 步驟 1：建立 ODBC 包裝函式
<a name="db2-federation-heteogenous-define-wrapper"></a>

執行以下命令來建立包裝函式。

```
db2 "create wrapper odbc options( module '/home/rdsdb/sqllib/federation/odbc/lib/libodbc.so')"
```

### 步驟 2：建立聯合伺服器
<a name="db2-federation-heterogeneous-create"></a>

執行以下命令來建立聯合伺服器。在下列範例中，將 {{server\_name}} 取代為您要用於聯合的伺服器名稱。將 {{wrapper\_type}} 取代為適當的包裝函式。將 {{db\_version}} 取代為您遠端資料庫的版本。將 {{dns\_name}}、{{port}} 和 {{service\_name}} 取代為您要連線之遠端資料庫的適當值。

```
db2 "create server {{server_name}} type {{wrapper_type}} version {{db_version}} options (HOST '{{dns_name}}', PORT '{{port}}', SERVICE_NAME '{{service_name}}')“
```

如需包裝函式類型的資訊，請參閱 IBM 支援網站上的 [Db2 LUW V11.5 中綁定的聯合資料來源支援矩陣](https://www.ibm.com/support/pages/node/957245)。

**範例**

下列範例會為遠端 Oracle 資料庫建立聯合伺服器。

```
db2 "create server server1 type oracle_odbc version 12.1 options (HOST 'test1.amazon.com', PORT '1521', SERVICE_NAME 'pdborcl.amazon.com')“
```

### 步驟 3：建立使用者映射
<a name="db2-federation-heterogeneous-map"></a>

執行下列 SQL 命令，建立使用者映射，將聯合伺服器與您的資料來源伺服器建立關聯。在下列範例中，將 {{server\_name}} 取代為您要執行作業的遠端伺服器之名稱。這是您在[步驟 2](#db2-federation-heterogeneous-create) 中建立的伺服器。將 {{username}} 和 {{password}} 取代為此遠端伺服器的憑證。

```
create user mapping for user server {{server_name}} options (REMOTE_AUTHID '{{username}}', REMOTE_PASSWORD '{{password}}');
```

如需詳細資訊，請參閱 IBM Db2 文件中的[使用者映射](https://www.ibm.com/docs/en/db2/11.5?topic=systems-user-mappings)。

### 步驟 4：檢查連線
<a name="db2-federation-heterogeneous-check"></a>

檢查連線，確認已成功設定您的聯合。開啟工作階段，使用 SET PASSTHRU 命令將原生 SQL 命令傳送至遠端資料來源，然後在遠端資料伺服器上建立資料表。

1. 開啟並關閉工作階段，將 SQL 提交至資料來源。在下列範例中，將 {{server\_name}} 取代為您在[步驟 2](#db2-federation-heterogeneous-create) 中為聯合所建立伺服器的名稱。

   ```
   set passthru {{server_name}};
   ```

1. 建立新的資料表。在下列範例中，將 {{column\_name}}、{{data\_type}} 和 {{value}} 取代為資料表的適當項目。

   ```
   create table {{table_name}} ( {{column_name}} {{data_type}}({{value}}), {{column_name}} {{data_type}}({{value}});
   ```

    如需詳細資訊，請參閱 IBM Db2 文件中的 [CREATE TABLE 陳述式](https://www.ibm.com/docs/en/db2-event-store/2.0.0?topic=statements-create-table)。

1. 建立索引、將資料列的值插入資料表，然後重設連線。重設連線會捨棄連線，但會保留後端程序。在下列範例中，將 {{index\_name}}、{{table\_name}}、{{Column\_name}} 和 {{columnx\_value}} 取代為您的資訊。

   ```
   create index {{index_name}} on {{table_name}}({{column_name}});
   insert into {{table_name}} values({{column1_value}},{{column2_value}},{{column3_value}});
   insert into {{table_name}} values({{column1_value}},{{column2_value}},{{column3_value}});
   set passthru reset;
   
   connect reset;
   ```

1. 連線至遠端 Db2 資料庫，為您的遠端伺服器建立暱稱，然後執行作業。當您完成存取遠端 Db2 資料庫中的資料時，請重設，然後終止連線。在下列範例中，將 {{database\_name}} 取代為遠端 Db2 資料庫的名稱。將 {{nickname}} 取代為名稱。將 {{server\_name}} 和 {{table\_name}} 取代為您要在其中執行作業之伺服器的遠端伺服器和資料表的名稱。將 {{username}} 取代為遠端伺服器的資訊。將 {{sql\_command}} 取代為要在遠端伺服器上執行的作業。

   ```
   connect to {{database_name}};
   create nickname {{nickname}} for {{server_name}}."{{username}}"."{{table_name}}";
   select {{sql_command}} from {{nickname}};
   connect reset;
   terminate;
   ```

**範例**

下列範例會建立傳遞工作階段，以允許聯合伺服器 `testdb10` 上的作業。

接著，它會使用具有不同資料類型的三個資料欄來建立資料表 `t1`。

然後，範例會在資料表 `t1` 的三個資料欄上建立索引 `i1_t1`。隨後，它會插入兩個資料列，其中包含這三個資料欄的值，然後中斷連線。

最後，此範例會連線至遠端 Db2 資料庫 `testdb2`，並在聯合伺服器 `testdb10` 中為資料表` t1`建立暱稱。它會使用該資料來源的使用者名稱 `TESTUSER` 來建立暱稱。SQL 命令會從資料表 `t1` 輸出所有資料。範例隨即中斷連線並結束工作階段。

```
set passthru testdbl0;

create table t1 ( c1 decimal(13,0), c2 char(200), c3 int);

create index i1_t1 on t1(c3);
insert into t1 values(1,'Test',1);
insert into t1 values(2,'Test 2',2);
connect reset;

connect to testdb2;
create nickname remote_t1 for testdbl0."TESTUSER"."T1";
select * from remote_t1;
connect reset;
terminate;
```