

# Babelfish は、リンクサーバーをサポートしています
<a name="babelfish-postgres-linkedservers"></a>

Babelfish for Aurora PostgreSQL では、バージョン 3.1.0 の PostgreSQL `tds_fdw` 拡張を使用することにより、リンクサーバーをサポートしています。リンクサーバーを使用するには、`tds_fdw` 拡張機能をインストールする必要があります。`tds_fdw` 拡張機能の詳細については、「[Amazon Aurora PostgreSQL でサポートされている外部データラッパーを使用する](Appendix.PostgreSQL.CommonDBATasks.Extensions.foreign-data-wrappers.md)」を参照してください。

## `tds_fdw` 拡張機能のインストール
<a name="babelfish-postgres-linkedservers-tdsfdw"></a>

次の方法を使用して `tds_fdw` 拡張機能をインストールできます。

**PostgreSQL エンドポイントからの CREATE EXTENSION の使用**

1. Babelfish データベースの PostgreSQL DB インスタンスに PostgreSQL ポートで接続します。rds\$1superuser ロールを持つアカウントを使用します。

   ```
   psql --host=your-DB-instance.aws-region.rds.amazonaws.com --port=5432 --username=test --dbname=babelfish_db --password
   ```

1. `tds_fdw` 拡張機能をインストールします。インストールプロセスは 1 回で完了します。DB クラスターの再起動時に、再度インストールする必要はありません。

   ```
   babelfish_db=> CREATE EXTENSION tds_fdw;
   CREATE EXTENSION
   ```

**TDS エンドポイントからの `sp_execute_postgresql` ストアドプロシージャの呼び出し**

Babelfish は、バージョン 3.3.0 からの `sp_execute_postgresql` プロシージャの呼び出しによる `tds_fdw` 拡張機能のインストールをサポートしています。T-SQL エンドポイントから T-SQL ポートを終了せずに PostgreSQL ステートメントを実行できます。詳細については、[Babelfish for Aurora PostgreSQL の使用](Appendix.Babelfish.Functions.md)を参照してください。

1. Babelfish データベースの PostgreSQL DB インスタンスに T-SQL ポートで接続します。

   ```
   sqlcmd -S your-DB-instance.aws-region.rds.amazonaws.com -U test -P password
   ```

1. `tds_fdw` 拡張機能をインストールします。

   ```
   1>EXEC sp_execute_postgresql N'CREATE EXTENSION tds_fdw';
   2>go
   ```

## サポートされている機能
<a name="babelfish-postgres-linkedservers-supportfunction"></a>

Babelfish では、リモート RDS for SQL Server または Babelfish for Aurora PostgreSQL エンドポイントをリンクサーバーとして追加することをサポートしています。また、他のリモート SQL Server インスタンスをリンクサーバーとして追加できます。次に、`OPENQUERY()` を使用して、これらのリンクサーバーからデータを取得します。Babelfish バージョン 3.2.0 以降、4 つの部分からなる名前もサポートされています。

リンクサーバーを使用するために、以下のストアドプロシージャとカタログビューをサポートしています。

**ストアドプロシージャ**
+ **sp\$1addlinkedserver** — Babelfish は、`@provstr` パラメータをサポートしていません。
+ **sp\$1addlinkedsrvlogin**
  + リモートデータソースに接続するには、リモートユーザー名とパスワードを明示的に指定する必要があります。ユーザーの自己認証情報では接続できません。Babelfish では、`@useself = false` のみをサポートしています。
  + Babelfish では、ローカルログインに固有のリモートサーバーへのアクセス設定がサポートされていないため、`@locallogin` パラメータをサポートしていません。
+ **sp\$1linkedservers**
+ **sp\$1helplinkedsrvlogin**
+ **sp\$1dropserver**
+ **sp\$1droplinkedsrvlogin** — Babelfish では、ローカルログインに固有のリモートサーバーへのアクセス設定がサポートされていないため、`@locallogin` パラメータをサポートしていません。
+ **sp\$1serveroption** – Babelfish は以下のサーバーオプションをサポートしています。
  + クエリタイムアウト (Babelfish バージョン 3.2.0 以降)
  + 接続タイムアウト (Babelfish バージョン 3.3.0 以降) 
+ **sp\$1testlinkedserver** (Babelfish バージョン 3.3.0 以降)
+ **sp\$1enum\$1oledb\$1providers** (Babelfish バージョン 3.3.0 以降)

**カタログビュー**
+ **sys.servers**
+ **sys.linked\$1logins**

## 接続に転送中の暗号化を使用する
<a name="babelfish-postgres-linkedservers-encrytion"></a>

ソース Babelfish for Aurora PostgreSQL サーバーからターゲットリモートサーバーへの接続には、リモートサーバーのデータベース設定に応じて、転送中の暗号化 (TLS/SSL) を使用します。リモートサーバーが暗号化用に設定されていない場合、リモートデータベースへの要求を行う Babelfish サーバーは、暗号化されていない状態に戻ります。

