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

# はじめに

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

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

現時点では、以下の前提条件があります。
・ターゲット・データベースがパブリック・インターネットからアクセスできること
・ターゲット・データベースが[こちら](https://docs.oracle.com/en/cloud/paas/autonomous-database/adbsa/database-links-other-databases-oracle-managed.html#GUID-51E46547-E6A3-4D12-8392-31723B37896B)に記載されているポートを使用していること
・ターゲット・データベースがSSL/TLS接続を許可する設定になっていること

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

# 1. Autonomous DatabaseのアウトバウンドIPアドレスの確認

Azure SQL DatabaseのファイアウォールでAutonomous Databaseからの接続を許可する設定をするために、Autonomous DatabaseのアウトバウンドIPアドレスを確認します。

Autonomous DatabaseのアウトバウンドIPアドレスを確認には以下のSQLを実行します。
```
SELECT json_value(cloud_identity, '$.OUTBOUND_IP_ADDRESS[0]') outbound_ip_address FROM v$pdbs;
```
SQL*PlusやDatabase Actionsを使用してAutonomous Databaseにadminユーザで接続し、上記のSQLを実行してみます。

```
SQL> SELECT json_value(cloud_identity, '$.OUTBOUND_IP_ADDRESS[0]') outbound_ip_address FROM v$pdbs;

OUTBOUND_IP_ADDRESS
--------------------------------------------------------------------------------
xxx.xxx.xxx.xxx

SQL>
```
表示されたAutonomous DatabaseのアウトバウンドIPアドレスをメモしておきます。

# 2. Azure SQL Databaseの作成

[こちら](https://learn.microsoft.com/ja-jp/azure/azure-sql/database/single-database-create-quickstart?view=azuresql&tabs=azure-portal)の手順に従って、サンプルデータを含むAzure SQL Databaseを作成します。

今回は以下のパラメータで作成しました。
サーバ管理者名：azureuser
パスワード：Oracle#1

作成したAzure SQL Databaseのサーバ名を確認し、メモしておきます。
![スクリーンショット 2022-10-08 15.04.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/e9e8db0b-49dd-13ff-a3db-c36b0d8c2629.png)

# 3. Azure SQL Databaseのファイアウォールの設定

「サーバーファイアウォールの設定」をクリックします。
![スクリーンショット 2022-10-08 15.08.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/b6f56573-115f-9021-e3a3-3d5e48cc7b5d.png)

ファイアウォール規則の「ファイアウォール ルールの追加」をクリックします。
![スクリーンショット 2022-10-08 15.10.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/1c319f49-dfd7-1320-b2bc-4cf81da25ef4.png)

Autonomous Databaseからのネットワークアクセスを許可するために、以下の内容を入力し「OK」をクリックします。
ルール名：「Autonomous Database」
開始IP：Autonomous DatabaseのアウトバウンドIPアドレス
終了IP：Autonomous DatabaseのアウトバウンドIPアドレス
![スクリーンショット 2022-10-08 15.13.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/3c7c8ac1-ae0b-d9df-270e-41af73628378.png)
ブラウザからクエリエディターを使用するために「クライアントIPv4アドレスの追加」をクリックして、使用中のPCからのアクセスを許可します。
![スクリーンショット 2022-10-08 15.26.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/0c1d5199-c475-80c4-b7c3-a411f6ea367c.png)

# 4. Azure SQL Databaseのサンプルデータの確認

左のメニューから「クエリ エディター」に移動します。
![スクリーンショット 2022-10-08 15.18.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/0554aade-b269-e5e3-0e61-dba239d24997.png)
サーバ管理者としてサインインします。
![スクリーンショット 2022-10-08 15.20.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/fa6d381f-ac7b-63a5-9e30-6c9fc9455334.png)
クエリエディターに以下のSQLを入力し、「実行」をクリックします。
```
SELECT * FROM SalesLT.ProductCategory;
```
![スクリーンショット 2022-10-08 15.22.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/78db7b30-b950-336f-9135-1de641695a63.png)
SalesLT.ProductCategory表に41件のレコードが保存されていることが確認できました。
![スクリーンショット 2022-10-08 15.33.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/8f09802a-0468-a1cf-28cb-12e2f811de2b.png)

# 5. データベース・リンクの作成

Azure SQL Databaseの準備が整ったので、Autonomous DatabaseからAzure SQL Databaseに対するデータベース・リンクを作成します。

Azure SQL Databaseに対するデータベース・リンクを作成するには、以下の2つの手順が必要です。
1. Azure SQL DatabaseにアクセスするためのクレデンシャルをDBMS_CLOUD.CREATE_CREDENTIALプロシージャで作成する
2. Azure SQL Databaseに対するデータベース・リンクをDBMS_CLOUD_ADMIN.CREATE_DATABASE_LINKプロシージャで作成する


SQL*PlusやDatabase Actionsを使用して、Autonomous Databaseにadminユーザとして接続します。

DBMS_CLOUD.CREATE_CREDENTIALは以下のような形式で実行します。
```
BEGIN
  DBMS_CLOUD.CREATE_CREDENTIAL(
    credential_name => '作成するクレデンシャルの名前',
    username => 'Azure SQL Databaseユーザのユーザ名',
    password => 'Azure SQL Databaseユーザのパスワード'
  );
END;
/
```
以下のPL/SQLブロックを実行して、「AZURE_SQL_DATABASE_LINK_CRED」という名前のクレデンシャルを作成します。
```
BEGIN
  DBMS_CLOUD.CREATE_CREDENTIAL(
    credential_name => 'AZURE_SQL_DATABASE_LINK_CRED',
    username => 'azureuser',
    password => 'Oracle#1'
  );
END;
/
```

DBMS_CLOUD_ADMIN.CREATE_DATABASE_LINKは以下のような形式で実行します。
```
BEGIN
     DBMS_CLOUD_ADMIN.CREATE_DATABASE_LINK(
          db_link_name => '作成するデータベース・リンク名', 
          hostname => 'Azure SQL Databaseのサーバ名', 
          port => '1433',
          service_name => 'Azure SQL Databaseのデータベース名',
          credential_name => '認証に使用するクレデンシャル名',
          gateway_params => JSON_OBJECT('db_type'  value 'AZURE'),
          ssl_server_cert_dn => NULL);
END;
/
```
以下のPL/SQLブロックを実行して、「AZURE_SQL_DATABASE_LINK」という名前のデータベース・リンクを作成します。
※こちらの実行には数分かかります。
```
BEGIN
     DBMS_CLOUD_ADMIN.CREATE_DATABASE_LINK(
          db_link_name => 'AZURE_SQL_DATABASE_LINK', 
          hostname => 'xxxxxxxxxx.database.windows.net', 
          port => '1433',
          service_name => 'mySampleDatabase',
          credential_name => 'AZURE_SQL_DATABASE_LINK_CRED',
          gateway_params => JSON_OBJECT('db_type'  value 'AZURE'),
          ssl_server_cert_dn => NULL);
END;
/
```

# 6. 動作確認
以下のSQLを実行して、データベース・リンクを経由してAutonomoud DatabaseからAzure SQL Databaseのデータを参照してみます。

```
SELECT * FROM SalesLT.ProductCategory@AZURE_SQL_DATABASE_LINK;
```

SQL*Plusから上記のSQLを実行してみます。
```
SQL> set pagesize 300
SQL> SELECT * FROM SalesLT.ProductCategory@AZURE_SQL_DATABASE_LINK;

ProductCategoryID ParentProductCategoryID
----------------- -----------------------
Name
--------------------------------------------------------------------------------
rowguid 			     Modified
------------------------------------ --------
		1
Bikes
CFBDA25C-DF71-47A7-B81B-64EE161AA37C 02-06-01

		2
Components
C657828D-D808-4ABA-91A3-AF2CE02300E9 02-06-01

＜中略>

ProductCategoryID ParentProductCategoryID
----------------- -----------------------
Name
--------------------------------------------------------------------------------
rowguid 			     Modified
------------------------------------ --------
3002A5D5-FEC3-464B-BEF3-E0F81D35F431 02-06-01

	       40			4
Pumps
FE4D46F2-C87C-48C5-A4A1-3F55712D80B1 02-06-01

	       41			4

ProductCategoryID ParentProductCategoryID
----------------- -----------------------
Name
--------------------------------------------------------------------------------
rowguid 			     Modified
------------------------------------ --------
Tires and Tubes
3C17C9AE-E906-48B4-BDD3-60E28D47DCDF 02-06-01


41行が選択されました。

SQL>
```
作成したデータベース・リンクを経由して、Autonomous DatabaseからAzure SQL Databaseのデータを参照できることが確認できました。

# 参考資料
・[クイックスタート: 単一データベースを作成する - Azure SQL Database](https://learn.microsoft.com/ja-jp/azure/azure-sql/database/single-database-create-quickstart?view=azuresql&tabs=azure-portal)
・[Oracle管理の異機種間接続による非Oracle Databaseへのデータベース・リンクの作成](https://docs.oracle.com/cd//E83857_01/paas/autonomous-database/adbsa/database-links-other-databases-oracle-managed.html#GUID-9FBC138F-7B22-4D14-96CF-349ADE2959F5)
・[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)
・[Using Oracle Autonomous Database on Shared Exadata Infrastructure：Obtain Tenancy Details](https://docs.oracle.com/en/cloud/paas/autonomous-database/adbsa/autonomous-database-support-ocid.html)