

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

# 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\$1name* 取代為您要用於聯合的伺服器名稱。將 *db2\$1version* 取代為您遠端 Db2 資料庫的版本。將 *username* 和 *password* 取代為您要連線之遠端 Db2 資料庫的憑證。將 *db\$1name*、*dns\$1name* 和 *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\$1name* 和 *library\$1name* 取代為 DRDA 包裝函式和[包裝函式程式庫檔案](https://www.ibm.com/docs/en/db2/11.5?topic=wrapper-db2-library-files)的名稱。將 *server\$1name* 取代為您要用於聯合的伺服器名稱。將 *db2\$1version* 取代為您遠端 Db2 資料庫的版本。將 *username* 和 *password* 取代為您要連線之遠端 Db2 資料庫的憑證。將 *dns\$1name*、*port* 和 *db\$1name* 取代為您要連線之遠端 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\$1name* 和 *library\$1name* 取代為 DRDA 包裝函式和[包裝函式程式庫檔案](https://www.ibm.com/docs/en/db2/11.5?topic=wrapper-db2-library-files)的名稱。將 *server\$1name* 取代為您要用於聯合的伺服器名稱。將 *db2\$1version* 取代為您遠端 Db2 資料庫的版本。將 *username* 和 *password* 取代為您要連線之遠端 Db2 資料庫的憑證。將 *dns\$1name*、*port* 和 *db\$1name* 取代為您要連線之遠端 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\$1name* 取代為您要執行作業的遠端伺服器之名稱。這是您在[步驟 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\$1name* 取代為您在步驟 1 中為聯合建立的伺服器之名稱。

   ```
   set passthru server_name;
   ```

1. 建立新的資料表。在下列範例中，將 *column\$1name*、*data\$1type* 和 *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\$1name*、*table\$1name*、*Column\$1name* 和 *columnx\$1value* 取代為您的資訊。

   ```
   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\$1name* 取代為遠端 Db2 資料庫的名稱。將 *nickname* 取代為名稱。將 *server\$1name* 和 *table\$1name* 取代為您要在其中執行作業之伺服器的遠端伺服器和資料表的名稱。將 *username* 取代為遠端伺服器的資訊。將 *sql\$1command* 取代為要在遠端伺服器上執行的作業。

   ```
   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\$1name* 取代為您要用於聯合的伺服器名稱。將 *wrapper\$1type* 取代為適當的包裝函式。將 *db\$1version* 取代為您遠端資料庫的版本。將 *dns\$1name*、*port* 和 *service\$1name* 取代為您要連線之遠端資料庫的適當值。

```
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\$1name* 取代為您要執行作業的遠端伺服器之名稱。這是您在[步驟 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\$1name* 取代為您在[步驟 2](#db2-federation-heterogeneous-create) 中為聯合所建立伺服器的名稱。

   ```
   set passthru server_name;
   ```

1. 建立新的資料表。在下列範例中，將 *column\$1name*、*data\$1type* 和 *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\$1name*、*table\$1name*、*Column\$1name* 和 *columnx\$1value* 取代為您的資訊。

   ```
   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\$1name* 取代為遠端 Db2 資料庫的名稱。將 *nickname* 取代為名稱。將 *server\$1name* 和 *table\$1name* 取代為您要在其中執行作業之伺服器的遠端伺服器和資料表的名稱。將 *username* 取代為遠端伺服器的資訊。將 *sql\$1command* 取代為要在遠端伺服器上執行的作業。

   ```
   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;
```