

# 이스케이프 해치를 사용하여 Babelfish 오류 처리 관리
<a name="babelfish-strict"></a>

Babelfish는 제어 흐름 및 트랜잭션 상태에 대해 SQL 동작을 가능한 한 모방합니다. Babelfish에 오류가 발생하면 SQL Server 오류 코드와 유사한 오류 코드를 반환합니다. Babelfish가 오류를 SQL Server 코드에 매핑할 수 없으면 고정 오류 코드(`33557097`)를 반환하고 다음과 같이 오류 유형에 따라 특정 작업을 수행합니다.
+ 컴파일 타임 오류인 경우 Babelfish는 트랜잭션을 롤백합니다.
+ 런타임 오류인 경우 Babelfish는 배치를 종료하고 트랜잭션을 롤백합니다.
+ 클라이언트와 서버 간의 프로토콜 오류인 경우 트랜잭션이 롤백되지 않습니다.

오류 코드를 동등한 코드에 매핑할 수 없고 유사한 오류에 대한 코드를 사용할 수 있는 경우 오류 코드가 대체 코드에 매핑됩니다. 예를 들어 SQL Server 코드, `8143` 및 `8144`를 유발하는 동작이 둘 다 `8143`으로 매핑됩니다.

매핑할 수 없는 오류는 `TRY... CATCH` 구문을 준수하지 않습니다.

