

# PostgreSQL용 신뢰할 수 있는 언어 확장 작업
<a name="PostgreSQL_trusted_language_extension"></a>

PostgreSQL용 신뢰할 수 있는 언어 확장은 PostgreSQL 확장을 구축하기 위한 오픈 소스 개발 키트입니다. 이를 통해 고성능 PostgreSQL 확장을 구축하고 RDS for PostgreSQL DB 인스턴스에서 안전하게 실행할 수 있습니다. PostgreSQL용 신뢰할 수 있는 언어 확장(TLE)을 사용하면 PostgreSQL 기능 확장을 위해 문서화된 접근 방식을 따르는 PostgreSQL 확장을 생성할 수 있습니다. 자세한 내용은 PostgreSQL 설명서에서 [Packaging Related Objects into an Extension](https://www.postgresql.org/docs/current/extend-extensions.html)을 참조하세요.

TLE의 주요 이점 중 하나는 PostgreSQL 인스턴스의 기반이 되는 파일 시스템에 대한 액세스를 제공하지 않는 환경에서 사용할 수 있다는 것입니다. 이전에는 새 확장을 설치하려면 파일 시스템에 액세스해야 했습니다. TLE는 이러한 제약을 제거합니다. TLE는 RDS for PostgreSQL DB 인스턴스에서 실행되는 데이터베이스를 포함하여 모든 PostgreSQL 데이터베이스를 위한 새 확장을 생성할 수 있는 개발 환경을 제공합니다.

TLE는 TLE를 사용하여 만든 확장의 안전하지 않은 리소스에 대한 액세스를 방지하도록 설계되었습니다. 런타임 환경은 확장 결함이 미치는 영향을 단일 데이터베이스 연결로 제한합니다. 또한 TLE는 데이터베이스 관리자에게 확장을 설치할 수 있는 사용자를 세밀하게 제어할 수 있도록 하며, 확장을 실행하기 위한 권한 모델을 제공합니다.

TLE는 다음 RDS for PostgreSQL 버전에서 지원됩니다.
+  버전 18.1 이상 18 버전 
+  버전 17.1 이상 17 버전 
+  버전 16.1 이상 16 버전 
+  버전 15.2 이상 15 버전 
+  버전 14.5 이상 14 버전 
+  버전 13.12 이상 13 버전 

신뢰할 수 있는 언어 확장 개발 환경 및 런타임은 `pg_tle` PostgreSQL 확장 버전 1.0.1로 패키징됩니다. JavaScript, Perl, Tcl, PL/pgSQL 및 SQL에서 확장 생성을 지원합니다. 다른 PostgreSQL 확장을 설치하는 것과 동일한 방식으로 RDS for PostgreSQL DB 인스턴스에 `pg_tle` 확장을 설치합니다. `pg_tle`가 설정되면 개발자는 이를 사용하여 *TLE 확장*이라는 새 PostgreSQL 확장을 생성할 수 있습니다.

 

다음 주제에는 신뢰할 수 있는 언어 확장 설정 방법 및 자체 TLE 확장 생성 시작 방법에 대한 정보가 나와 있습니다.

**Topics**
+ [용어](PostgreSQL_trusted_language_extension-terminology.md)
+ [PostgreSQL용 신뢰할 수 있는 언어 확장을 사용하기 위한 요구 사항](PostgreSQL_trusted_language_extension-requirements.md)
+ [RDS for PostgreSQL DB 인스턴스에서 신뢰할 수 있는 언어 확장 설정](PostgreSQL_trusted_language_extension-setting-up.md)
+ [PostgreSQL용 신뢰할 수 있는 언어 확장 개요](PostgreSQL_trusted_language_extension.overview.md)
+ [RDS for PostgreSQL용 TLE 확장 생성](PostgreSQL_trusted_language_extension-creating-TLE-extensions.md)
+ [데이터베이스에서 TLE 확장 삭제](PostgreSQL_trusted_language_extension-creating-TLE-extensions.dropping-TLEs.md)
+ [PostgreSQL용 신뢰할 수 있는 언어 확장 제거](PostgreSQL_trusted_language_extension-uninstalling-pg_tle-devkit.md)
+ [TLE 확장과 함께 PostgreSQL 후크 사용](PostgreSQL_trusted_language_extension.overview.tles-and-hooks.md)
+ [TLE에서 사용자 지정 데이터 유형 사용](PostgreSQL_trusted_language_extension-custom-data-type.md)
+ [PostgreSQL용 신뢰할 수 있는 언어 확장에 대한 함수 참조](PostgreSQL_trusted_language_extension-functions-reference.md)
+ [PostgreSQL용 신뢰할 수 있는 언어 확장에 대한 후크 참조](PostgreSQL_trusted_language_extension-hooks-reference.md)

# 용어
<a name="PostgreSQL_trusted_language_extension-terminology"></a>

신뢰할 수 있는 언어 확장을 더 잘 이해하려면 이 항목에서 사용되는 용어에 대한 다음 용어집을 참조하세요.

**PostgreSQL용 신뢰할 수 있는 언어 확장**  
*PostgreSQL용 신뢰할 수 있는 언어 확장*은 `pg_tle` 확장으로 패키징된 오픈 소스 개발 키트의 공식 이름입니다. 모든 PostgreSQL 시스템에서 사용할 수 있습니다. 자세한 내용은 GitHub의 [aws/pg\$1tle](https://github.com/aws/pg_tle)를 참조하세요.

**신뢰할 수 있는 언어 확장**  
*신뢰할 수 있는 언어 확장*은 PostgreSQL용 신뢰할 수 있는 언어 확장의 약칭입니다. 이 설명서에서는 이 약칭과 약어(TLE)도 사용됩니다.

**신뢰할 수 있는 언어**  
*신뢰할 수 있는 언어*는 특정 보안 속성을 가진 프로그래밍 또는 스크립팅 언어입니다. 예를 들어 신뢰할 수 있는 언어는 일반적으로 파일 시스템에 대한 액세스를 제한하며, 지정된 네트워킹 속성의 사용을 제한합니다. TLE 개발 키트는 신뢰할 수 있는 언어를 지원하도록 설계되었습니다. PostgreSQL은 신뢰할 수 있거나 신뢰할 수 없는 확장 생성에 사용되는 여러 언어를 지원합니다. 예제는 PostgreSQL 설명서의 [Trusted and Untrusted PL/Perl](https://www.postgresql.org/docs/current/plperl-trusted.html)을 참조하세요. 신뢰할 수 있는 언어 확장을 사용하여 생성한 확장은 기본적으로 신뢰할 수 있는 언어 메커니즘을 사용합니다.

**TLE 확장**  
*TLE 확장*은 신뢰할 수 있는 언어 확장(TLE) 개발 키트를 사용하여 생성된 PostgreSQL 확장입니다.

# PostgreSQL용 신뢰할 수 있는 언어 확장을 사용하기 위한 요구 사항
<a name="PostgreSQL_trusted_language_extension-requirements"></a>

TLE 개발 키트를 설정하고 사용하기 위한 요구 사항은 다음과 같습니다.
+ ** RDS for PostgreSQL 버전** – 신뢰할 수 있는 언어 확장은 RDS for PostgreSQL 버전 13.12 이상 13 버전, 14.5 이상 14 버전 및 15.2 이상 버전에서만 지원됩니다.
  + RDS for PostgreSQL 인스턴스를 업그레이드해야 하는 경우, [RDS for PostgreSQL DB 엔진 업그레이드](USER_UpgradeDBInstance.PostgreSQL.md)를 참조하세요.
  + PostgreSQL을 실행하는 Amazon RDS DB 인스턴스가 아직 없는 경우 새로 생성할 수 있습니다. 자세한 내용은 RDS for PostgreSQL DB 인스턴스의 경우 [PostgreSQL DB 인스턴스 생성 및 해당 인스턴스에 연결](CHAP_GettingStarted.CreatingConnecting.PostgreSQL.md)을 참조하세요.  
+ **`rds_superuser` 권한 필요** - `pg_tle` 확장을 설정하고 구성하려면 데이터베이스 사용자 역할에 `rds_superuser` 역할의 권한이 있어야 합니다. 기본적으로 이 역할은 를 생성한 `postgres` 사용자에게 부여됩니다. RDS for PostgreSQL DB 인스턴스 
+ **사용자 지정 DB 파라미터 그룹 필요** - RDS for PostgreSQL DB 인스턴스는 사용자 지정 DB 파라미터 그룹을 사용하여 구성해야 합니다. 
  +  RDS for PostgreSQL DB 인스턴스가 사용자 지정 DB 파라미터 그룹을 사용하여 구성되지 않은 경우, 파라미터 그룹을 하나 생성하여 RDS for PostgreSQL DB 인스턴스에 연결해야 합니다. 단계에 대한 간략한 요약은 [사용자 지정 DB 파라미터 그룹 생성 및 적용](#PostgreSQL_trusted_language_extension-requirements-create-custom-params) 섹션을 참조하세요.
  +  RDS for PostgreSQL DB 인스턴스가 이미 사용자 지정 DB 파라미터 그룹을 사용하여 구성되어 있는 경우 신뢰할 수 있는 언어 확장을 설정할 수 있습니다. 자세한 내용은 [RDS for PostgreSQL DB 인스턴스에서 신뢰할 수 있는 언어 확장 설정](PostgreSQL_trusted_language_extension-setting-up.md)을 참조하세요.

## 사용자 지정 DB 파라미터 그룹 생성 및 적용
<a name="PostgreSQL_trusted_language_extension-requirements-create-custom-params"></a>

다음 단계를 사용하여 사용자 지정 DB 파라미터 그룹을 생성하고 이를 사용하도록 RDS for PostgreSQL DB 인스턴스를 구성합니다.

### 콘솔
<a name="PostgreSQL_trusted_language_extension-requirements-custom-parameters.CON"></a>

**사용자 지정 DB 파라미터 그룹을 생성하고 RDS for PostgreSQL DB 인스턴스에 사용하는 방법**

1. AWS Management Console에 로그인한 후 [https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/)에서 Amazon RDS 콘솔을 엽니다.

1. Amazon RDS 메뉴에서 Parameter groups(파라미터 그룹)를 선택합니다.

1. **Create parameter group**(파라미터 그룹 생성)을 선택합니다.

1. **Parameter group details**(파라미터 그룹 세부 정보) 페이지에서 다음 정보를 입력합니다.
   + **Parameter group family**(파라미터 그룹 패밀리)에서 postgres14를 선택합니다.
   + **Type**(유형)에서 DB Parameter Group을 선택합니다.
   + **Group name**(그룹 이름)에서 작업 컨텍스트에서 의미 있는 파라미터 그룹 이름을 지정합니다.
   + **Description**(설명)에 다른 팀원이 쉽게 찾을 수 있도록 유용한 설명을 입력합니다.

1. **Create**(생성)를 선택합니다. 사용자 지정 DB 파라미터 그룹이 AWS 리전에 생성됩니다. 이제 다음 단계에 따라 파라미터 그룹을 사용하도록 RDS for PostgreSQL DB 인스턴스를 수정할 수 있습니다.

1. Amazon RDS 메뉴에서 **Databases**(데이터베이스)를 선택합니다.

1. 나열된 항목 중에서 TLE와 함께 사용할 RDS for PostgreSQL DB 인스턴스를 선택한 다음 **Modify**(수정)를 선택합니다.

1.  DB 인스턴스 설정 수정 페이지의 추가 구성 섹션에서 **데이터베이스 옵션**을 찾고 선택기에서 사용자 지정 DB 파라미터 그룹을 선택합니다.

1. **Continue**(계속)를 선택하여 변경 내용을 저장합니다.

1. **Apply immediately**(즉시 적용)를 선택하면 TLE를 사용하도록 RDS for PostgreSQL DB 인스턴스를 계속 설정할 수 있습니다.

신뢰할 수 있는 언어 확장을 사용하도록 시스템을 계속 설정하려면 [RDS for PostgreSQL DB 인스턴스에서 신뢰할 수 있는 언어 확장 설정](PostgreSQL_trusted_language_extension-setting-up.md) 섹션을 참조하세요.

 DB 파라미터 그룹은 [Amazon RDS DB 인스턴스용 DB 파라미터 그룹](USER_WorkingWithDBInstanceParamGroups.md) 섹션을 참조하세요.

### AWS CLI
<a name="PostgreSQL_trusted_language_extension-requirements-custom-parameters-CLI"></a>

기본 AWS 리전으로 AWS CLI를 구성하면 CLI 명령을 사용할 때 `--region` 인수를 지정하지 않아도 됩니다. 자세한 내용은 *AWS Command Line Interface 사용 설명서*의 [구성 기초](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-quickstart.html#cli-configure-quickstart-config) 섹션을 참조하세요.

**사용자 지정 DB 파라미터 그룹을 생성하고 RDS for PostgreSQL DB 인스턴스에 사용하는 방법**

1. [create-db-parameter-group](https://docs.aws.amazon.com/cli/latest/reference/rds/create-db-parameter-group.html) AWS CLI 명령을 사용하여 사용자 AWS 리전의 postgres14를 기반으로 사용자 지정 DB 파라미터 그룹을 만들 수 있습니다. 

   대상 LinuxmacOS, 또는Unix:

   ```
   aws rds create-db-parameter-group \
     --region aws-region \
     --db-parameter-group-name custom-params-for-pg-tle \
     --db-parameter-group-family postgres14 \
     --description "My custom DB parameter group for Trusted Language Extensions"
   ```

   Windows의 경우:

   ```
   aws rds create-db-parameter-group ^
     --region aws-region ^
     --db-parameter-group-name custom-params-for-pg-tle ^
     --db-parameter-group-family postgres14 ^
     --description "My custom DB parameter group for Trusted Language Extensions"
   ```

   사용자 지정 DB 파라미터 그룹은 AWS 리전에서 사용할 수 있으므로 파라미터 그룹을 사용하도록 RDS for PostgreSQL DB 인스턴스를 수정할 수 있습니다.

1. [modify-db-instance](https://docs.aws.amazon.com/cli/latest/reference/rds/modify-db-instance.html) AWS CLI 명령을 사용하여 사용자 지정 DB 파라미터 그룹을 RDS for PostgreSQL DB 인스턴스에 적용합니다. 이 명령은 활성 인스턴스를 즉시 재부팅합니다.

   대상 LinuxmacOS, 또는Unix:

   ```
   aws rds modify-db-instance \
     --region aws-region \
     --db-instance-identifier your-instance-name \
     --db-parameter-group-name custom-params-for-pg-tle \
     --apply-immediately
   ```

   Windows의 경우:

   ```
   aws rds modify-db-instance ^
     --region aws-region ^
     --db-instance-identifier your-instance-name ^
     --db-parameter-group-name custom-params-for-pg-tle ^
     --apply-immediately
   ```

신뢰할 수 있는 언어 확장을 사용하도록 시스템을 계속 설정하려면 [RDS for PostgreSQL DB 인스턴스에서 신뢰할 수 있는 언어 확장 설정](PostgreSQL_trusted_language_extension-setting-up.md) 섹션을 참조하세요.

자세한 내용은 [Amazon RDS의 파라미터 그룹](USER_WorkingWithParamGroups.md) 단원을 참조하세요.

# RDS for PostgreSQL DB 인스턴스에서 신뢰할 수 있는 언어 확장 설정
<a name="PostgreSQL_trusted_language_extension-setting-up"></a>

다음 단계에서는 사용자의 RDS for PostgreSQL DB 인스턴스가 사용자 지정 DB 파라미터 그룹에 연결되어 있다고 가정합니다. 이러한 단계에 AWS Management Console 또는 AWS CLI를 사용할 수 있습니다.

 RDS for PostgreSQL DB 인스턴스에 신뢰할 수 있는 언어 확장을 설정하는 경우 특정 데이터베이스 권한이 있는 데이터베이스 사용자가 사용할 수 있도록 특정 데이터베이스에 설치합니다.

## 콘솔
<a name="PostgreSQL_trusted_language_extension-setting-up.CON"></a>

**신뢰할 수 있는 언어 확장 설정 방법**

`rds_superuser` 그룹(역할)의 구성원인 계정을 사용하여 다음 단계를 수행합니다.

1. [https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/)에서 AWS Management Console에 로그인한 후 Amazon RDS 콘솔을 엽니다.

1. 탐색 창에서 RDS for PostgreSQL DB 인스턴스를 선택합니다.

1. 의 **구성** 탭을 엽니다. RDS for PostgreSQL DB 인스턴스 인스턴스 세부 정보 중에서 **파라미터 그룹** 링크를 찾습니다.

1. 링크를 선택하여 와 연결된 사용자 지정 파라미터를 엽니다. RDS for PostgreSQL DB 인스턴스 

1. **파라미터** 검색 필드에 `shared_pre`를 입력하여 `shared_preload_libraries` 파라미터를 찾습니다.

1. **파라미터 편집**을 선택하여 속성 값에 액세스합니다.

1. **값** 필드의 목록에 `pg_tle`를 추가합니다. 쉼표를 사용하여 값 목록에서 항목을 구분합니다.  
![\[pg_tle가 추가된 shared_preload_libraries 파라미터 이미지.\]](http://docs.aws.amazon.com/ko_kr/AmazonRDS/latest/UserGuide/images/apg_rpg_shared_preload_pg_tle.png)

1. RDS for PostgreSQL DB 인스턴스를 재부팅하여 `shared_preload_libraries` 파라미터 변경 사항이 적용되도록 합니다.

1. 인스턴스를 사용할 수 있게 되면 `pg_tle`가 초기화되었는지 확인합니다. `psql`을 사용하여 RDS for PostgreSQL DB 인스턴스에 연결하고 다음 명령을 실행합니다.

   ```
   SHOW shared_preload_libraries;
   shared_preload_libraries 
   --------------------------
   rdsutils,pg_tle
   (1 row)
   ```

1. `pg_tle` 확장이 초기화되었으므로 이제 확장을 생성할 수 있습니다.

   ```
   CREATE EXTENSION pg_tle;
   ```

   다음 `psql` 메타 명령을 사용하여 확장이 설치되었는지 확인할 수 있습니다.

   ```
   labdb=> \dx
                            List of installed extensions
     Name   | Version |   Schema   |                Description
   ---------+---------+------------+--------------------------------------------
    pg_tle  | 1.0.1   | pgtle      | Trusted-Language Extensions for PostgreSQL
    plpgsql | 1.0     | pg_catalog | PL/pgSQL procedural language
   ```

1. PostgreSQL DB 인스턴스를 설정할 때 RDS for PostgreSQL DB 인스턴스를 위해 만든 기본 사용자 이름에 `pgtle_admin` 역할을 부여합니다. 기본값을 수락했다면 `postgres`입니다.

   ```
   labdb=> GRANT pgtle_admin TO postgres;
   GRANT ROLE
   ```

   다음 예제와 같이 `psql` 메타 명령을 사용하여 역할이 부여되었는지 확인할 수 있습니다. `pgtle_admin` 및`postgres` 역할만 출력에 표시됩니다. 자세한 내용은 [rds\$1superuser 역할 이해](Appendix.PostgreSQL.CommonDBATasks.Roles.rds_superuser.md). 섹션을 참조하세요.

   ```
   labdb=> \du
                             List of roles
       Role name    |           Attributes            |               Member of
   -----------------+---------------------------------+-----------------------------------
   pgtle_admin     | Cannot login                     | {}
   postgres        | Create role, Create DB          +| {rds_superuser,pgtle_admin}
                   | Password valid until infinity    |...
   ```

1. `\q` 메타 명령을 사용하여`psql` 세션을 닫습니다.

   ```
   \q
   ```

TLE 확장 생성을 시작하려면 [예: SQL을 사용하여 신뢰할 수 있는 언어 확장 생성](PostgreSQL_trusted_language_extension-creating-TLE-extensions.md#PostgreSQL_trusted_language_extension-simple-example) 섹션을 참조하세요.

## AWS CLI
<a name="PostgreSQL_trusted_language_extension-setting-up-CLI"></a>

기본 AWS 리전으로 AWS CLI를 구성하면 CLI 명령을 사용할 때 `--region` 인수를 지정하지 않아도 됩니다. 자세한 내용은 *AWS Command Line Interface 사용 설명서*의 [구성 기초](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-quickstart.html#cli-configure-quickstart-config) 섹션을 참조하세요.

**신뢰할 수 있는 언어 확장 설정 방법**

1. [modify-db-parameter-group](https://docs.aws.amazon.com/cli/latest/reference/rds/modify-db-parameter-group.html) AWS CLI 명령을 사용하여 `pg_tle`를 `shared_preload_libraries` 파라미터에 추가합니다.

   ```
   aws rds modify-db-parameter-group \
      --db-parameter-group-name custom-param-group-name \
      --parameters "ParameterName=shared_preload_libraries,ParameterValue=pg_tle,ApplyMethod=pending-reboot" \
      --region aws-region
   ```

1. [reboot-db-instance](https://docs.aws.amazon.com/cli/latest/reference/rds/reboot-db-instance) AWS CLI 명령을 사용하여 RDS for PostgreSQL DB 인스턴스를 재부팅하고 `pg_tle` 라이브러리를 초기화합니다.

   ```
   aws rds reboot-db-instance \
       --db-instance-identifier your-instance \
       --region aws-region
   ```

1. 인스턴스를 사용할 수 있게 되면 `pg_tle`가 초기화되었는지 확인할 수 있습니다. `psql`을 사용하여 RDS for PostgreSQL DB 인스턴스에 연결하고 다음 명령을 실행합니다.

   ```
   SHOW shared_preload_libraries;
   shared_preload_libraries 
   --------------------------
   rdsutils,pg_tle
   (1 row)
   ```

   `pg_tle`이 초기화되었으므로 이제 확장을 생성할 수 있습니다.

   ```
   CREATE EXTENSION pg_tle;
   ```

1. PostgreSQL DB 인스턴스를 설정할 때 RDS for PostgreSQL DB 인스턴스를 위해 만든 기본 사용자 이름에 `pgtle_admin` 역할을 부여합니다. 기본값을 수락했다면 `postgres`입니다.

   ```
   GRANT pgtle_admin TO postgres;
   GRANT ROLE
   ```

1. 다음과 같이 `psql` 세션을 닫습니다.

   ```
   labdb=> \q
   ```

TLE 확장 생성을 시작하려면 [예: SQL을 사용하여 신뢰할 수 있는 언어 확장 생성](PostgreSQL_trusted_language_extension-creating-TLE-extensions.md#PostgreSQL_trusted_language_extension-simple-example) 섹션을 참조하세요.

# PostgreSQL용 신뢰할 수 있는 언어 확장 개요
<a name="PostgreSQL_trusted_language_extension.overview"></a>

PostgreSQL용 신뢰할 수 있는 언어 확장은 다른 PostgreSQL 확장을 설정하는 것과 동일한 방식으로 RDS for PostgreSQL DB 인스턴스에 설치하는 PostgreSQL 확장입니다. PgAdmin 클라이언트 도구에 있는 예제 데이터베이스의 다음 이미지에서 `pg_tle` 확장을 구성하는 일부 구성 요소를 볼 수 있습니다.

![\[TLE 개발 키트를 구성하는 일부 구성 요소를 보여 주는 이미지.\]](http://docs.aws.amazon.com/ko_kr/AmazonRDS/latest/UserGuide/images/apg-pg_tle-installed-view-in-pgAdmin.png)


다음 세부 정보를 볼 수 있습니다.

1. PostgreSQL용 신뢰할 수 있는 언어 확장(TLE)은 `pg_tle` 확장으로 패키징된 개발 키트입니다. 따라서 `pg_tle`는 설치되는 데이터베이스의 사용 가능한 확장에 추가됩니다.

1. TLE에는 자체 스키마 `pgtle`이 있습니다. 이 스키마에는 생성한 확장을 설치하고 관리하는 도우미 함수(3)가 포함되어 있습니다.

1. TLE는 확장 설치, 등록, 관리를 위한 12개 이상의 도우미 함수를 제공합니다. 이러한 함수에 대한 자세한 내용은 [PostgreSQL용 신뢰할 수 있는 언어 확장에 대한 함수 참조](PostgreSQL_trusted_language_extension-functions-reference.md) 섹션을 참조하세요.

`pg_tle` 확장의 기타 구성 요소에는 다음이 포함됩니다.
+ **`pgtle_admin` 역할** - `pg_tle` 확장이 설치될 때 `pgtle_admin` 역할이 생성됩니다. 이 역할은 권한이 부여되므로 그에 따라 취급되어야 합니다. 데이터베이스 사용자에게 `pgtle_admin` 역할을 부여할 때는 *최소 권한* 원칙을 따르는 것이 좋습니다. 즉, 새 TLE 확장을 생성, 설치, 관리할 수 있는 데이터베이스 사용자에게만 `pgtle_admin` 역할을 부여합니다(예: `postgres`).
+ **`pgtle.feature_info` 테이블** - `pgtle.feature_info` 테이블은 TLE, 후크, TLE와 후크가 사용하는 사용자 지정 저장 프로시저 및 함수에 대한 정보가 포함된 보호된 테이블입니다. `pgtle_admin` 권한이 있는 경우 다음과 같은 신뢰할 수 있는 언어 확장 함수를 사용하여 테이블에서 해당 정보를 추가하고 업데이트할 수 있습니다.
  + [pgtle.register\$1feature](PostgreSQL_trusted_language_extension-functions-reference.md#pgtle.register_feature)
  + [pgtle.register\$1feature\$1if\$1not\$1exists](PostgreSQL_trusted_language_extension-functions-reference.md#pgtle.register_feature_if_not_exists)
  + [pgtle.unregister\$1feature](PostgreSQL_trusted_language_extension-functions-reference.md#pgtle.unregister_feature)
  + [pgtle.unregister\$1feature\$1if\$1exists](PostgreSQL_trusted_language_extension-functions-reference.md#pgtle.unregister_feature_if_exists)

# RDS for PostgreSQL용 TLE 확장 생성
<a name="PostgreSQL_trusted_language_extension-creating-TLE-extensions"></a>

`pg_tle` 확장이 설치된 RDS for PostgreSQL DB 인스턴스에서 TLE를 사용하여 생성한 확장을 설치할 수 있습니다. `pg_tle` 확장은 설치된 PostgreSQL 데이터베이스로 범위가 지정됩니다. TLE를 사용하여 생성한 확장은 동일한 데이터베이스로 범위가 지정됩니다.

다양한 `pgtle` 함수를 사용하여 TLE 확장을 구성하는 코드를 설치하세요. 다음과 같은 신뢰할 수 있는 언어 확장 함수는 모두 `pgtle_admin` 역할이 필요합니다.
+ [pgtle.install\$1extension](PostgreSQL_trusted_language_extension-functions-reference.md#pgtle.install_extension)
+ [pgtle.install\$1update\$1path](PostgreSQL_trusted_language_extension-functions-reference.md#pgtle.install_update_path)
+ [pgtle.register\$1feature](PostgreSQL_trusted_language_extension-functions-reference.md#pgtle.register_feature)
+ [pgtle.register\$1feature\$1if\$1not\$1exists](PostgreSQL_trusted_language_extension-functions-reference.md#pgtle.register_feature_if_not_exists)
+ [pgtle.set\$1default\$1version](PostgreSQL_trusted_language_extension-functions-reference.md#pgtle.set_default_version)
+ [pgtle.uninstall\$1extension(name)](PostgreSQL_trusted_language_extension-functions-reference.md#pgtle.uninstall_extension-name)
+ [pgtle.uninstall\$1extension(name, version)](PostgreSQL_trusted_language_extension-functions-reference.md#pgtle.uninstall_extension-name-version)
+ [pgtle.uninstall\$1extension\$1if\$1exists](PostgreSQL_trusted_language_extension-functions-reference.md#pgtle.uninstall_extension_if_exists)
+ [pgtle.uninstall\$1update\$1path](PostgreSQL_trusted_language_extension-functions-reference.md#pgtle.uninstall_update_path)
+ [pgtle.uninstall\$1update\$1path\$1if\$1exists](PostgreSQL_trusted_language_extension-functions-reference.md#pgtle.uninstall_update_path_if_exists)
+ [pgtle.unregister\$1feature](PostgreSQL_trusted_language_extension-functions-reference.md#pgtle.unregister_feature)
+ [pgtle.unregister\$1feature\$1if\$1exists](PostgreSQL_trusted_language_extension-functions-reference.md#pgtle.unregister_feature_if_exists)

## 예: SQL을 사용하여 신뢰할 수 있는 언어 확장 생성
<a name="PostgreSQL_trusted_language_extension-simple-example"></a>

다음 예제는 다양한 공식을 사용하여 거리를 계산하는 몇 가지 SQL 함수가 포함된 `pg_distance`라는 TLE 확장을 생성하는 방법을 보여 줍니다. 목록에서 맨해튼 거리를 계산하는 함수와 유클리드 거리를 계산하는 함수를 찾을 수 있습니다. 이러한 공식의 차이에 대한 자세한 내용은 Wikipedia의 [Taxicab geometry](https://en.wikipedia.org/wiki/Taxicab_geometry)와 [Euclidean geometry](https://en.wikipedia.org/wiki/Euclidean_geometry)를 참조하세요.

[RDS for PostgreSQL DB 인스턴스에서 신뢰할 수 있는 언어 확장 설정](PostgreSQL_trusted_language_extension-setting-up.md)에 설명된 대로 `pg_tle` 확장을 설정한 경우 자체 RDS for PostgreSQL DB 인스턴스에서 이 예제를 사용할 수 있습니다.

**참고**  
이 절차를 수행하려면 `pgtle_admin` 역할의 권한이 있어야 합니다.

**예제 TLE 확장을 생성하는 방법**

다음 단계에서는 `labdb`라는 예제 데이터베이스를 사용합니다. 이 데이터베이스는 `postgres` 기본 사용자가 소유합니다. `postgres` 역할에는 `pgtle_admin` 역할의 권한도 있습니다.

1. `psql`을 사용하여 에 연결합니다. RDS for PostgreSQL DB 인스턴스  

   ```
   psql --host=db-instance-123456789012.aws-region.rds.amazonaws.com
   --port=5432 --username=postgres --password --dbname=labdb
   ```

1. 다음 코드를 복사하고 `psql` 세션 콘솔에 붙여넣어 이름이 `pg_distance`인 TLE 확장을 생성합니다.

   ```
   SELECT pgtle.install_extension
   (
    'pg_distance',
    '0.1',
     'Distance functions for two points',
   $_pg_tle_$
       CREATE FUNCTION dist(x1 float8, y1 float8, x2 float8, y2 float8, norm int)
       RETURNS float8
       AS $$
         SELECT (abs(x2 - x1) ^ norm + abs(y2 - y1) ^ norm) ^ (1::float8 / norm);
       $$ LANGUAGE SQL;
   
       CREATE FUNCTION manhattan_dist(x1 float8, y1 float8, x2 float8, y2 float8)
       RETURNS float8
       AS $$
         SELECT dist(x1, y1, x2, y2, 1);
       $$ LANGUAGE SQL;
   
       CREATE FUNCTION euclidean_dist(x1 float8, y1 float8, x2 float8, y2 float8)
       RETURNS float8
       AS $$
         SELECT dist(x1, y1, x2, y2, 2);
       $$ LANGUAGE SQL;
   $_pg_tle_$
   );
   ```

   출력은 다음과 같습니다.

   ```
   install_extension
   ---------------
    t
   (1 row)
   ```

   `pg_distance` 확장을 구성하는 아티팩트가 이제 데이터베이스에 설치되었습니다. 이러한 아티팩트에는 제어 파일과 확장 코드가 포함되며, 이러한 항목은 `CREATE EXTENSION` 명령을 사용하여 확장을 생성하려면 있어야 하는 항목입니다. 즉, 데이터베이스 사용자가 확장의 함수를 사용할 수 있도록 하려면 확장을 생성해야 합니다.

1. 확장을 생성하려면 다른 확장과 마찬가지로 `CREATE EXTENSION` 명령을 사용하세요. 다른 확장과 마찬가지로 데이터베이스 사용자는 데이터베이스에서 `CREATE` 권한이 있어야 합니다.

   ```
   CREATE EXTENSION pg_distance;
   ```

1. `pg_distance` TLE 확장을 테스트하려면 TLE 확장을 사용하여 네 점 사이의 [맨해튼 거리](https://en.wikipedia.org/wiki/Taxicab_geometry)를 계산하면 됩니다.

   ```
   labdb=> SELECT manhattan_dist(1, 1, 5, 5);
   8
   ```

   동일한 점 집합 간의 [유클리드 거리](https://en.wikipedia.org/wiki/Euclidean_geometry)를 계산하려면 다음을 사용하면 됩니다.

   ```
   labdb=> SELECT euclidean_dist(1, 1, 5, 5);
   5.656854249492381
   ```

`pg_distance` 확장은 데이터베이스에 함수를 로드하여 데이터베이스에서 권한이 있는 모든 사용자가 사용할 수 있도록 합니다.

## TLE 확장 수정
<a name="PostgreSQL_trusted_language_extension-simple-example.modify"></a>

이 TLE 확장에 패키징된 함수의 쿼리 성능을 향상시키려면 다음 두 PostgreSQL 속성을 해당 사양에 추가합니다.
+ `IMMUTABLE` - `IMMUTABLE` 속성은 쿼리 최적화 프로그램이 최적화를 통해 쿼리 응답 시간을 개선할 수 있도록 합니다. 자세한 내용은 PostgreSQL 설명서에서 [Function Volatility Categories](https://www.postgresql.org/docs/current/xfunc-volatility.html)를 참조하세요.
+ `PARALLEL SAFE` - `PARALLEL SAFE` 속성은 PostgreSQL이 병렬 모드에서 함수를 실행할 수 있도록 하는 또 다른 속성입니다. 자세한 내용은 PostgreSQL 설명서에서 [CREATE FUNCTION](https://www.postgresql.org/docs/current/sql-createfunction.html)을 참조하십시오.

다음 예제에서는 `pgtle.install_update_path` 함수를 사용하여 각 함수에 이러한 속성을 추가하여 `pg_distance` TLE 확장의 `0.2` 버전을 생성하는 방법을 확인할 수 있습니다. 이 함수에 대한 자세한 내용은 [pgtle.install\$1update\$1path](PostgreSQL_trusted_language_extension-functions-reference.md#pgtle.install_update_path) 단원을 참조하세요. 이 작업을 수행하려면 `pgtle_admin` 역할이 있어야 합니다.

**기존 TLE 확장을 업데이트하고 기본 버전을 지정하는 방법**

1. `psql` 또는 pgAdmin 같은 다른 클라이언트 도구를 사용하여 RDS for PostgreSQL DB 인스턴스에 연결합니다.

   ```
   psql --host=db-instance-123456789012.aws-region.rds.amazonaws.com
   --port=5432 --username=postgres --password --dbname=labdb
   ```

1. 다음 코드를 복사하고 `psql` 세션 콘솔에 붙여넣어 기존 TLE 확장을 수정합니다.

   ```
   SELECT pgtle.install_update_path
   (
    'pg_distance',
    '0.1',
    '0.2',
   $_pg_tle_$
       CREATE OR REPLACE FUNCTION dist(x1 float8, y1 float8, x2 float8, y2 float8, norm int)
       RETURNS float8
       AS $$
         SELECT (abs(x2 - x1) ^ norm + abs(y2 - y1) ^ norm) ^ (1::float8 / norm);
       $$ LANGUAGE SQL IMMUTABLE PARALLEL SAFE;
   
       CREATE OR REPLACE FUNCTION manhattan_dist(x1 float8, y1 float8, x2 float8, y2 float8)
       RETURNS float8
       AS $$
         SELECT dist(x1, y1, x2, y2, 1);
       $$ LANGUAGE SQL IMMUTABLE PARALLEL SAFE;
   
       CREATE OR REPLACE FUNCTION euclidean_dist(x1 float8, y1 float8, x2 float8, y2 float8)
       RETURNS float8
       AS $$
         SELECT dist(x1, y1, x2, y2, 2);
       $$ LANGUAGE SQL IMMUTABLE PARALLEL SAFE;
   $_pg_tle_$
   );
   ```

   다음과 비슷한 응답이 나타납니다.

   ```
   install_update_path
   ---------------------
    t
   (1 row)
   ```

   이 확장 버전을 기본 버전으로 지정하면 데이터베이스 사용자가 데이터베이스에서 확장을 생성 또는 업데이트할 때 버전을 지정하지 않아도 됩니다.

1. TLE 확장의 수정된 버전(버전 0.2)을 기본 버전으로 지정하려면 다음 예제와 같이 `pgtle.set_default_version` 함수를 사용하세요.

   ```
   SELECT pgtle.set_default_version('pg_distance', '0.2');
   ```

   이 함수에 대한 자세한 내용은 [pgtle.set\$1default\$1version](PostgreSQL_trusted_language_extension-functions-reference.md#pgtle.set_default_version) 단원을 참조하세요.

1. 코드가 준비되면 다음과 같이 `ALTER EXTENSION ... UPDATE` 명령을 사용하여 일반적인 방법으로 설치된 TLE 확장을 업데이트할 수 있습니다.

   ```
   ALTER EXTENSION pg_distance UPDATE;
   ```

# 데이터베이스에서 TLE 확장 삭제
<a name="PostgreSQL_trusted_language_extension-creating-TLE-extensions.dropping-TLEs"></a>

다른 PostgreSQL 확장과 동일한 방식으로 `DROP EXTENSION` 명령을 사용하여 TLE 확장을 삭제할 수 있습니다. 확장을 삭제해도 확장을 구성하는 설치 파일은 제거되지 않으므로 사용자가 확장을 다시 생성할 수 있습니다. 확장 및 해당 설치 파일을 제거하려면 다음 2단계 프로세스를 수행하세요.

**TLE 확장을 삭제하고 해당 설치 파일을 제거하는 방법**

1. `psql` 또는 다른 클라이언트 도구를 사용하여 RDS for PostgreSQL DB 인스턴스에 연결합니다.

   ```
   psql --host=.111122223333.aws-region.rds.amazonaws.com --port=5432 --username=postgres --password --dbname=dbname
   ```

1. 다른 PostgreSQL 확장과 같은 방법으로 확장을 삭제합니다.

   ```
   DROP EXTENSION your-TLE-extension
   ```

   예를 들어 [예: SQL을 사용하여 신뢰할 수 있는 언어 확장 생성](PostgreSQL_trusted_language_extension-creating-TLE-extensions.md#PostgreSQL_trusted_language_extension-simple-example)에 설명된 대로 `pg_distance` 확장을 생성한 경우 다음과 같이 확장을 삭제할 수 있습니다.

   ```
   DROP EXTENSION pg_distance;
   ```

   다음과 같이 확장이 삭제되었음을 확인하는 출력이 표시됩니다.

   ```
   DROP EXTENSION
   ```

   이 시점에서 확장은 더 이상 데이터베이스에서 활성 상태가 아닙니다. 그러나 설치 파일과 제어 파일은 여전히 데이터베이스에서 사용할 수 있으므로 데이터베이스 사용자는 원하는 경우 확장을 다시 생성할 수 있습니다.
   + 데이터베이스 사용자가 TLE 확장자를 생성할 수 있도록 확장 파일을 그대로 두려면 여기서 멈추면 됩니다.
   + 확장을 구성하는 모든 파일을 제거하려면 다음 단계를 계속합니다.

1. 확장의 모든 설치 파일을 제거하려면 `pgtle.uninstall_extension` 함수를 사용하세요. 이 함수는 확장의 모든 코드와 제어 파일을 제거합니다.

   ```
   SELECT pgtle.uninstall_extension('your-tle-extension-name');
   ```

   예를 들어 모든 `pg_distance` 설치 파일을 제거하려면 다음 명령을 사용합니다.

   ```
   SELECT pgtle.uninstall_extension('pg_distance');
    uninstall_extension
   ---------------------
    t
   (1 row)
   ```

# PostgreSQL용 신뢰할 수 있는 언어 확장 제거
<a name="PostgreSQL_trusted_language_extension-uninstalling-pg_tle-devkit"></a>

더 이상 TLE를 사용하여 TLE 확장을 직접 생성하지 않으려면 `pg_tle` 확장을 삭제하고 모든 아티팩트를 제거하면 됩니다. 이 작업에는 데이터베이스의 모든 TLE 확장 삭제 및 `pgtle` 스키마 삭제가 포함됩니다.

**데이터베이스에서 `pg_tle` 확장 및 해당 스키마를 삭제하는 방법**

1. `psql` 또는 다른 클라이언트 도구를 사용하여 RDS for PostgreSQL DB 인스턴스에 연결합니다.

   ```
   psql --host=.111122223333.aws-region.rds.amazonaws.com --port=5432 --username=postgres --password --dbname=dbname
   ```

1. 데이터베이스에서 `pg_tle` 확장을 삭제합니다. 데이터베이스에서 자체 TLE 확장이 아직 실행 중인 경우 해당 확장도 삭제해야 합니다. 이를 위해 다음과 같이 `CASCADE` 키워드를 사용할 수 있습니다.

   ```
   DROP EXTENSION pg_tle CASCADE;
   ```

   `pg_tle` 확장이 데이터베이스에서 아직 활성 상태가 아닌 경우 `CASCADE` 키워드를 사용할 필요가 없습니다.

1. `pgtle` 스키마를 삭제합니다. 이 작업을 수행하면 데이터베이스에서 모든 관리 함수가 제거됩니다.

   ```
   DROP SCHEMA pgtle CASCADE;
   ```

   이 명령은 프로세스가 완료되면 다음을 반환합니다.

   ```
   DROP SCHEMA
   ```

   `pg_tle` 확장, 해당 스키마와 함수, 모든 아티팩트가 제거됩니다. TLE를 사용하여 새 확장을 생성하려면 설정 프로세스를 다시 진행하세요. 자세한 내용은 [RDS for PostgreSQL DB 인스턴스에서 신뢰할 수 있는 언어 확장 설정](PostgreSQL_trusted_language_extension-setting-up.md) 단원을 참조하십시오.

# TLE 확장과 함께 PostgreSQL 후크 사용
<a name="PostgreSQL_trusted_language_extension.overview.tles-and-hooks"></a>

*후크*는 PostgreSQL에서 사용할 수 있는 콜백 메커니즘으로, 개발자가 일반 데이터베이스 작업 중에 사용자 지정 함수 또는 기타 루틴을 호출할 수 있습니다. TLE 개발 키트는 PostgreSQL 후크를 지원하므로 런타임에 사용자 지정 함수를 PostgreSQL 동작과 통합할 수 있습니다. 예를 들어 후크를 사용하여 인증 프로세스를 사용자 지정 코드와 연결하거나 특정 요구 사항에 맞게 쿼리 계획 및 실행 프로세스를 수정할 수 있습니다.

TLE 확장은 후크를 사용할 수 있습니다. 후크의 범위가 전역적이면 모든 데이터베이스에 적용됩니다. 따라서 TLE 확장이 전역 후크를 사용하는 경우 사용자가 액세스할 수 있는 모든 데이터베이스에 TLE 확장을 생성해야 합니다.

`pg_tle` 확장을 사용하여 신뢰할 수 있는 언어 확장을 직접 구축하는 경우 SQL API에서 사용 가능한 후크를 사용하여 확장의 함수를 구축할 수 있습니다. 모든 후크는 `pg_tle`에 등록해야 합니다. 일부 후크의 경우 다양한 구성 파라미터를 설정해야 할 수도 있습니다. 예를 들어 `passcode` 확인 후크는 켜기, 해제 또는 필수로 설정할 수 있습니다. 사용 가능한 `pg_tle` 후크의 특정 요구 사항에 대한 자세한 내용은 [PostgreSQL용 신뢰할 수 있는 언어 확장에 대한 후크 참조](PostgreSQL_trusted_language_extension-hooks-reference.md) 섹션을 참조하세요.

## 예: PostgreSQL 후크를 사용하는 확장 생성
<a name="PostgreSQL_trusted_language_extension-example-hook"></a>

이 섹션에서 설명하는 예제에서는 PostgreSQL 후크를 사용하여 특정 SQL 작업 중에 제공된 암호를 확인하고 데이터베이스 사용자가 `password_check.bad_passwords` 테이블에 포함된 암호로 암호를 설정하지 못하도록 합니다. 이 테이블에는 가장 일반적으로 사용되지만 쉽게 깰 수 있는 상위 10개 암호가 나와 있습니다.

이 예제를 RDS for PostgreSQL DB 인스턴스에서 설정하려면 신뢰할 수 있는 언어 확장이 이미 설치되어 있어야 합니다. 자세한 내용은 [RDS for PostgreSQL DB 인스턴스에서 신뢰할 수 있는 언어 확장 설정](PostgreSQL_trusted_language_extension-setting-up.md)을 참조하세요.

**암호 확인 후크 예제를 설정하는 방법**

1. `psql`을 사용하여 에 연결합니다. RDS for PostgreSQL DB 인스턴스 

   ```
   psql --host=db-instance-123456789012.aws-region.rds.amazonaws.com
   --port=5432 --username=postgres --password --dbname=labdb
   ```

1. [암호 확인 후크 코드 목록](#PostgreSQL_trusted_language_extension-example-hook_code_listing)에서 코드를 복사하여 데이터베이스에 붙여넣습니다.

   ```
   SELECT pgtle.install_extension (
     'my_password_check_rules',
     '1.0',
     'Do not let users use the 10 most commonly used passwords',
   $_pgtle_$
     CREATE SCHEMA password_check;
     REVOKE ALL ON SCHEMA password_check FROM PUBLIC;
     GRANT USAGE ON SCHEMA password_check TO PUBLIC;
   
     CREATE TABLE password_check.bad_passwords (plaintext) AS
     VALUES
       ('123456'),
       ('password'),
       ('12345678'),
       ('qwerty'),
       ('123456789'),
       ('12345'),
       ('1234'),
       ('111111'),
       ('1234567'),
       ('dragon');
     CREATE UNIQUE INDEX ON password_check.bad_passwords (plaintext);
   
     CREATE FUNCTION password_check.passcheck_hook(username text, password text, password_type pgtle.password_types, valid_until timestamptz, valid_null boolean)
     RETURNS void AS $$
       DECLARE
         invalid bool := false;
       BEGIN
         IF password_type = 'PASSWORD_TYPE_MD5' THEN
           SELECT EXISTS(
             SELECT 1
             FROM password_check.bad_passwords bp
             WHERE ('md5' || md5(bp.plaintext || username)) = password
           ) INTO invalid;
           IF invalid THEN
             RAISE EXCEPTION 'Cannot use passwords from the common password dictionary';
           END IF;
         ELSIF password_type = 'PASSWORD_TYPE_PLAINTEXT' THEN
           SELECT EXISTS(
             SELECT 1
             FROM password_check.bad_passwords bp
             WHERE bp.plaintext = password
           ) INTO invalid;
           IF invalid THEN
             RAISE EXCEPTION 'Cannot use passwords from the common password dictionary';
           END IF;
         END IF;
       END
     $$ LANGUAGE plpgsql SECURITY DEFINER;
   
     GRANT EXECUTE ON FUNCTION password_check.passcheck_hook TO PUBLIC;
   
     SELECT pgtle.register_feature('password_check.passcheck_hook', 'passcheck');
   $_pgtle_$
   );
   ```

   확장이 데이터베이스에 로드되면 다음과 같은 출력이 표시됩니다.

   ```
    install_extension
   -------------------
    t
   (1 row)
   ```

1. 데이터베이스에 연결되어 있는 동안 확장을 생성할 수 있습니다.

   ```
   CREATE EXTENSION my_password_check_rules;
   ```

1. 다음 `psql` 메타 명령을 사용하여 데이터베이스에 확장이 생성되었는지 확인할 수 있습니다.

   ```
   \dx
                           List of installed extensions
             Name           | Version |   Schema   |                         Description
   -------------------------+---------+------------+-------------------------------------------------------------
    my_password_check_rules | 1.0     | public     | Prevent use of any of the top-ten most common bad passwords
    pg_tle                  | 1.0.1   | pgtle      | Trusted-Language Extensions for PostgreSQL
    plpgsql                 | 1.0     | pg_catalog | PL/pgSQL procedural language
   (3 rows)
   ```

1. AWS CLI로 작업할 다른 터미널 세션을 엽니다. 암호 확인 후크를 켜려면 사용자 지정 DB 파라미터 그룹을 수정해야 합니다. 이렇게 하려면 다음 예제에서와 같이 [modify-db-parameter-group](https://docs.aws.amazon.com/cli/latest/reference/rds/modify-db-parameter-group.html) CLI 명령을 사용합니다.

   ```
   aws rds modify-db-parameter-group \
       --region aws-region \
       --db-parameter-group-name your-custom-parameter-group \
       --parameters "ParameterName=pgtle.enable_password_check,ParameterValue=on,ApplyMethod=immediate"
   ```

   파라미터가 성공적으로 켜지면 다음과 같은 출력이 표시됩니다.

   ```
   (
       "DBParameterGroupName": "docs-lab-parameters-for-tle"
   }
   ```

   파라미터 그룹 설정 변경 사항이 적용되기까지 몇 분 정도 걸릴 수 있습니다. 하지만 이 파라미터는 동적이므로 설정을 적용하기 위해 RDS for PostgreSQL 인스턴스를 다시 시작할 필요는 없습니다.

1. `psql` 세션을 열고 데이터베이스를 쿼리하여 password\$1check 후크가 켜졌는지 확인합니다.

   ```
   labdb=> SHOW pgtle.enable_password_check;
   pgtle.enable_password_check
   -----------------------------
   on
   (1 row)
   ```

이제 password-check 후크가 활성 상태입니다. 다음 예제와 같이 새 역할을 생성하고 잘못된 암호 중 하나를 사용하여 이를 테스트할 수 있습니다.

```
CREATE ROLE test_role PASSWORD 'password';
ERROR:  Cannot use passwords from the common password dictionary
CONTEXT:  PL/pgSQL function password_check.passcheck_hook(text,text,pgtle.password_types,timestamp with time zone,boolean) line 21 at RAISE
SQL statement "SELECT password_check.passcheck_hook(
    $1::pg_catalog.text, 
    $2::pg_catalog.text, 
    $3::pgtle.password_types, 
    $4::pg_catalog.timestamptz, 
    $5::pg_catalog.bool)"
```

출력은 가독성을 위해 형식이 지정되었습니다.

다음 예제는 `pgsql` 대화형 메타 명령 `\password` 동작도 password\$1check 후크의 영향을 받는다는 것을 보여 줍니다.

```
postgres=> SET password_encryption TO 'md5';
SET
postgres=> \password
Enter new password for user "postgres":*****
Enter it again:*****
ERROR:  Cannot use passwords from the common password dictionary
CONTEXT:  PL/pgSQL function password_check.passcheck_hook(text,text,pgtle.password_types,timestamp with time zone,boolean) line 12 at RAISE
SQL statement "SELECT password_check.passcheck_hook($1::pg_catalog.text, $2::pg_catalog.text, $3::pgtle.password_types, $4::pg_catalog.timestamptz, $5::pg_catalog.bool)"
```

원하는 경우 이 TLE 확장을 삭제하고 소스 파일을 제거할 수 있습니다. 자세한 내용은 [데이터베이스에서 TLE 확장 삭제데이터베이스에서 TLE 확장 삭제](PostgreSQL_trusted_language_extension-creating-TLE-extensions.dropping-TLEs.md) 섹션을 참조하세요.

### 암호 확인 후크 코드 목록
<a name="PostgreSQL_trusted_language_extension-example-hook_code_listing"></a>

여기에 표시된 예제 코드는 `my_password_check_rules` TLE 확장의 사양을 정의합니다. 이 코드를 복사하여 데이터베이스에 붙여넣으면 `my_password_check_rules` 확장 코드가 데이터베이스에 로드되고 확장에서 사용할 수 있도록 `password_check` 후크가 등록됩니다.

```
SELECT pgtle.install_extension (
  'my_password_check_rules',
  '1.0',
  'Do not let users use the 10 most commonly used passwords',
$_pgtle_$
  CREATE SCHEMA password_check;
  REVOKE ALL ON SCHEMA password_check FROM PUBLIC;
  GRANT USAGE ON SCHEMA password_check TO PUBLIC;

  CREATE TABLE password_check.bad_passwords (plaintext) AS
  VALUES
    ('123456'),
    ('password'),
    ('12345678'),
    ('qwerty'),
    ('123456789'),
    ('12345'),
    ('1234'),
    ('111111'),
    ('1234567'),
    ('dragon');
  CREATE UNIQUE INDEX ON password_check.bad_passwords (plaintext);

  CREATE FUNCTION password_check.passcheck_hook(username text, password text, password_type pgtle.password_types, valid_until timestamptz, valid_null boolean)
  RETURNS void AS $$
    DECLARE
      invalid bool := false;
    BEGIN
      IF password_type = 'PASSWORD_TYPE_MD5' THEN
        SELECT EXISTS(
          SELECT 1
          FROM password_check.bad_passwords bp
          WHERE ('md5' || md5(bp.plaintext || username)) = password
        ) INTO invalid;
        IF invalid THEN
          RAISE EXCEPTION 'Cannot use passwords from the common password dictionary';
        END IF;
      ELSIF password_type = 'PASSWORD_TYPE_PLAINTEXT' THEN
        SELECT EXISTS(
          SELECT 1
          FROM password_check.bad_passwords bp
          WHERE bp.plaintext = password
        ) INTO invalid;
        IF invalid THEN
          RAISE EXCEPTION 'Cannot use passwords from the common password dictionary';
        END IF;
      END IF;
    END
  $$ LANGUAGE plpgsql SECURITY DEFINER;

  GRANT EXECUTE ON FUNCTION password_check.passcheck_hook TO PUBLIC;

  SELECT pgtle.register_feature('password_check.passcheck_hook', 'passcheck');
$_pgtle_$
);
```

# TLE에서 사용자 지정 데이터 유형 사용
<a name="PostgreSQL_trusted_language_extension-custom-data-type"></a>

PostgreSQL은 데이터베이스의 복잡한 데이터 구조를 효율적으로 처리하기 위해 새로운 기본 유형(다른 명칭: 스칼라 유형)을 등록하는 명령을 지원합니다. 기본 유형을 사용하면 데이터를 내부적으로 저장하는 방법과 데이터를 외부 텍스트 표현으로 변환 및 외부 텍스트 표현에서 변환하는 방법을 사용자 정의할 수 있습니다. 이러한 사용자 지정 데이터 유형은 숫자 또는 텍스트 등의 기본 제공 유형으로는 충분한 검색 의미를 제공할 수 없는 기능적 도메인을 지원하도록 PostgreSQL을 확장할 때 유용합니다.

RDS for PostgreSQL을 사용하면 신뢰할 수 있는 언어 확장에서 사용자 지정 데이터 유형을 만들고, 이러한 새 데이터 유형에서 SQL 및 인덱스 작업을 지원하는 함수를 정의할 수 있습니다. 사용자 지정 데이터 유형은 다음 버전에서 사용할 수 있습니다.
+ RDS for PostgreSQL 15.4 이상의 15 버전
+ RDS for PostgreSQL 14.9 이상의 14 버전
+ RDS for PostgreSQL 13.12 이상의 13 버전

자세한 내용을 알아보려면 [신뢰할 수 있는 언어 기반 유형](https://github.com/aws/pg_tle/blob/main/docs/09_datatypes.md)을 참조하세요.

# PostgreSQL용 신뢰할 수 있는 언어 확장에 대한 함수 참조
<a name="PostgreSQL_trusted_language_extension-functions-reference"></a>

PostgreSQL용 신뢰할 수 있는 언어 확장에서 사용할 수 있는 함수에 대한 다음 참조 설명서를 참조하세요. 이러한 함수를 사용하면 *TLE 확장*, 즉 신뢰할 수 있는 언어 확장 개발 키트를 사용하여 개발한 PostgreSQL 확장을 설치, 등록, 업데이트 및 관리할 수 있습니다.

**Topics**
+ [pgtle.available\$1extensions](#pgtle.available_extensions)
+ [pgtle.available\$1extension\$1versions](#pgtle.available_extension_versions)
+ [pgtle.extension\$1update\$1paths](#pgtle.extension_update_paths)
+ [pgtle.install\$1extension](#pgtle.install_extension)
+ [pgtle.install\$1update\$1path](#pgtle.install_update_path)
+ [pgtle.register\$1feature](#pgtle.register_feature)
+ [pgtle.register\$1feature\$1if\$1not\$1exists](#pgtle.register_feature_if_not_exists)
+ [pgtle.set\$1default\$1version](#pgtle.set_default_version)
+ [pgtle.uninstall\$1extension(name)](#pgtle.uninstall_extension-name)
+ [pgtle.uninstall\$1extension(name, version)](#pgtle.uninstall_extension-name-version)
+ [pgtle.uninstall\$1extension\$1if\$1exists](#pgtle.uninstall_extension_if_exists)
+ [pgtle.uninstall\$1update\$1path](#pgtle.uninstall_update_path)
+ [pgtle.uninstall\$1update\$1path\$1if\$1exists](#pgtle.uninstall_update_path_if_exists)
+ [pgtle.unregister\$1feature](#pgtle.unregister_feature)
+ [pgtle.unregister\$1feature\$1if\$1exists](#pgtle.unregister_feature_if_exists)

## pgtle.available\$1extensions
<a name="pgtle.available_extensions"></a>

`pgtle.available_extensions` 함수는 집합을 반환하는 함수입니다. 이 함수는 데이터베이스에서 사용 가능한 모든 TLE 확장을 반환합니다. 반환된 각 행에는 단일 TLE 확장에 대한 정보가 포함되어 있습니다.

### 함수 프로토타입
<a name="pgtle.available_extensions-prototype"></a>

```
pgtle.available_extensions()
```

### 역할
<a name="pgtle.available_extensions-role"></a>

없음.

### 인수
<a name="pgtle.available_extensions-arguments"></a>

없음.

### 출력
<a name="pgtle.available_extensions-output"></a>
+ `name` - TLE 확장의 이름입니다.
+ `default_version` - 버전을 지정하지 않고 `CREATE EXTENSION`을 호출할 때 사용할 TLE 확장의 버전입니다.
+ `description` - TLE 확장에 대한 자세한 설명입니다.

### 사용 예
<a name="pgtle.available_extensions-usage-example"></a>

```
SELECT * FROM pgtle.available_extensions();
```

## pgtle.available\$1extension\$1versions
<a name="pgtle.available_extension_versions"></a>

`available_extension_versions` 함수는 집합을 반환하는 함수입니다. 이 함수는 사용 가능한 모든 TLE 확장 및 버전의 목록을 반환합니다. 각 행에는 특정 역할이 필요한지 여부를 포함하여 지정된 TLE 확장의 특정 버전에 대한 정보가 포함되어 있습니다.

### 함수 프로토타입
<a name="pgtle.available_extension_versions-prototype"></a>

```
pgtle.available_extension_versions()
```

### 역할
<a name="pgtle.available_extension_versions-role"></a>

없음.

### 인수
<a name="pgtle.available_extension_versions-arguments"></a>

없음.

### 출력
<a name="pgtle.available_extension_versions-output"></a>
+ `name` - TLE 확장의 이름입니다.
+ `version` - TLE 확장의 버전입니다.
+ `superuser` - TLE 확장의 경우 이 값은 항상 `false`입니다. TLE 확장을 생성하거나 업데이트하는 데 필요한 권한은 지정된 데이터베이스에서 다른 객체를 만드는 데 필요한 권한과 동일합니다.
+ `trusted` - TLE 확장의 경우 이 값은 항상 `false`입니다.
+ `relocatable` - TLE 확장의 경우 이 값은 항상 `false`입니다.
+ `schema` - TLE 확장이 설치된 스키마의 이름을 지정합니다.
+ `requires` - 이 TLE 확장에 필요한 다른 확장의 이름을 포함하는 배열입니다.
+ `description` - TLE 확장에 대한 자세한 설명입니다.

출력 값에 대한 자세한 내용은 PostgreSQL 설명서에서 [Packaging Related Objects into an Extension > Extension Files](https://www.postgresql.org/docs/current/extend-extensions.html#id-1.8.3.20.11)를 참조하세요.

### 사용 예
<a name="pgtle.available_extension_versions-example"></a>

```
SELECT * FROM pgtle.available_extension_versions();
```

## pgtle.extension\$1update\$1paths
<a name="pgtle.extension_update_paths"></a>

`extension_update_paths` 함수는 집합을 반환하는 함수입니다. 이 함수는 TLE 확장에 가능한 모든 업데이트 경로 목록을 반환합니다. 각 행에는 해당 TLE 확장에 사용할 수 있는 업그레이드 또는 다운그레이드가 포함됩니다.

### 함수 프로토타입
<a name="pgtle.extension_update_paths-prototype"></a>

```
pgtle.extension_update_paths(name)
```

### 역할
<a name="pgtle.extension_update_paths-role"></a>

없음.

### 인수
<a name="pgtle.extension_update_paths-arguments"></a>

`name` - 업그레이드 경로를 가져올 TLE 확장의 이름입니다.

### 출력
<a name="pgtle.extension_update_paths-output"></a>
+ `source` - 업데이트의 소스 버전입니다.
+ `target` - 업데이트의 대상 버전입니다.
+ `path` - TLE 확장을 `source` 버전에서 `target` 버전으로 업데이트하는 데 사용되는 업그레이드 경로입니다(예: `0.1--0.2`).

### 사용 예
<a name="pgtle.extension_update_paths-example"></a>

```
SELECT * FROM pgtle.extension_update_paths('your-TLE');
```

## pgtle.install\$1extension
<a name="pgtle.install_extension"></a>

`install_extension` 함수를 사용하면 데이터베이스에 TLE 확장을 구성하는 아티팩트를 설치한 다음 `CREATE EXTENSION` 명령을 사용하여 TLE 확장을 생성할 수 있습니다.

### 함수 프로토타입
<a name="pgtle.install_extension-prototype"></a>

```
pgtle.install_extension(name text, version text, description text, ext text, requires text[] DEFAULT NULL::text[])
```

### 역할
<a name="pgtle.install_extension-role"></a>

없음.

### 인수
<a name="pgtle.install_extension-arguments"></a>
+ `name` - TLE 확장의 이름입니다. 이 값은 `CREATE EXTENSION` 호출에 사용됩니다.
+ `version` - TLE 확장의 버전입니다.
+ `description` - TLE 확장에 대한 자세한 설명입니다. 이 설명은 `pgtle.available_extensions()`의 `comment` 필드에 표시됩니다.
+ `ext` - TLE 확장의 콘텐츠입니다. 이 값에는 함수와 같은 객체가 포함됩니다.
+ `requires` - 이 TLE 확장의 종속성을 지정하는 선택적 파라미터입니다. `pg_tle` 확장은 종속성으로 자동 추가됩니다.

이러한 인수 중 다수는 PostgreSQL 인스턴스의 파일 시스템에 PostgreSQL 확장을 설치하기 위한 확장 제어 파일에 포함된 인수와 동일합니다. PostgreSQL 확장에 대한 자세한 내용은 PostgreSQL 설명서에서 [Packaging Related Objects into an Extension](https://www.postgresql.org/docs/current/extend-extensions.html)의 [Extension Files](http://www.postgresql.org/docs/current/extend-extensions.html#id-1.8.3.20.11)를 참조하세요.

### 출력
<a name="pgtle.install_extension-output"></a>

이 함수는 성공 시 `OK`를, 오류 시 `NULL`을 반환합니다.
+ `OK` - TLE 확장이 데이터베이스에 성공적으로 설치되었습니다.
+ `NULL` - TLE 확장이 데이터베이스에 성공적으로 설치되지 않았습니다.

### 사용 예
<a name="pgtle.install_extension-example"></a>

```
SELECT pgtle.install_extension(
 'pg_tle_test',
 '0.1',
 'My first pg_tle extension',
$_pgtle_$
  CREATE FUNCTION my_test()
  RETURNS INT
  AS $$
    SELECT 42;
  $$ LANGUAGE SQL IMMUTABLE;
$_pgtle_$
);
```

## pgtle.install\$1update\$1path
<a name="pgtle.install_update_path"></a>

`install_update_path` 함수는 서로 다른 두 버전의 TLE 확장 간의 업데이트 경로를 제공합니다. 이 함수를 사용하면 TLE 확장의 사용자가 `ALTER EXTENSION ... UPDATE` 구문을 사용하여 버전을 업데이트할 수 있습니다.

### 함수 프로토타입
<a name="pgtle.install_update_path-prototype"></a>

```
pgtle.install_update_path(name text, fromvers text, tovers text, ext text)
```

### 역할
<a name="pgtle.install_update_path-role"></a>

`pgtle_admin`

### 인수
<a name="pgtle.install_update_path-arguments"></a>
+ `name` - TLE 확장의 이름입니다. 이 값은 `CREATE EXTENSION` 호출에 사용됩니다.
+ `fromvers` - 업그레이드를 위한 TLE 확장의 소스 버전입니다.
+ `tovers` - 업그레이드를 위한 TLE 확장의 대상 버전입니다.
+ `ext` - 업데이트의 콘텐츠입니다. 이 값에는 함수와 같은 객체가 포함됩니다.

### 출력
<a name="pgtle.install_update_path-output"></a>

없음.

### 사용 예
<a name="pgtle.install_update_path-example"></a>

```
SELECT pgtle.install_update_path('pg_tle_test', '0.1', '0.2',
  $_pgtle_$
    CREATE OR REPLACE FUNCTION my_test()
    RETURNS INT
    AS $$
      SELECT 21;
    $$ LANGUAGE SQL IMMUTABLE;
  $_pgtle_$
);
```

## pgtle.register\$1feature
<a name="pgtle.register_feature"></a>

`register_feature` 함수는 지정된 내부 PostgreSQL 기능을 `pgtle.feature_info` 테이블에 추가합니다. PostgreSQL 후크는 내부 PostgreSQL 기능의 예입니다. 신뢰할 수 있는 언어 확장 개발 키트는 PostgreSQL 후크 사용을 지원합니다. 현재 이 함수는 다음 기능을 지원합니다.
+ `passcheck` - PostgreSQL의 암호 확인 동작을 사용자 지정하는 프로시저 또는 함수에 암호 확인 후크를 등록합니다.

### 함수 프로토타입
<a name="pgtle.register_feature-prototype"></a>

```
pgtle.register_feature(proc regproc, feature pg_tle_feature)
```

### 역할
<a name="pgtle.register_feature-role"></a>

`pgtle_admin` 

### 인수
<a name="pgtle.register_feature-arguments"></a>
+ `proc` - 기능에 사용할 저장 프로시저 또는 함수의 이름입니다.
+ `feature` - 함수에 등록할 `pg_tle` 기능(예: `passcheck`)의 이름입니다.

### 출력
<a name="pgtle.register_feature-output"></a>

없음.

### 사용 예
<a name="pgtle.register_feature-example"></a>

```
SELECT pgtle.register_feature('pw_hook', 'passcheck');
```

## pgtle.register\$1feature\$1if\$1not\$1exists
<a name="pgtle.register_feature_if_not_exists"></a>

`pgtle.register_feature_if_not_exists` 함수는 지정된 PostgreSQL 기능을 `pgtle.feature_info` 테이블에 추가하고 해당 기능을 사용하는 TLE 확장 또는 기타 프로시저나 함수를 식별합니다. 후크 및 신뢰할 수 있는 언어 확장에 대한 자세한 내용은 [TLE 확장과 함께 PostgreSQL 후크 사용](PostgreSQL_trusted_language_extension.overview.tles-and-hooks.md) 섹션을 참조하세요.

### 함수 프로토타입
<a name="pgtle.register_feature_if_not_exists-prototype"></a>

```
pgtle.register_feature_if_not_exists(proc regproc, feature pg_tle_feature)
```

### 역할
<a name="pgtle.register_feature_if_not_exists-role"></a>

`pgtle_admin` 

### 인수
<a name="pgtle.register_feature_if_not_exists-arguments"></a>
+ `proc` - TLE 확장을 위한 기능으로 사용할 로직(코드)이 포함된 저장 프로시저 또는 함수의 이름입니다. `pw_hook` 코드가 그 예입니다.
+ `feature` - TLE 함수에 등록할 PostgreSQL 기능의 이름입니다. 현재 사용 가능한 기능은 `passcheck` 후크뿐입니다. 자세한 내용은 [암호-확인 후크(passcheck)](PostgreSQL_trusted_language_extension-hooks-reference.md#passcheck_hook) 단원을 참조하십시오.

### 출력
<a name="pgtle.register_feature_if_not_exists-output"></a>

지정된 확장에 대한 기능을 등록한 후 `true`를 반환합니다. 기능이 이미 등록된 경우 `false`를 반환합니다.

### 사용 예
<a name="pgtle.register_feature_if_not_exists-example"></a>

```
SELECT pgtle.register_feature_if_not_exists('pw_hook', 'passcheck');
```

## pgtle.set\$1default\$1version
<a name="pgtle.set_default_version"></a>

`set_default_version` 함수를 사용하면 TLE 확장의 `default_version`을 지정할 수 있습니다. 이 함수를 사용하여 업그레이드 경로를 정의하고 해당 버전을 TLE 확장의 기본값으로 지정할 수 있습니다. 데이터베이스 사용자가 `CREATE EXTENSION` 및 `ALTER EXTENSION ... UPDATE` 명령에서 TLE 확장을 지정하면 해당 버전의 TLE 확장이 해당 사용자의 데이터베이스에 생성됩니다.

이 함수는 성공 시 `true`를 반환합니다. `name` 인수에 지정된 TLE 확장자가 없는 경우에는 함수가 오류를 반환합니다. 마찬가지로 TLE 확장의 `version`이 존재하지 않으면 오류가 반환됩니다.

### 함수 프로토타입
<a name="pgtle.set_default_version-prototype"></a>

```
pgtle.set_default_version(name text, version text)
```

### 역할
<a name="pgtle.set_default_version-role"></a>

`pgtle_admin`

### 인수
<a name="pgtle.set_default_version-arguments"></a>
+ `name` - TLE 확장의 이름입니다. 이 값은 `CREATE EXTENSION` 호출에 사용됩니다.
+ `version` - 기본값을 설정할 TLE 확장의 버전입니다.

### 출력
<a name="pgtle.set_default_version-output"></a>
+ `true` - 기본 버전 설정에 성공하면 함수가 `true`를 반환합니다.
+ `ERROR` - 지정된 이름 또는 버전의 TLE 확장이 존재하지 않는 경우 오류 메시지를 반환합니다.

### 사용 예
<a name="pgtle.set_default_version-example"></a>

```
SELECT * FROM pgtle.set_default_version('my-extension', '1.1');
```

## pgtle.uninstall\$1extension(name)
<a name="pgtle.uninstall_extension-name"></a>

`uninstall_extension` 함수는 데이터베이스에서 TLE 확장의 모든 버전을 제거합니다. 이 함수는 `CREATE EXTENSION`의 이후 호출이 TLE 확장을 설치하는것을 방지합니다. 데이터베이스에 TLE 확장자가 없으면 오류가 발생합니다.

`uninstall_extension` 함수는 현재 데이터베이스에서 활성 상태인 TLE 확장은 제거하지 않습니다. 현재 활성 상태인 TLE 확장을 제거하려면 명시적으로 `DROP EXTENSION`을 호출하여 제거해야 합니다.

### 함수 프로토타입
<a name="pgtle.uninstall_extension-name-prototype"></a>

```
pgtle.uninstall_extension(extname text)
```

### 역할
<a name="pgtle.uninstall_extension-name-role"></a>

`pgtle_admin`

### 인수
<a name="pgtle.uninstall_extension-name-arguments"></a>
+ `extname` - 제거할 TLE 확장의 이름입니다. 이 이름은 지정된 데이터베이스에서 사용할 TLE 확장을 로드하기 위해 `CREATE EXTENSION`과 함께 사용되는 이름과 같습니다.

### 출력
<a name="pgtle.uninstall_extension-name-output"></a>

없음.

### 사용 예
<a name="pgtle.uninstall_extension-name-example"></a>

```
SELECT * FROM pgtle.uninstall_extension('pg_tle_test');
```

## pgtle.uninstall\$1extension(name, version)
<a name="pgtle.uninstall_extension-name-version"></a>

`uninstall_extension(name, version)` 함수는 지정된 버전의 TLE 확장을 데이터베이스에서 제거합니다. 이 기능은 `CREATE EXTENSION` 및 `ALTER EXTENSION`이 TLE 확장을 설치하거나 지정된 버전으로 업데이트하는 것을 방지합니다. 이 함수는 TLE 확장의 모든 업데이트 경로도 제공합니다. 이 함수는 현재 데이터베이스에서 활성 상태인 TLE 확장은 제거하지 않습니다. TLE 확장을 제거하려면 명시적으로 `DROP EXTENSION`을 호출해야 합니다. TLE 확장의 모든 버전을 제거하려면 [pgtle.uninstall\$1extension(name)](#pgtle.uninstall_extension-name)을 참조하세요.

### 함수 프로토타입
<a name="pgtle.uninstall_extension-name-version-prototype"></a>

```
pgtle.uninstall_extension(extname text, version text)
```

### 역할
<a name="pgtle.uninstall_extension-name-version-role"></a>

`pgtle_admin`

### 인수
<a name="pgtle.uninstall_extension-name-version-arguments"></a>
+ `extname` - TLE 확장의 이름입니다. 이 값은 `CREATE EXTENSION` 호출에 사용됩니다.
+ `version` - 데이터베이스에서 제거할 TLE 확장의 버전입니다.

### 출력
<a name="pgtle.uninstall_extension-name-version-output"></a>

없음.

### 사용 예
<a name="pgtle.uninstall_extension-name-version-example"></a>

```
SELECT * FROM pgtle.uninstall_extension('pg_tle_test', '0.2');
```

## pgtle.uninstall\$1extension\$1if\$1exists
<a name="pgtle.uninstall_extension_if_exists"></a>

`uninstall_extension_if_exists` 함수는 지정된 데이터베이스에서 TLE 확장의 모든 버전을 제거합니다. TLE 확장자가 존재하지 않는 경우 함수는 아무것도 반환하지 않습니다(오류 메시지가 표시되지 않음). 지정된 확장이 현재 데이터베이스 내에서 활성 상태인 경우 이 함수는 해당 확장을 삭제하지 않습니다. 이 함수를 사용하여 아티팩트를 제거하려면 먼저 명시적으로 `DROP EXTENSION`을 호출하여 TLE 확장을 제거해야 합니다.

### 함수 프로토타입
<a name="pgtle.uninstall_extension_if_exists-prototype"></a>

```
pgtle.uninstall_extension_if_exists(extname text)
```

### 역할
<a name="pgtle.uninstall_extension_if_exists-role"></a>

`pgtle_admin`

### 인수
<a name="pgtle.uninstall_extension_if_exists-arguments"></a>
+ `extname` - TLE 확장의 이름입니다. 이 값은 `CREATE EXTENSION` 호출에 사용됩니다.

### 출력
<a name="pgtle.uninstall_extension_if_exists-output"></a>

`uninstall_extension_if_exists` 함수는 지정된 확장을 제거한 `true`를 반환합니다. 지정된 확장이 없는 경우 함수는 `false`를 반환합니다.
+ `true` - TLE 확장을 제거한 후 `true`를 반환합니다.
+ `false` - 데이터베이스에 TLE 확장자가 없으면 `false`를 반환합니다.

### 사용 예
<a name="pgtle.uninstall_extension_if_exists-example"></a>

```
SELECT * FROM pgtle.uninstall_extension_if_exists('pg_tle_test');
```

## pgtle.uninstall\$1update\$1path
<a name="pgtle.uninstall_update_path"></a>

`uninstall_update_path` 함수는 TLE 확장에서 특정 업데이트 경로를 제거합니다. 이렇게 하면 `ALTER EXTENSION ... UPDATE TO`가 이 경로를 업데이트 경로로 사용할 수 없습니다.

이 업데이트 경로의 버전 중 하나가 현재 사용 중인 TLE 확장은 데이터베이스에 남아 있습니다.

지정한 업데이트 경로가 존재하지 않는 경우 이 함수는 오류를 반환합니다.

### 함수 프로토타입
<a name="pgtle.uninstall_update_path-prototype"></a>

```
pgtle.uninstall_update_path(extname text, fromvers text, tovers text)
```

### 역할
<a name="pgtle.uninstall_update_path-role"></a>

`pgtle_admin`

### 인수
<a name="pgtle.uninstall_update_path-arguments"></a>
+ `extname` - TLE 확장의 이름입니다. 이 값은 `CREATE EXTENSION` 호출에 사용됩니다.
+ `fromvers` - 업데이트 경로에서 사용할 TLE 확장의 소스 버전입니다.
+  `tovers` - 업데이트 경로에서 사용할 TLE 확장의 대상 버전입니다.

### 출력
<a name="pgtle.uninstall_update_path-output"></a>

없음.

### 사용 예
<a name="pgtle.uninstall_update_path-example"></a>

```
SELECT * FROM pgtle.uninstall_update_path('pg_tle_test', '0.1', '0.2');
```

## pgtle.uninstall\$1update\$1path\$1if\$1exists
<a name="pgtle.uninstall_update_path_if_exists"></a>

`uninstall_update_path_if_exists` 함수는 TLE 확장에서 지정된 업데이트 경로를 제거한다는 점에서 `uninstall_update_path`와 비슷합니다. 하지만 업데이트 경로가 존재하지 않는 경우 이 함수는 오류 메시지를 표시하지 않습니다. 대신 함수는 `false`를 반환합니다.

### 함수 프로토타입
<a name="pgtle.uninstall_update_path_if_exists-prototype"></a>

```
pgtle.uninstall_update_path_if_exists(extname text, fromvers text, tovers text)
```

### 역할
<a name="pgtle.uninstall_update_path_if_exists-role"></a>

`pgtle_admin`

### 인수
<a name="pgtle.uninstall_update_path_if_exists-arguments"></a>
+ `extname` - TLE 확장의 이름입니다. 이 값은 `CREATE EXTENSION` 호출에 사용됩니다.
+ `fromvers` - 업데이트 경로에서 사용할 TLE 확장의 소스 버전입니다.
+ `tovers` - 업데이트 경로에서 사용할 TLE 확장의 대상 버전입니다.

### 출력
<a name="pgtle.uninstall_update_path_if_exists-output"></a>
+ `true` - 함수가 TLE 확장 경로를 성공적으로 업데이트했습니다.
+ `false` - 함수가 TLE 확장의 경로를 업데이트하지 못했습니다.

### 사용 예
<a name="pgtle.uninstall_update_path_if_exists-example"></a>

```
SELECT * FROM pgtle.uninstall_update_path_if_exists('pg_tle_test', '0.1', '0.2');
```

## pgtle.unregister\$1feature
<a name="pgtle.unregister_feature"></a>

`unregister_feature` 함수는 후크 등 `pg_tle` 기능을 사용하도록 등록된 함수를 제거하는 방법을 제공합니다. 기능 등록에 대한 자세한 내용은 [pgtle.register\$1feature](#pgtle.register_feature) 섹션을 참조하세요.

### 함수 프로토타입
<a name="pgtle.unregister_feature-prototype"></a>

```
pgtle.unregister_feature(proc regproc, feature pg_tle_features)
```

### 역할
<a name="pgtle.unregister_feature-role"></a>

`pgtle_admin`

### 인수
<a name="pgtle.unregister_feature-arguments"></a>
+ `proc` - `pg_tle` 기능에 등록할 저장된 함수의 이름입니다.
+ `feature` - 함수에 등록할 `pg_tle` 기능의 이름입니다. 예를 들어 `passcheck`는 개발하는 신뢰할 수 있는 언어 확장에서 사용하도록 등록할 수 있는 기능입니다. 자세한 내용은 [암호-확인 후크(passcheck)](PostgreSQL_trusted_language_extension-hooks-reference.md#passcheck_hook) 단원을 참조하십시오.

### 출력
<a name="pgtle.unregister_feature-output"></a>

없음.

### 사용 예
<a name="pgtle.unregister_feature-example"></a>

```
SELECT * FROM pgtle.unregister_feature('pw_hook', 'passcheck');
```

## pgtle.unregister\$1feature\$1if\$1exists
<a name="pgtle.unregister_feature_if_exists"></a>

`unregister_feature` 함수는 후크 등 `pg_tle` 기능을 사용하도록 등록된 함수를 제거하는 방법을 제공합니다. 자세한 내용은 [TLE 확장과 함께 PostgreSQL 후크 사용](PostgreSQL_trusted_language_extension.overview.tles-and-hooks.md) 단원을 참조하십시오. 기능을 성공적으로 등록 취소한 후 `true`를 반환합니다. 기능이 등록되지 않은 경우 `false`를 반환합니다.

TLE 확장의 `pg_tle` 기능 등록에 대한 자세한 내용은 [pgtle.register\$1feature](#pgtle.register_feature) 섹션을 참조하세요.

### 함수 프로토타입
<a name="pgtle.unregister_feature_if_exists-prototype"></a>

```
pgtle.unregister_feature_if_exists('proc regproc', 'feature pg_tle_features')
```

### 역할
<a name="pgtle.unregister_feature_if_exists-role"></a>

`pgtle_admin`

### 인수
<a name="pgtle.unregister_feature_if_exists-arguments"></a>
+ `proc` - `pg_tle` 기능을 포함하도록 등록된 저장된 함수의 이름입니다.
+ `feature` - 신뢰할 수 있는 언어 확장에 등록된 `pg_tle` 기능의 이름입니다.

### 출력
<a name="pgtle.unregister_feature_if_exists-output"></a>

다음과 같이 `true` 또는`false`를 반환합니다.
+ `true` - 함수가 확장에서 성공적으로 기능 등록을 취소했습니다.
+ `false` - 함수가 TLE 확장에서 기능을 등록 취소하지 못했습니다.

### 사용 예
<a name="pgtle.unregister_feature_if_exists-example"></a>

```
SELECT * FROM pgtle.unregister_feature_if_exists('pw_hook', 'passcheck');
```

# PostgreSQL용 신뢰할 수 있는 언어 확장에 대한 후크 참조
<a name="PostgreSQL_trusted_language_extension-hooks-reference"></a>

PostgreSQL용 신뢰할 수 있는 언어 확장은 PostgreSQL 후크를 지원합니다. *후크*는 PostgreSQL의 핵심 기능을 확장하기 위해 개발자가 사용할 수 있는 내부 콜백 메커니즘입니다. 개발자는 후크를 사용하여 다양한 데이터베이스 작업 중에 사용할 자체 함수 또는 프로시저를 구현하여 PostgreSQL의 동작을 일정 방식으로 수정할 수 있습니다. 예를 들어 `passcheck` 후크를 사용하면 사용자(역할)의 암호를 생성하거나 변경할 때 제공된 암호를 PostgreSQL이 처리하는 방법을 사용자 지정할 수 있습니다.

TLE 확장에 사용할 수 있는 암호 확인 후크에 대해 알아보려면 다음 설명서를 참조하세요. 클라이언트 인증 후크를 포함하여 사용 가능한 후크에 대한 자세한 내용은 [Trusted Language Extensions hooks](https://github.com/aws/pg_tle/blob/main/docs/04_hooks.md)를 참조하세요.

## 암호-확인 후크(passcheck)
<a name="passcheck_hook"></a>

`passcheck` 후크는 다음 SQL 명령 및 `psql` 메타 명령에 대한 암호 확인 프로세스 도중 PostgreSQL 동작을 사용자 지정하는 데 사용됩니다.
+ `CREATE ROLE username ...PASSWORD` - 자세한 내용은 PostgreSQL 설명서의 [CREATE ROLE](https://www.postgresql.org/docs/current/sql-createrole.html)을 참조하세요.
+ `ALTER ROLE username...PASSWORD` - 자세한 내용은 PostgreSQL 설명서의 [ALTER ROLE](https://www.postgresql.org/docs/current/sql-alterrole.html)을 참조하세요.
+ `\password username` - 이 대화형 `psql` 메타 명령은 `ALTER ROLE ... PASSWORD` 구문을 투명하게 사용하기 전에 암호를 해시하여 지정된 사용자의 암호를 안전하게 변경합니다. 메타 명령은 `ALTER ROLE ... PASSWORD` 명령의 보안 래퍼이므로 후크는 `psql` 메타 명령의 동작에 적용됩니다.

문제 해결 예는 [암호 확인 후크 코드 목록](PostgreSQL_trusted_language_extension.overview.tles-and-hooks.md#PostgreSQL_trusted_language_extension-example-hook_code_listing)을(를) 참조하세요.

**Contents**
+ [함수 프로토타입](#passcheck_hook-prototype)
+ [인수](#passcheck_hook-arguments)
+ [구성](#passcheck_hook-configuration)
+ [사용 노트](#passcheck_hook-usage)

### 함수 프로토타입
<a name="passcheck_hook-prototype"></a>

```
passcheck_hook(username text, password text, password_type pgtle.password_types, valid_until timestamptz, valid_null boolean)
```

### 인수
<a name="passcheck_hook-arguments"></a>

`passcheck` 후크 함수는 다음 인수를 사용합니다.
+ `username` - 암호를 설정하는 역할(사용자 이름)의 이름(텍스트)입니다.
+ `password` - 일반 텍스트 또는 해시된 암호입니다. 입력한 암호는 `password_type`에서 지정한 유형과 일치해야 합니다.
+ `password_type` - 암호의 `pgtle.password_type` 형식을 지정합니다. 이 형식은 다음 옵션 중 하나일 수 있습니다.
  + `PASSWORD_TYPE_PLAINTEXT` - 일반 텍스트 암호입니다.
  + `PASSWORD_TYPE_MD5` - MD5(message digest 5) 알고리즘을 사용하여 해시된 암호입니다.
  + `PASSWORD_TYPE_SCRAM_SHA_256` - SCRAM-SHA-256 알고리즘을 사용하여 해시된 암호입니다.
+ `valid_until` - 암호가 무효가 되는 시간을 지정합니다. 이 인수는 선택 사항입니다. 이 인수를 사용하는 경우 시간을 `timestamptz` 값으로 지정하세요.
+ `valid_null` - 이 부울이 `true`로 설정된 경우 `valid_until` 옵션은 `NULL`로 설정됩니다.

### 구성
<a name="passcheck_hook-configuration"></a>

함수 `pgtle.enable_password_check`는 암호 확인 후크가 활성 상태인지 여부를 제어합니다. 암호 확인 후크에서 세 가지 설정이 가능합니다.
+ `off` - `passcheck` 암호 확인 후크를 해제합니다. 이것이 기본값입니다.
+ `on` - 테이블과 비교해 암호를 검사할 수 있도록 `passcode` 암호 확인 후크를 켭니다.
+ `require` - 암호 확인 후크를 정의해야 합니다.

### 사용 노트
<a name="passcheck_hook-usage"></a>

`passcheck` 후크를 켜거나 해제하려면 RDS for PostgreSQL DB 인스턴스에 대한 사용자 지정 DB 파라미터 그룹을 수정해야 합니다.

대상 LinuxmacOS, 또는Unix:

```
aws rds modify-db-parameter-group \
    --region aws-region \
    --db-parameter-group-name your-custom-parameter-group \
    --parameters "ParameterName=pgtle.enable_password_check,ParameterValue=on,ApplyMethod=immediate"
```

Windows의 경우:

```
aws rds modify-db-parameter-group ^
    --region aws-region ^
    --db-parameter-group-name your-custom-parameter-group ^
    --parameters "ParameterName=pgtle.enable_password_check,ParameterValue=on,ApplyMethod=immediate"
```