[OCI]Autonomous Database : RDS for PostgreSQLに対するデータベース・リンクを作成してデータを参照してみた

# はじめに

Autonomous DatabaseではAmazon Redshift、MySQL、PostgreSQL、SnowflakeといったOracle以外のデータベースに対してデーターベース・リンクが作成できます。

https://docs.oracle.com/en/cloud/paas/autonomous-database/adbsa/database-links-other-databases-oracle-managed.html#GUID-9FBC138F-7B22-4D14-96CF-349ADE2959F5

現時点では、以下の前提条件があります。
・ターゲット・データベースがパブリック・インターネットからアクセスできること
・ターゲット・データベースがSSL/TLS接続を許可する設定になっていること

ということで、今回はAutonomous DatabaseからRDS for PostgreSQLに対してデータベース・リンクを作成し、Autonomous DatabaseからRDS for PostgreSQL内のデータを参照してみました。

# 1. RDS for PostgreSQLの準備
予め、Autonomous DatabaseのアウトバウンドIPからRDS for PostgreSQLに接続できるように、VPCのネットワークを設定しておきます。

psqlコマンドでRDS for PostgreSQLに接続します。

```
[opc@tools ~]$ psql -U postgres -h testpg.xxxxxxxxxxxx.ap-northeast-1.rds.amazonaws.com
Password for user postgres: 
psql (14.2, server 14.6)
SSL connection (cipher: ECDHE-RSA-AES256-GCM-SHA384, bits: 256)
Type "help" for help.

postgres=> 
```
検証に資料するデータベースtestdbを作成します。
```
postgres=> CREATE DATABASE testdb;
CREATE DATABASE
postgres=> 
```
作成したデータベースtestdbに接続します。
```
postgres=> \c testdb
psql (14.2, server 14.6)
SSL connection (cipher: ECDHE-RSA-AES256-GCM-SHA384, bits: 256)
You are now connected to database "testdb" as user "postgres".
testdb=> 
```
検証に使用する表deptを作成します。
```
testdb=> CREATE TABLE dept (
testdb(> deptno INT,
testdb(> dname VARCHAR(14),
testdb(> loc VARCHAR(13),
testdb(> PRIMARY KEY (deptno)
testdb(> );
CREATE TABLE
testdb=> 
```
表deptにデータを追加します。
```
testdb=> INSERT INTO dept VALUES (10,'ACCOUNTING','NEW YORK');
INSERT 0 1
testdb=> INSERT INTO dept VALUES (20,'RESEARCH','DALLAS');
INSERT 0 1
testdb=> 
```
表deptの内容を確認します。
```
testdb=> SELECT * FROM dept;
 deptno |   dname    |   loc    
--------+------------+----------
     10 | ACCOUNTING | NEW YORK
     20 | RESEARCH   | DALLAS
(2 rows)

testdb-> 
```
psqlを終了します。
```
testdb-> \q
[opc@tools ~]$ 
```

# 2. Autonomous Databaseに接続

SQL*PlusからAutonomous Databaseに接続します。

```
[opc@tools ~]$ sqlplus admin/Demo#1Demo#1@testatp1_medium

SQL*Plus: Release 19.0.0.0.0 - Production on 火 5月 23 12:29:53 2023
Version 19.16.0.0.0

Copyright (c) 1982, 2022, Oracle.  All rights reserved.

最終正常ログイン時間: 月 5月  22 2023 10:45:45 +09:00


Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.19.0.1.0
に接続されました。
SQL> 
```
# 3. Autonomous DatabaseからRDS for PostgreSQLに接続するためのクレデンシャルの作成
DBMS_CLOUD.CREATE_CREDENTIALプロシージャを使用して、Autonomous DatabaseからRDS for PostgreSQLに接続するためのクレデンシャル RDS_PG_CRED を作成します。
usernameにPostgreSQLのユーザ名、passwordにそのユーザのパスワードを指定します。

```
SQL> BEGIN
  2      DBMS_CLOUD.CREATE_CREDENTIAL(
  3          credential_name => 'RDS_PG_CRED',
  4          username => 'postgres', 
  5          password => 'Demo#1Demo#1'
  6      );
  7  END;
  8  /

PL/SQL procedure successfully completed.

SQL> 
```
クレデンシャル RDS_PG_CRED が作成されました。

