

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

# 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. 連線至 PostgreSQL 連接埠中 Babelfish 資料庫的 PostgreSQL 資料庫執行個體。使用具有 rds\_superuser 角色的帳戶。

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

1. 安裝 `tds_fdw` 擴充功能。這是一次性安裝程序。您不需要在重啟資料庫叢集時重新安裝。

   ```
   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. 連線至 T-SQL 連接埠中 Babelfish 資料庫的 PostgreSQL 資料庫執行個體。

   ```
   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 版開始，也支持四段式名稱。

下列預存程序和目錄檢視皆受到支援，以使用連結的伺服器。

**預存程序**
+ **sp\_addlinkedserver** – Babelfish 不支援 `@provstr` 參數。
+ **sp\_addlinkedsrvlogin**
  + 您必須提供明確的遠端使用者名稱和密碼，才能連線到遠端資料來源。您無法透過使用者自我憑證進行連線。Babelfish 僅支援 `@useself = false`。
  + Babelfish 不支援 `@locallogin` 參數，因為設定特定於本機登入的遠端伺服器存取不受支援。
+ **sp\_linkedservers**
+ **sp\_helplinkedsrvlogin**
+ **sp\_dropserver**
+ **sp\_droplinkedsrvlogin** – Babelfish 不支援 `@locallogin` 參數，因為設定特定於本機登入的遠端伺服器存取不受支援。
+ **sp\_serveroption** - Babelfish 支援下列伺服器選項：
  + 查詢逾時 (從 Babelfish 3.2.0 版開始)
  + 連線逾時 (從 Babelfish 3.3.0 版開始) 
+ **sp\_testlinkedserver** (從 Babelfish 3.3.0 版開始)
+ **sp\_enum\_oledb\_providers** (從 Babelfish 3.3.0 版開始)

**目錄檢視**
+ **sys.servers**
+ **sys.linked\_logins**

## 對連線使用傳輸中加密
<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 資料庫執行個體使用 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 資料庫提供者，將 Babelfish 新增為連結伺服器：MSDASQL。

有兩種方法可以使用 MSDASQL 提供者，將 Babelfish 設定為來自 SQL Server 的連結伺服器：
+ 提供 ODBC 連線字串作為提供者字串。
+ 新增連結伺服器時，提供 ODBC 資料來源的系統 DSN。

## 限制
<a name="babelfish-postgres-linkedservers-limitations"></a>
+ OPENQUERY() 僅適用於 SELECT，不適用於 DML。
+ 由四個部分組成的物件名稱僅適用於讀取，不適用於修改遠端資料表。UPDATE 可以參考 FROM 子句中的遠端資料表，而不對其進行修改。
+ 不支援針對 Babelfish 連結伺服器執行預存程序。
+ 若有依賴 `OPENQUERY()` 的物件或透過四段式名稱參考的物件，則 Babelfish 主要版本升級可能無法運作。在進行主要版本升級之前，您必須確定任何參考 `OPENQUERY()` 或四段式名稱的物件都已捨棄。
+ 對於遠端 Babelfish 伺服器，下列資料類型無法如預期般運作：`nvarchar(max)`、`varchar(max)`、`varbinary(max)`、`binary(max)` 和 `time`。我們建議使用 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() 或標準的四部分命名來參考遠端伺服器上的資料表、檢視表或其他支援的物件：

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