

# 연결된 서버를 지원하는 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 DB 인스턴스에 연결합니다. rds\_superuser 역할이 있는 계정을 사용합니다.

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

1. `tds_fdw` 확장을 설치합니다. 이는 일회성 설치 프로세스입니다. 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. T-SQL 포트에서 Babelfish 데이터베이스의 PostgreSQL DB 인스턴스에 연결합니다.

   ```
   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 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) 섹션을 참조하세요.

## SQL Server에서 Babelfish를 연결된 서버로 추가
<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에서는 사용할 수 없습니다.
+ 네 부분으로 구성된 객체 이름은 읽기에만 사용할 수 있고 원격 테이블 수정에는 사용할 수 없습니다. UPDATE는 수정하지 않고도 FROM 절의 원격 테이블을 참조할 수 있습니다.
+ Babelfish 연결 서버에 대한 저장 프로시저 실행은 지원되지 않습니다.
+ `OPENQUERY()`에 종속된 객체가 있거나 네 부분으로 구성된 이름을 통해 참조되는 객체가 있는 경우 Babelfish 메이저 버전 업그레이드가 작동하지 않을 수 있습니다. 메이저 버전 업그레이드 전에 `OPENQUERY()` 또는 네 부분으로 구성된 이름을 참조하는 모든 객체가 삭제되었는지 확인해야 합니다.
+ 다음 데이터 유형은 원격 Babelfish 서버(`nvarchar(max)`, `varchar(max)`, `varbinary(max)`, `binary(max)`, `time`)에서 예상대로 작동하지 않습니다. CAST 함수를 사용하여 지원되는 데이터 유형으로 변환하는 것이 좋습니다.

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

다음은 클라우드에서 RDS for SQL Server의 인스턴스에 Babelfish for Aurora PostgreSQL 인스턴스가 연결된 예시입니다.

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