# 4. Autonomous DatabaseからRDS for PostgreSQLに接続するデータベース・リンクの作成

DBMS_CLOUD_ADMIN.CREATE_DATABASE_LINK プロシージャを使用して、Autonomous DatabaseからRDS for PostgreSQLに接続するデータベース・リンクを作成します。
DBMS_CLOUD_ADMIN.CREATE_DATABASE_LINKの各パラメータは以下のように指定します。
|項目 |値  |
|---|---|
|db_link_name|作成するデータベース・リンクの名前  |
|hostname|RDSマネジメントコンソールに表示されるRDS for PostgreSQLのエンドポイント|
|port|RDSマネジメントコンソールに表示されるRDS for PostgreSQLのポート|
|service_name|接続するデータベース名|
|credential_name|3.で作成したRDS for PostgreSQLに接続するためのクレデンシャルの名前|
|gateway_params|接続先DBに応じてdb_typeを設定、PostgreSQLの場合は'POSTGRES'。詳細は[こちら](https://docs.oracle.com/en/cloud/paas/autonomous-database/adbsa/database-links-other-databases-oracle-managed.html#GUID-9FBC138F-7B22-4D14-96CF-349ADE2959F5)を参照|
|directory_name|NULL|
|ssl_server_cert_dn|NULL|

```
SQL> BEGIN
  2      DBMS_CLOUD_ADMIN.CREATE_DATABASE_LINK(
  3          db_link_name => 'RDS_PG_LINK', 
  4          hostname => 'testpg.xxxxxxxxxxxx.ap-northeast-1.rds.amazonaws.com', 
  5          port => '5432',
  6          service_name => 'testdb',
  7          credential_name => 'RDS_PG_CRED',
  8          gateway_params => JSON_OBJECT('db_type' value 'POSTGRES'),
  9          ssl_server_cert_dn => NULL
 10      );
 11  END;
 12  /

PL/SQL procedure successfully completed.

SQL> 
```

# 5. Autonomous Databaseからデータベース・リンク経由でRDS for PostgreSQL内のデータを参照

Autonomous DatabaseからRDS for PostgreSQLへのデータベースリンクが作成できたので、Autonomous Databaseからデータベース・リンク経由でRDS for PostgreSQL内のデータを参照してみます。

参照先のテーブルを指定する際は、"dept"のようにテーブル名を小文字で記述してダブルクウォートで囲む必要があります。
スキーマを指定してテーブルを参照する際は、同様に、"スキーマ名"."テーブル名"のように記述する必要があります。

```
SQL> SELECT * FROM "dept"@RDS_PG_LINK;

    deptno dname	      loc
---------- -------------- -------------
	    10 ACCOUNTING	  NEW YORK
	    20 RESEARCH	      DALLAS

SQL> 
```
Autonomous Databaseからデータベース・リンク経由でRDS for PostgreSQL内のデータを参照することができました。

# 参考
[Create Database Links to Non-Oracle Databases with Oracle-Managed Heterogeneous Connectivity](https://docs.oracle.com/en/cloud/paas/autonomous-database/adbsa/database-links-other-databases-oracle-managed.html#GUID-9FBC138F-7B22-4D14-96CF-349ADE2959F5)
[CREATE_CREDENTIAL Procedure](https://docs.oracle.com/en/cloud/paas/autonomous-database/adbsa/dbms-cloud-subprograms.html#GUID-742FC365-AA09-48A8-922C-1987795CF36A)
[CREATE_DATABASE_LINK Procedure](https://docs.oracle.com/en/cloud/paas/autonomous-database/adbsa/dbms-cloud-admin.html#GUID-8F1DEFF0-08ED-4BB7-825A-01FEE214A079)
[Access Amazon Redshift, Snowflake and Other Non-Oracle Databases from Your Autonomous Database](https://blogs.oracle.com/datawarehousing/post/access-amazon-redshift-snowflake-and-other-non-oracle-databases-from-your-autonomous-database)