**接続を暗号化するには**
+ ターゲットリンクサーバーが RDS for SQL Server インスタンスの場合、ターゲット SQL Server インスタンスに `rds.force_ssl = on` を設定します。RDS for SQL Server での SSL/TLS 設定の詳細については、「[Microsoft SQL Server DB インスタンスでの SSL の使用](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/SQLServer.Concepts.General.SSL.Using.html)」を参照してください。
+ ターゲットリンクサーバーが Babelfish for Aurora PostgreSQL クラスターの場合は、ターゲットサーバーに `babelfishpg_tds.tds_ssl_encrypt = on` および `ssl = on` を設定します。SSL/TLS の使用の詳細については、「[Babelfish SSL 設定とクライアント接続](babelfish-configuration.md#babelfish-ssl)」を参照してください。

## Babelfish を SQL Server からのリンクサーバーとして追加する
<a name="babelfish-linkedserver-SQLserver"></a>

Babelfish for Aurora PostgreSQL を SQL Server からのリンクサーバーとして追加できます。SQL Server データベースで、ODBC 用の Microsoft OLE DB プロバイダー MSDASQL を使用して、Babelfish をリンクサーバーとして追加できます。

MSDASQL プロバイダーを使用して SQL Server からのリンクサーバーとして Babelfish を設定するには、次の 2 つの方法があります。
+ ODBC 接続文字列をプロバイダー文字列として指定します。
+ リンクサーバーを追加する際に、ODBC データソースのシステム DSN を指定します。

## 制限事項
<a name="babelfish-postgres-linkedservers-limitations"></a>
+ OPENQUERY () は SELECT に対してのみ機能し、DML では機能しません。
+ 4 つの部分からなるオブジェクト名は読み取り専用で、リモートテーブルの変更には使用できません。UPDATE は、FROM 句内のリモートテーブルを変更せずに参照できます。
+ Babelfish リンクサーバーに対するストアドプロシージャの実行はサポートされていません。
+ Babelfish のメジャーバージョンアップグレードは、`OPENQUERY()` に依存しているオブジェクトや、4 つの部分からなる名前で参照されるオブジェクトがある場合、機能しない可能性があります。メジャーバージョンアップグレードの前に、`OPENQUERY()` または 4 つの部分からなる名前を参照するオブジェクトがすべて削除されていることを確認する必要があります。
+ データ型 `nvarchar(max)`、`varchar(max)`、`varbinary(max)`、`binary(max)`、および `time` は、リモートの Babelfish サーバーに対して期待どおりに機能しません。CAST 関数を使用して、これらをサポートされているデータ型に変換することをお勧めします。

## 例
<a name="babelfish-postgres-linkedservers-example"></a>

次の例では、Babelfish for Aurora PostgreSQL インスタンスがクラウド内の RDS for SQL Server のインスタンスに接続しています。

```
EXEC master.dbo.sp_addlinkedserver @server=N'rds_sqlserver', @srvproduct=N'', @provider=N'SQLNCLI', @datasrc=N'myserver.CB2XKFSFFMY7.US-WEST-2.RDS.AMAZONAWS.COM';
EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname=N'rds_sqlserver',@useself=N'False',@locallogin=NULL,@rmtuser=N'username',@rmtpassword='password';
```

 リンクサーバーが配置されたら、T-SQL OPENQUERY () または標準の 4 部構成の名前付けを使用して、リモートサーバー上のテーブル、ビュー、またはその他のサポートされているオブジェクトを参照できます。

```
SELECT * FROM OPENQUERY(rds_sqlserver, 'SELECT * FROM TestDB.dbo.t1');
SELECT * FROM rds_sqlserver.TestDB.dbo.t1;
```

リンクサーバーとそれに関連するすべてのログインを削除するには:

```
EXEC master.dbo.sp_dropserver @server=N'rds_sqlserver', @droplogins=N'droplogins';
```

## トラブルシューティング
<a name="babelfish-postgres-linkedservers-troubleshooting"></a>

ソースサーバーとリモートサーバーの両方に同じセキュリティグループを使用して、互いに通信できるようにします。セキュリティグループは TDS ポート (デフォルトでは 1433) のインバウンドトラフィックのみを許可し、セキュリティグループの送信元 IP をセキュリティグループ ID 自体として設定できます。同じセキュリティグループの別のインスタンスからインスタンスに接続するためのルールを設定する方法の詳細については、「[同じセキュリティグループのインスタンスからインスタンスに接続するためのルール](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/security-group-rules-reference.html#sg-rules-other-instances)」を参照してください。

アクセスが正しく設定されていない場合、リモートサーバーをクエリしようとすると、次の例のようなエラーメッセージが表示されます。

```
TDS client library error: DB #: 20009, DB Msg: Unable to connect: server is unavailable or does not exist (mssql2019.aws-region.rds.amazonaws.com), OS #: 110, OS Msg: Connection timed out, Level: 9                        
```