`@@ERROR`를 사용하여 SQL Server 오류 코드를 반환하거나 `@@PGERROR` 함수를 사용하여 PostgreSQL 오류 코드를 반환할 수 있습니다. `fn_mapped_system_error_list` 함수를 사용하여 매핑된 오류 코드 목록을 반환할 수 있습니다. PostgreSQL 오류 코드에 대한 자세한 내용은 [PostgreSQL 웹 사이트](https://www.postgresql.org/docs/current/errcodes-appendix.html)를 참조하세요.

## Babelfish 이스케이프 해치 설정 수정
<a name="babelfish-escape_hatches"></a>

오류가 있을 수 있는 문장을 처리하기 위해 Babelfish는 이스케이프 해치라는 특정 옵션을 정의합니다. *이스케이프 해치*는 지원되지 않는 기능이나 구문을 발견했을 때 Babelfish 동작을 지정하는 옵션입니다.

`sp_babelfish_configure` 저장 프로시저를 사용하여 이스케이프 해치의 설정을 제어할 수 있습니다. 스크립트를 사용하여 이스케이프 해치를 `ignore` 또는 `strict`로 설정합니다. `strict`로 설정된 경우 Babelfish는 계속하기 전에 수정해야 하는 오류를 반환합니다.

현재 세션과 클러스터 수준에 변경 사항을 적용하려면 `server` 키워드를 포함합니다.

사용법은 다음과 같습니다.
+ 모든 이스케이프 해치와 해당 상태 및 사용 정보를 나열하려면 `sp_babelfish_configure`를 실행합니다.
+ 명명된 이스케이프 해치와 해당 값을 나열하려면 현재 세션 또는 클러스터 전체에 대해 `hatch_name`이 하나 이상의 이스케이프 해치의 식별자인 `sp_babelfish_configure 'hatch_name'` 명령을 실행합니다. *hatch\$1name*에는 '%'와 같은 SQL 와일드카드를 사용할 수 있습니다.
+ 하나 이상의 이스케이프 해치를 지정된 값으로 설정하려면 `sp_babelfish_configure ['hatch_name' [, 'strict'|'ignore' [, 'server']]`을 실행합니다. 클러스터 전체 수준에서 설정이 영구적이 되게 하려면 아래 나와 있는 것처럼 `server` 키워드를 포함합니다.

  ```
  EXECUTE sp_babelfish_configure 'escape_hatch_unique_constraint', 'ignore', 'server'
  ```

  현재 세션에 대해서만 설정하려면 `server`는 사용하지 마세요.
+ 모든 이스케이프 해치를 기본값으로 재설정하려면 `sp_babelfish_configure 'default'`(Babelfish 1.2.0 이상)를 실행합니다.

해치를 식별하는 문자열에는 SQL 와일드카드가 포함될 수 있습니다. 예를 들어 다음은 모든 구문 이스케이프 해치를 Aurora PostgreSQL 클러스터의 `ignore`로 설정합니다.

```
EXECUTE sp_babelfish_configure '%', 'ignore', 'server'
```

다음 표에서는 Babelfish 사전 정의된 이스케이프 해치에 대한 설명과 기본값을 확인할 수 있습니다.


| 이스케이프 해치 | 설명 | Default | 
| --- | --- | --- | 
| escape\$1hatch\$1checkpoint |  절차 코드에서 CHECKPOINT 문을 사용할 수 있지만 CHECKPOINT 문은 현재 구현되지 않았습니다.  |  무시  | 
| escape\$1hatch\$1constraint\$1name\$1for\$1default |  기본 제약 조건 이름과 관련된 Babelfish 동작을 제어합니다.  |  무시  | 
| escape\$1hatch\$1database\$1misc\$1options |  CREATE DATABASE: CONTAINMENT, DB\$1CHAINING, TRUSTWORTHY, PERSISTENT\$1LOG\$1BUFFER에서 다음 옵션과 관련된 Babelfish 동작을 제어합니다.  |  무시  | 
| escape\$1hatch\$1for\$1replication |  테이블을 만들거나 변경하는 경우 [NOT] FOR REPLICATION 절과 관련된 Babelfish 동작을 제어합니다.  |  strict  | 
| escape\$1hatch\$1fulltext |  DEFAULT\$1FULLTEXT\$1LANGUAGE in CREATE/ALTER DATABASE, CREATE FULLTEXT INDEX, 또는 sp\$1fulltext\$1database와 같은 FULLTEXT 기능과 관련된 Babelfish 동작을 제어합니다.  |  무시  | 
| escape\$1hatch\$1ignore\$1dup\$1key |  CREATE/ALTER TABLE 및 CREATE INDEX와 관련된 Babelfish 동작을 제어합니다. IGNORE\$1DUP\$1KEY=ON인 경우 `strict`(기본값)로 설정하면 오류가 반환되고`ignore`로 설정하면 오류가 무시됩니다(Babelfish 버전 1.2.0 이상).  |  strict  | 
| escape\$1hatch\$1index\$1clustering |  인덱스 및 PRIMARY KEY 또는 UNIQUE 제약 조건에 대한 CLUSTERED 또는 NONCLUSTERED 키워드와 관련된 Babelfish 동작을 제어합니다. 클러스터링이 무시되면 NONCLUSTERED가 지정된 것처럼 인덱스 또는 제약 조건이 계속 만들어집니다.  |  무시  | 
| escape\$1hatch\$1index\$1columnstore |  COLUMNSTORE 절과 관련된 Babelfish 동작을 제어합니다. `ignore`를 지정한 경우 Babelfish는 일반 B-tree 인덱스를 생성합니다.  |  strict  | 
| escape\$1hatch\$1join\$1hints |  LOOP, HASH, MERGE, REMOTE, REDUCE, REDISTRIBUTE, REPLICATE 등 JOIN 연산자의 키워드 동작을 제어합니다.  |  무시  | 
| escape\$1hatch\$1language\$1non\$1english |  화면 메시지에 대해 영어 이외의 언어와 관련된 Babelfish 동작을 제어합니다. Babelfish는 현재 화면 메시지에 대해 `us_english`만 지원합니다. SET LANGUAGE는 언어 이름을 포함하는 변수를 사용할 수 있으므로 설정 중인 실제 언어는 런타임 시에만 감지할 수 있습니다.  |  strict  | 
| escape\$1hatch\$1login\$1hashed\$1password |  무시하면 `CREATE LOGIN`과 `ALTER LOGIN`에 대한 `HASHED` 키워드의 오류를 표시하지 않습니다.  |  strict  | 
| escape\$1hatch\$1login\$1misc\$1options |  무시하면 `CREATE LOGIN` 및 `ALTER LOGIN`에 대한 `HASHED`, `MUST_CHANGE`, `OLD_PASSWORD` 및 `UNLOCK`을 제외한 다른 키워드의 오류를 표시하지 않습니다.  |  strict  | 
| escape\$1hatch\$1login\$1old\$1password |  무시하면 `CREATE LOGIN`과 `ALTER LOGIN`에 대한 `OLD_PASSWORD` 키워드의 오류를 표시하지 않습니다.  |  strict  | 
| escape\$1hatch\$1login\$1password\$1must\$1change |  무시하면 `CREATE LOGIN`과 `ALTER LOGIN`에 대한 `MUST_CHANGE` 키워드의 오류를 표시하지 않습니다.  |  strict  | 
| escape\$1hatch\$1login\$1password\$1unlock |  무시하면 `CREATE LOGIN`과 `ALTER LOGIN`에 대한 `UNLOCK` 키워드의 오류를 표시하지 않습니다.  |  strict  | 
| escape\$1hatch\$1nocheck\$1add\$1constraint |  제약 조건에 대한 WITH CHECK 또는 NOCHECK 절과 관련된 Babelfish 동작을 제어합니다.  |  strict  | 
| escape\$1hatch\$1nocheck\$1existing\$1constraint |  FOREIGN KEY 또는 CHECK 제약 조건과 관련된 Babelfish 동작을 제어합니다.  |  strict  | 
| escape\$1hatch\$1query\$1hints |  쿼리 힌트와 관련된 Babelfish 동작을 제어합니다. 이 옵션을 무시하도록 설정하면 서버는 OPTION (...) 절을 사용하여 쿼리 처리 측면을 지정하는 힌트를 무시합니다. 예에는 SELECT FROM ...이 있습니다. OPTION(MERGE JOIN HASH, MAXRECURSION 10)).  |  무시  | 
|  escape\$1hatch\$1rowversion | ROWVERSION 및 TIMESTAMP 데이터 유형의 동작을 제어합니다. 사용 정보는 [구현이 제한된 Babelfish 기능 사용](babelfish-compatibility.tsql.limited-implementation.md) 단원을 참조하세요. | strict | 
| escape\$1hatch\$1schemabinding\$1function |  WITH SCHEMABINDING 절과 관련된 Babelfish 동작을 제어합니다. 기본적으로 WITH SCHEMABINDING 절은 CREATE 또는 ALTER FUNCTION 명령으로 지정되면 무시됩니다.  |  무시  | 
| escape\$1hatch\$1schemabinding\$1procedure |  WITH SCHEMABINDING 절과 관련된 Babelfish 동작을 제어합니다. 기본적으로 WITH SCHEMABINDING 절은 CREATE 또는 ALTER PROCEDURE 명령으로 지정되면 무시됩니다.  |  무시  | 
| escape\$1hatch\$1rowguidcol\$1column |  테이블을 만들거나 변경하는 경우 ROWGUIDCOL 절과 관련된 Babelfish 동작을 제어합니다.  |  strict  | 
| escape\$1hatch\$1schemabinding\$1trigger |  WITH SCHEMABINDING 절과 관련된 Babelfish 동작을 제어합니다. 기본적으로 WITH SCHEMABINDING 절은 CREATE 또는 ALTER TRIGGER 명령으로 지정되면 무시됩니다.  |  무시  | 
| escape\$1hatch\$1schemabinding\$1view |  WITH SCHEMABINDING 절과 관련된 Babelfish 동작을 제어합니다. 기본적으로 WITH SCHEMABINDING 절은 CREATE 또는 ALTER VIEW 명령으로 지정되면 무시됩니다.  |  무시  | 
| escape\$1hatch\$1session\$1settings |  지원되지 않는 세션 수준 SET 문에 대한 Babelfish 동작을 제어합니다.  |  무시  | 
| escape\$1hatch\$1showplan\$1all |  SET SHOWPLAN\$1ALL 및 SET STATISTICS PROFILE과 관련된 Babelfish 동작을 제어합니다. 무시하도록 설정하면 SET BABELFISH\$1SHOWPLAN\$1ALL 및 SET BABELFISH\$1STATISTICS PROFILE처럼 동작합니다. 엄격하게 설정하면 자동으로 무시됩니다.  |  strict  | 
| escape\$1hatch\$1storage\$1on\$1partition |  파티셔닝을 정의하는 경우 `ON partition_scheme column ` 절과 관련된 Babelfish 동작을 제어합니다. Babelfish는 현재 파티셔닝을 구현하지 않습니다.  |  strict  | 
| escape\$1hatch\$1storage\$1options |  CREATE, ALTER DATABASE, TABLE, INDEX에 사용되는 모든 스토리지 옵션의 이스케이프 해치. 여기에는 테이블, 인덱스, 제약 조건과 데이터베이스에 대한 스토리지 위치(파티션, 파일 그룹)를 정의하는 (LOG) ON, TEXTIMAGE\$1ON, FILESTREAM\$1ON 절이 포함됩니다. 이 이스케이프 해치 설정은 이러한 모든 절(ON [PRIMARY] 및 ON 'DEFAULT' 포함)에 적용됩니다. ON partition\$1scheme(열)이 있는 테이블이나 인덱스에 대해 파티션이 지정된 경우는 예외입니다.  |  무시  | 
| escape\$1hatch\$1table\$1hints |  WITH (...) 절을 사용하여 지정된 테이블 힌트의 동작을 제어합니다.  |  무시  | 
| escape\$1hatch\$1unique\$1constraint |  엄격으로 설정하면 인덱싱된 열에서 NULL 값을 처리할 때 SQL Server와 PostgreSQL의 의미 차이가 모호한 경우 오류가 발생할 수 있습니다. 의미 차이는 비현실적인 사용 사례에서만 나타나므로 오류가 표시되지 않도록 이 이스케이프 해치를 '무시'로 설정할 수 있습니다. 다음 버전에서 더 이상 사용되지 않음: 3.6.0 이상 버전, 4.2.0 이상 버전  |  strict  | 