

# 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 系列产品之间设置同构联合身份验证：
+ Db2 for Linux、UNIX、Windows（LUW）
+ Db2 iSeries
+ Db2 for z/OS

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 数据库的类型，选择以下方法之一：
+ **Db2 for Linux、UNIX 和 Windows（LUX）数据库** – 运行以下 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 包装器和 [wrapper library file](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 包装器和 [wrapper library file](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 文档中的 [User mappings](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 statement](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 支持网站上的 [Data Source Support Matrix of Federation Bundled in 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 options](https://www.ibm.com/docs/en/db2/11.5?topic=options-odbc)。
+ 必须支持从 RDS for Db2 主机数据库到远程主机数据库的传入和传出流量。有关更多信息，请参阅 [通过创建安全组提供对 VPC 中的数据库实例的访问](CHAP_SettingUp.md#CHAP_SettingUp.SecurityGroup)。

有关与 Oracle 的联合身份验证的信息，请参阅 IBM 支持网站上的 [How to query Oracle by using Db2 Federation and the ODBC driver?](https://www.ibm.com/support/pages/node/6431133)

有关支持联合身份验证的数据来源的更多信息，请参阅 IBM 支持网站上的 [Data Source Support Matrix of Federation Bundled in 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 支持网站上的 [Data Source Support Matrix of Federation Bundled in 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 文档中的 [User mappings](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 statement](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;
```