

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# 를 사용하여 Microsoft SQL Server 연결 AWS Schema Conversion Tool
<a name="CHAP_Source.SQLServer"></a>

 AWS SCT 를 사용하여 스키마, 데이터베이스 코드 객체 및 애플리케이션 코드를 SQL Server에서 다음 대상으로 변환할 수 있습니다.
+ Amazon RDS for MySQL
+ Amazon Aurora MySQL 호환 버전
+ Amazon RDS for PostgreSQL
+ Amazon Aurora PostgreSQL 호환 에디션
+ Amazon RDS for SQL Server
+ Amazon RDS for MariaDB

**참고**  
AWS SCT 는 Amazon RDS for SQL 서버를 소스로 사용하는 것을 지원하지 않습니다.

 AWS SCT 를 사용하여 다음에 설명된 대로 SQL Server에서 Babelfish for Aurora PostgreSQL로 스키마, 데이터베이스 코드 객체 및 애플리케이션 코드를 마이그레이션하기 위한 평가 보고서를 생성할 수 있습니다.

**Topics**
+ [Microsoft SQL Server를 소스로 사용하기 위한 권한](#CHAP_Source.SQLServer.Permissions)
+ [Microsoft SQL Server를 소스로 사용할 때 Windows 인증 사용](#CHAP_Source.SQLServer.Permissions.WinAuth)
+ [SQL Server에 소스 연결](#CHAP_Source.SQLServer.Connecting)
+ [SQL Server를 MySQL로 변환](CHAP_Source.SQLServer.ToMySQL.md)
+ [를 사용하여 SQL Server에서 PostgreSQL로 마이그레이션 AWS Schema Conversion Tool](CHAP_Source.SQLServer.ToPostgreSQL.md)
+ [를 사용하여 SQL Server에서 Amazon RDS for SQL Server로 마이그레이션 AWS Schema Conversion Tool](CHAP_Source.SQLServer.ToRDSSQLServer.md)

## Microsoft SQL Server를 소스로 사용하기 위한 권한
<a name="CHAP_Source.SQLServer.Permissions"></a>

Microsoft SQL Server를 소스로 사용하기 위해 필요한 권한은 다음과 같습니다.
+ VIEW DEFINITION
+ VIEW DATABASE STATE

권한을 사용하면 퍼블릭 액세스 권한이 있는 사용자가 객체 `VIEW DEFINITION` 정의를 볼 수 있습니다. `VIEW DATABASE STATE`는 권한을 AWS SCT 사용하여 SQL Server Enterprise 에디션의 기능을 확인할 수 있습니다.

변환하려는 스키마의 각 데이터베이스에 대해 권한 부여를 반복합니다.

또한 `master` 데이터베이스에 다음 권한을 부여합니다.
+ VIEW SERVER STATE
+ VIEW ANY DEFINITION

AWS SCT 는 `VIEW SERVER STATE` 권한을 사용하여 서버 설정 및 구성을 수집합니다. 엔드포인트를 보려면 `VIEW ANY DEFINITION` 권한을 부여해야 합니다.

Microsoft Analysis Services에 관한 정보를 읽으려면 `master` 데이터베이스에서 다음 명령을 실행합니다.

```
EXEC master..sp_addsrvrolemember @loginame = N'<user_name>', @rolename = N'sysadmin'
```

이전 예제에서 `<user_name>` 자리 표시자를 이전에 권한을 부여한 사용자의 이름으로 바꿉니다.

SQL Server 에이전트에 관한 정보를 읽으려면 사용자를 `SQLAgentUser` 역할에 추가합니다. `msdb` 데이터베이스에서 다음 명령을 실행합니다.

```
EXEC sp_addrolemember <SQLAgentRole>, <user_name>;
```

앞의 예제에서 `<SQLAgentRole>` 자리 표시자를 SQL Server 에이전트 역할의 이름으로 바꿉니다. 그런 다음, `<user_name>` 자리 표시자를 이전에 권한을 부여한 사용자의 이름으로 바꿉니다. 자세한 내용은 *Amazon RDS 사용 설명서*의 [SQLAgentUser 역할에 사용자 추가](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Appendix.SQLServer.CommonDBATasks.Agent.html#SQLServerAgent.AddUser)를 참조하세요.

로그 전달을 감지하려면 `msdb` 데이터베이스에 대한 `SELECT on dbo.log_shipping_primary_databases` 권한을 부여합니다.

DDL 복제의 알림 방식을 사용하려면 소스 데이터베이스에 대해 `RECEIVE ON <schema_name>.<queue_name>` 권한을 부여합니다. 이 예제에서는 `<schema_name>` 자리 표시자를 데이터베이스의 스키마 이름으로 바꿉니다. 그런 다음, `<queue_name>` 자리 표시자를 대기열 테이블 이름으로 바꿉니다.

## Microsoft SQL Server를 소스로 사용할 때 Windows 인증 사용
<a name="CHAP_Source.SQLServer.Permissions.WinAuth"></a>

Windows 기반 인트라넷에서 애플리케이션을 실행하는 경우 데이터베이스 액세스에 Windows 인증을 사용할 수 있습니다. Windows 인증은 운영 체제 스레드에 설정된 현재 Windows ID를 사용하여 SQL Server 데이터베이스에 액세스합니다. 그런 다음 Windows ID를 SQL Server 데이터베이스 및 권한에 매핑할 수 있습니다. Windows 인증을 사용하여 SQL Server에 연결하려면 애플리케이션에서 사용하는 Windows ID를 지정해야 합니다. 또한 SQL Server 데이터베이스에 대한 Windows ID 액세스 권한을 부여해야 합니다.

SQL Server에는 Windows 인증 모드와 혼합 모드의 두 가지 액세스 모드가 있습니다. Windows 인증 모드에서는 Windows 인증을 활성화하고 SQL Server 인증을 비활성화합니다. 혼합 모드에서는 Windows 인증과 SQL Server 인증을 모두 사용할 수 있습니다. Windows 인증은 항상 사용할 수 있으며 비활성화할 수 없습니다. Windows 인증에 대한 자세한 내용은 Microsoft Windows 설명서를 참조하세요.

다음은 TEST\$1DB에 사용자를 생성하는 것을 보여주는 예입니다.

```
USE [TEST_DB]
CREATE USER [TestUser] FOR LOGIN [TestDomain\TestUser]
GRANT VIEW DEFINITION TO [TestUser]
GRANT VIEW DATABASE STATE TO [TestUser]
```

### JDBC 연결에서 Windows 인증 사용
<a name="CHAP_Source.SQLServer.Permissions.WinAuth.JDBC"></a>

JDBC 드라이버는 Windows 이외의 운영 체제에서 사용되는 경우 Windows 인증을 지원하지 않습니다. Windows 이외의 운영 체제에서 SQL Server에 연결할 때는 사용자 이름 및 암호와 같은 Windows 인증 보안 인증 정보가 자동으로 지정되지 않습니다. 이 경우 애플리케이션은 SQL Server 인증을 대신 사용해야 합니다.

JDBC 연결 문자열에서 Windows 인증을 사용하여 연결하려면 `integratedSecurity` 파라미터를 지정해야 합니다. JDBC 드라이버는 `integratedSecurity` 연결 문자열 파라미터를 통해 Windows 운영 체제에서 Windows 통합 인증을 지원합니다.

통합 인증을 사용하려면

1. JDBC 드라이버를 설치합니다.

1. JDBC 드라이버가 설치된 컴퓨터의 Windows 시스템 경로에 있는 디렉터리에 `sqljdbc_auth.dll` 파일을 복사합니다.

   `sqljdbc_auth.dll` 파일은 다음 위치에 설치됩니다.

   <installation directory>\$1sqljdbc\$1<version>\$1<language>\$1auth\$1******

Windows 인증을 사용하여 SQL Server 데이터베이스에 연결을 시도하는 경우 "이 드라이버는 통합 인증에 맞게 구성되지 않았습니다"라는 오류가 발생할 수 있습니다. 이 문제는 다음 작업을 수행하여 해결할 수 있습니다.
+ 다음과 같이 JDBC 설치 경로를 가리키는 두 가지 변수를 선언합니다.

   `variable name: SQLJDBC_HOME; variable value: D:\lib\JDBC4.1\enu`(sqljdbc4.jar이 있는 위치);

  `variable name: SQLJDBC_AUTH_HOME; variable value: D\lib\JDBC4.1\enu\auth\x86`(32비트 OS를 실행하는 경우) 또는 `D\lib\JDBC4.1\enu\auth\x64`(64비트 OS를 실행하는 경우). `sqljdbc_auth.dll`이 있는 위치입니다.
+ JDK/JRE가 실행 중인 폴더에 `sqljdbc_auth.dll`을 복사합니다. lib 폴더, bin 폴더 등에 복사할 수 있습니다. 예를 들어 다음 폴더에 복사할 수 있습니다.

  ```
  [JDK_INSTALLED_PATH]\bin;
  [JDK_INSTALLED_PATH]\jre\bin;
  [JDK_INSTALLED_PATH]\jre\lib;
  [JDK_INSTALLED_PATH]\lib;
  ```
+ JDBC 라이브러리 폴더에는 SQLJDBC4.jar 파일만 있어야 합니다. 이 폴더에서 다른 sqljdbc\$1.jar 파일을 모두 제거(또는 다른 폴더로 복사)합니다. 드라이버를 프로그램의 일부로 추가하는 경우 사용할 드라이버로 SQLJDBC4.jar만 추가해야 합니다.
+ 애플리케이션의 해당 폴더에 sqljdbc\$1auth.dll 파일을 복사합니다.

**참고**  
32비트 Java Virtual Machine(JVM)을 실행 중인 경우 x86 폴더에 있는 sqljdbc\$1auth.dll 파일을 사용합니다. 이는 운영 체제가 x64 버전인 경우에도 마찬가지입니다. x64 프로세서에서 64비트 JVM을 실행하는 경우에 x64 폴더의 sqljdbc\$1auth.dll 파일을 사용합니다.

SQL Server 데이터베이스에 연결할 때 **인증** 옵션으로 **Windows 인증** 또는 **SQL Server 인증**을 선택할 수 있습니다.

## SQL Server에 소스 연결
<a name="CHAP_Source.SQLServer.Connecting"></a>

다음 절차에 따라 AWS Schema Conversion Tool을 사용하여 Microsoft SQL Server 소스 데이터베이스에 연결합니다.

**Microsoft SQL Server 소스 데이터베이스에 연결하려면**

1. 에서 **소스 추가**를 AWS Schema Conversion Tool선택합니다.

1. **Microsoft SQL Server**를 선택한 후 **다음**을 선택합니다.

   **소스 추가** 대화 상자가 나타납니다.

1. **연결 이름**에 데이터베이스의 이름을 입력합니다. AWS SCT 는 왼쪽 패널의 트리에 이 이름을 표시합니다.

1. 에서 데이터베이스 자격 증명을 사용하거나 수동으로 AWS Secrets Manager 입력합니다.
   + Secrets Manager의 데이터베이스 보안 인증 정보를 사용하려면 다음 지침을 따릅니다.

     1. **AWS Secret**에서 보안 암호의 이름을 선택합니다.

     1. **Populate**를 선택하여 Secrets Manager에서 데이터베이스 연결 대화 상자에 있는 모든 값을 자동으로 채웁니다.

     Secrets Manager의 데이터베이스 보안 인증 사용에 대한 자세한 내용은 [AWS Secrets Manager 에서 구성 AWS Schema Conversion Tool](CHAP_UserInterface.SecretsManager.md) 섹션을 참조하세요.
   + Microsoft SQL Server 소스 데이터베이스 연결 정보를 수동으로 입력하려면 다음 지침을 사용합니다.  
****    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/SchemaConversionTool/latest/userguide/CHAP_Source.SQLServer.html)

1. **연결 테스트를** 선택하여가 소스 데이터베이스에 연결할 AWS SCT 수 있는지 확인합니다.

1. **연결**을 선택하여 소스 데이터베이스에 연결합니다.

# SQL Server를 MySQL로 변환
<a name="CHAP_Source.SQLServer.ToMySQL"></a>

변환된 MySQL 코드에서 Microsoft SQL Server 데이터베이스 함수를 에뮬레이션하려면 AWS SCT에서 SQL Server-MySQL 확장 팩을 사용합니다. 확장 팩에 대한 자세한 내용은 [에서 확장 팩 사용 AWS Schema Conversion Tool](CHAP_ExtensionPack.md) 섹션을 참조하세요.

**Topics**
+ [MySQL을 대상 데이터베이스로 사용하기 위한 권한](#CHAP_Source.SQLServer.ToMySQL.ConfigureTarget)
+ [SQL Server에서 MySQL로의 변환 설정](#CHAP_Source.SQLServer.ToMySQL.ConversionSettings)
+ [마이그레이션 고려 사항](#CHAP_Source.SQLServer.ToMySQL.MigrationConsiderations)

## MySQL을 대상 데이터베이스로 사용하기 위한 권한
<a name="CHAP_Source.SQLServer.ToMySQL.ConfigureTarget"></a>

MySQL을 대상으로 사용하기 위해 필요한 권한은 다음과 같습니다.
+ CREATE ON \$1.\$1
+ ALTER ON \$1.\$1
+ DROP ON \$1.\$1
+ INDEX ON \$1.\$1
+ REFERENCES ON \$1.\$1
+ SELECT ON \$1.\$1
+ CREATE VIEW ON \$1.\$1
+ SHOW VIEW ON \$1.\$1
+ TRIGGER ON \$1.\$1
+ CREATE ROUTINE ON \$1.\$1
+ ALTER ROUTINE ON \$1.\$1
+ EXECUTE ON \$1.\$1
+ INSERT, UPDATE ON AWS\$1SQLSERVER\$1EXT.\$1
+ INSERT, UPDATE, DELETE ON AWS\$1SQLSERVER\$1EXT\$1DATA.\$1
+ CREATE TEMPORARY TABLES ON AWS\$1SQLSERVER\$1EXT\$1DATA.\$1

다음 코드 예제를 사용하여 데이터베이스 사용자를 생성하고 권한을 부여할 수 있습니다.

```
CREATE USER 'user_name' IDENTIFIED BY 'your_password';
GRANT CREATE ON *.* TO 'user_name';
GRANT ALTER ON *.* TO 'user_name';
GRANT DROP ON *.* TO 'user_name';
GRANT INDEX ON *.* TO 'user_name';
GRANT REFERENCES ON *.* TO 'user_name';
GRANT SELECT ON *.* TO 'user_name';
GRANT CREATE VIEW ON *.* TO 'user_name';
GRANT SHOW VIEW ON *.* TO 'user_name';
GRANT TRIGGER ON *.* TO 'user_name';
GRANT CREATE ROUTINE ON *.* TO 'user_name';
GRANT ALTER ROUTINE ON *.* TO 'user_name';
GRANT EXECUTE ON *.* TO 'user_name';
GRANT INSERT, UPDATE ON AWS_SQLSERVER_EXT.* TO 'user_name';
GRANT INSERT, UPDATE, DELETE ON AWS_SQLSERVER_EXT_DATA.* TO 'user_name';
GRANT CREATE TEMPORARY TABLES ON AWS_SQLSERVER_EXT_DATA.* TO 'user_name';
```

이전 예제에서 *user\$1name*을 사용자 이름으로 바꿉니다. 그런 다음 *your\$1password*를 안전한 암호로 바꿉니다.

MySQL 데이터베이스 버전 5.7 이하를 대상으로 사용하는 경우 다음 명령을 실행합니다. MySQL 데이터베이스 버전 8.0 이상에서는 이 명령이 더 이상 사용되지 않습니다.

```
GRANT SELECT ON mysql.proc TO 'user_name';
```

Amazon RDS for MySQL 또는 Amazon RDS for Aurora MySQL을 대상으로 사용하려면 `lower_case_table_names` 파라미터를 `1`로 설정합니다. 이 값은 MySQL 서버가 테이블, 인덱스, 트리거 및 데이터베이스와 같은 객체 이름의 식별자를 대소문자 구분 없이 처리한다는 것을 의미합니다. 대상 인스턴스에서 이진 로깅을 활성화했다면 `log_bin_trust_function_creators` 파라미터를 `1`로 설정합니다. 이 경우 저장된 함수를 생성하기 위해 `DETERMINISTIC`, `READS SQL DATA` 또는 `NO SQL` 특성을 사용할 필요가 없습니다. 이들 파라미터를 구성하려면 새 DB 파라미터 그룹을 생성하거나 기존 DB 파라미터 그룹을 수정해야 합니다.

## SQL Server에서 MySQL로의 변환 설정
<a name="CHAP_Source.SQLServer.ToMySQL.ConversionSettings"></a>

SQL Server에서 MySQL로의 변환 설정을 편집하려면에서 **설정을** AWS SCT 선택한 다음 **변환 설정을** 선택합니다. 상단 목록에서 **SQL Server**를 선택한 다음 **SQL Server – MySQL**을 선택합니다. AWS SCT 는 SQL Server에서 MySQL로의 변환에 사용할 수 있는 모든 설정을 표시합니다.

의 SQL Server에서 MySQL로의 변환 설정에는 다음에 대한 옵션이 AWS SCT 포함됩니다.
+ 변환된 코드에서 작업 항목이 포함된 설명의 수를 제한합니다.

  **선택한 심각도 이상의 작업 항목에 대해 변환된 코드에 주석 추가에서** 작업 항목의 심각도를 선택합니다.는 선택한 심각도 이상의 작업 항목에 대해 변환된 코드에 주석을 AWS SCT 추가합니다.

  예를 들어, 변환된 코드의 설명 수를 최소화하려면 **오류만**을 선택하세요. 변환된 코드의 모든 작업 항목에 대한 설명을 포함하려면 **모든 메시지**를 선택합니다.
+ 소스 SQL Server 데이터베이스가의 출력을 table. AWS SCT create`EXEC`s 임시 테이블과이 기능을 에뮬레이션하는 추가 프로시저에 저장할 수 있도록 합니다. 이 에뮬레이션을 사용하려면 **Create additional routines for handling open datasets**를 선택합니다.

## 마이그레이션 고려 사항
<a name="CHAP_Source.SQLServer.ToMySQL.MigrationConsiderations"></a>

SQL Server 스키마를 MySQL로 마이그레이션할 때는 다음 사항을 고려합니다.
+ MySQL은 `MERGE` 문을 지원하지 않습니다. 그러나 AWS SCT 는 변환 중에 `INSERT ON DUPLICATE KEY` 절과 `MERGE` 문을 사용하여 `UPDATE FROM and DELETE FROM` 문을 에뮬레이션할 수 있습니다.

  `INSERT ON DUPLICATE KEY`를 사용하여 올바르게 에뮬레이션하기 위해서는 대상 MySQL 데이터베이스에 고유한 제약 조건 또는 프라이머리 키가 있어야 합니다.
+ `GOTO` 문과 레이블을 사용하여 명령문 실행 순서를 변경할 수 있습니다. `GOTO` 문 뒤에 오는 Transact-SQL 문은 건너뛰며 프로세스는 레이블에서 계속됩니다. `GOTO` 문과 레이블은 프로시저, 배치(batch), 명령문 블록 내 어디든 사용할 수 있습니다. `GOTO` 문을 중첩할 수도 있습니다.

  MySQL은 `GOTO` 문을 사용하지 않습니다. 는 `GOTO` 문이 포함된 코드를 AWS SCT 변환할 때 `BEGIN…END` 또는 문을 사용하도록 `LOOP…END LOOP` 문을 변환합니다. 다음 표에서가 `GOTO` 문을 AWS SCT 변환하는 방법의 예를 찾을 수 있습니다.  
****    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/SchemaConversionTool/latest/userguide/CHAP_Source.SQLServer.ToMySQL.html)
+ MySQL은 다중 문 테이블 값 함수를 지원하지 않습니다.는 변환 중에 임시 테이블을 생성하고 이러한 임시 테이블을 사용하도록 문을 다시 작성하여 테이블 값 함수를 AWS SCT 시뮬레이션합니다.

# 를 사용하여 SQL Server에서 PostgreSQL로 마이그레이션 AWS Schema Conversion Tool
<a name="CHAP_Source.SQLServer.ToPostgreSQL"></a>

 AWS SCT에서는 SQL Server에서 PostgreSQL로의 확장 팩을 사용할 수 있습니다. 이 확장 팩은 변환된 PostgreSQL 코드에서 SQL Server 데이터베이스 함수를 에뮬레이션합니다. SQL Server에서 PostgreSQL로의 확장 팩을 사용하여 SQL Server 에이전트 및 SQL Server Database Mail을 에뮬레이션할 수 있습니다. 확장 팩에 대한 자세한 내용은 [에서 확장 팩 사용 AWS Schema Conversion Tool](CHAP_ExtensionPack.md) 섹션을 참조하세요.

**Topics**
+ [PostgreSQL을 대상 데이터베이스로 사용하기 위한 권한](#CHAP_Source.SQLServer.ToPostgreSQL.ConfigurePostgreSQL)
+ [SQL Server에서 PostgreSQL로 변환 설정](#CHAP_Source.SQLServer.ToPostgreSQL.ConversionSettings)
+ [SQL Server 파티션을 PostgreSQL 버전 10 파티션으로 변환](#CHAP_Source.SQLServer.ToPostgreSQL.PG10Partitions)
+ [마이그레이션 고려 사항](#CHAP_Source.SQLServer.ToPostgreSQL.MigrationConsiderations)
+ [AWS SCT 확장 팩을 사용하여 PostgreSQL에서 SQL Server 에이전트 에뮬레이션](CHAP_Source.SQLServer.ToPostgreSQL.ExtensionPack.Agent.md)
+ [AWS SCT 확장 팩을 사용하여 PostgreSQL에서 SQL Server Database Mail 에뮬레이션](CHAP_Source.SQLServer.ToPostgreSQL.ExtensionPack.Mail.md)

## PostgreSQL을 대상 데이터베이스로 사용하기 위한 권한
<a name="CHAP_Source.SQLServer.ToPostgreSQL.ConfigurePostgreSQL"></a>

PostgreSQL을 대상으로 사용하려면 `CREATE ON DATABASE`에 권한이 AWS SCT 필요합니다. 각 대상 PostgreSQL 데이터베이스에 대해 이 권한을 부여해야 합니다.

변환된 공개 동의어를 사용하려면 데이터베이스 기본 검색 경로를 `"$user", public_synonyms, public`으로 변경합니다.

다음 코드 예제를 사용하여 데이터베이스 사용자를 생성하고 권한을 부여할 수 있습니다.

```
CREATE ROLE user_name LOGIN PASSWORD 'your_password';
GRANT CREATE ON DATABASE db_name TO user_name;
ALTER DATABASE db_name SET SEARCH_PATH = "$user", public_synonyms, public;
```

이전 예제에서 *user\$1name*을 사용자 이름으로 바꿉니다. 그런 다음 *db\$1name*을 대상 데이터베이스의 이름으로 바꿉니다. 마지막으로 *your\$1password*를 안전한 암호로 바꿉니다.

PostgreSQL에서는 스키마 소유자 또는 `superuser`만 스키마를 삭제할 수 있습니다. 소유자는 스키마 소유자가 일부 객체를 소유하지 않은 경우에도 스키마 및 이 스키마에 포함된 모든 객체를 삭제할 수 있습니다.

다른 사용자를 사용하여 대상 데이터베이스에 다른 스키마를 변환하고 적용하는 경우에서 스키마를 삭제할 수 없는 경우 오류 메시지가 표시될 AWS SCT 수 있습니다. 이 오류 메시지가 표시되지 않도록 하려면 `superuser` 역할을 사용하세요.

## SQL Server에서 PostgreSQL로 변환 설정
<a name="CHAP_Source.SQLServer.ToPostgreSQL.ConversionSettings"></a>

SQL Server에서 PostgreSQL로의 변환 설정을 편집하려면 **설정**을 선택한 다음 **변환 설정**을 선택합니다. 상단 목록에서 **SQL Server**를 선택한 다음 **SQL Server – PostgreSQL**을 선택합니다. AWS SCT 는 SQL Server에서 PostgreSQL로의 변환에 사용할 수 있는 모든 설정을 표시합니다.

의 SQL Server에서 PostgreSQL로의 변환 설정에는 다음에 대한 옵션이 AWS SCT 포함됩니다.
+ 변환된 코드에서 작업 항목이 포함된 설명의 수를 제한합니다.

  **선택한 심각도 이상의 작업 항목에 대해 변환된 코드에 주석 추가에서** 작업 항목의 심각도를 선택합니다.는 선택한 심각도 이상의 작업 항목에 대해 변환된 코드에 주석을 AWS SCT 추가합니다.

  예를 들어, 변환된 코드의 설명 수를 최소화하려면 **오류만**을 선택하세요. 변환된 코드의 모든 작업 항목에 대한 설명을 포함하려면 **모든 메시지**를 선택합니다.
+ SQL Server의 여러 테이블에서 이름이 같은 인덱스를 사용할 수 있도록 합니다.

  PostgreSQL에서는 스키마에서 사용하는 모든 인덱스 이름이 고유해야 합니다. 가 모든 인덱스에 대해 고유한 이름을 AWS SCT 생성하도록 하려면 **인덱스에 대해 고유한 이름 생성을** 선택합니다.
+ SQL Server 프로시저를 PostgreSQL 함수로 변환합니다.

  PostgreSQL 버전 10 이하에서는 프로시저를 지원하지 않습니다. PostgreSQL에서 프로시저를 사용하는 데 익숙하지 않은 고객의 경우 프로시저를 함수로 변환할 AWS SCT 수 있습니다. 이렇게 하려면 **프로시저를 함수로 변환**을 선택합니다.
+ 테이블에서 `EXEC` 출력을 에뮬레이션하려면

  소스 SQL Server 데이터베이스는 `EXEC`의 출력을 테이블에 저장할 수 있습니다. AWS SCT 는 임시 테이블과 추가 프로시저를 생성하여 이 기능을 에뮬레이션합니다. 이 에뮬레이션을 사용하려면 **Create additional routines for handling open datasets**를 선택합니다.
+ 변환된 코드의 스키마 이름에 사용할 템플릿을 정의합니다. **Schema name generation template**에서 다음 옵션 중 하나를 선택합니다.
  + **<source\$1db>** – PostgreSQL에서 SQL Server 데이터베이스 이름을 스키마 이름으로 사용합니다.
  + **<source\$1schema>** – PostgreSQL에서 SQL Server 스키마 이름을 스키마 이름으로 사용합니다.
  + **<source\$1db>\$1<schema>** – PostgreSQL에서 SQL Server 데이터베이스와 스키마 이름의 조합을 스키마 이름으로 사용합니다.
+ 소스 객체 이름의 대소문자를 그대로 사용합니다.

  객체 이름을 소문자로 변환하지 않으려면 **Avoid casting to lower case for case sensitive operations**를 선택합니다. 이 옵션은 대상 데이터베이스에서 대소문자 구분 옵션을 활성화한 경우에만 적용됩니다.
+ 소스 데이터베이스의 파라미터 이름을 유지합니다.

  변환된 코드의 파라미터 이름에 큰따옴표를 추가하려면 **원본 파라미터 이름 유지**를 선택합니다.

## SQL Server 파티션을 PostgreSQL 버전 10 파티션으로 변환
<a name="CHAP_Source.SQLServer.ToPostgreSQL.PG10Partitions"></a>

Microsoft SQL Server 데이터베이스를 Amazon Aurora PostgreSQL-Compatible Edition(Aurora PostgreSQL) 또는 Amazon Relational Database Service for PostgreSQL(Amazon RDS for PostgreSQL)로 변환할 때는 다음 사항에 유의합니다.

SQL Server에서는 파티션 함수를 사용하여 파티션을 생성합니다. SQL Server 파티션 테이블을 PostgreSQL 버전 10 파티션 테이블로 변환할 때는 다음과 같은 몇 가지 잠재적 문제에 유의해야 합니다.
+ SQL Server에서는 NOT NULL 제약 조건 없이 열을 사용하여 테이블을 분할할 수 있습니다. 이 경우 모든 NULL 값은 맨 왼쪽 파티션으로 이동합니다. PostgreSQL은 RANGE 파티셔닝에서 NULL 값을 지원하지 않습니다.
+ SQL Server에서는 파티션 테이블의 프라이머리 키와 고유 키를 만들 수 있습니다. PostgreSQL에서는 각 파티션의 프라이머리 키 또는 고유 키를 직접 생성할 수 있습니다. 따라서 PostgreSQL로 마이그레이션할 때 PRIMARY 또는 UNIQUE KEY 제약 조건을 상위 테이블에서 제거해야 합니다. 결과 키 이름은 `<original_key_name>_<partition_number>` 형식입니다.
+ SQL Server를 사용하면 파티션 테이블에서 또는 파티션 테이블에 외래 키 제약 조건을 만들 수 있습니다. PostgreSQL은 파티션 테이블을 참조하는 외래 키를 지원하지 않습니다. 또한 PostgreSQL은 파티션 테이블에서 다른 테이블로의 외래 키 참조를 지원하지 않습니다.
+ SQL Server를 사용하면 파티션 테이블의 인덱스를 만들 수 있습니다. PostgreSQL에서는 각 파티션에 대해 직접 인덱스를 생성해야 합니다. 따라서 PostgreSQL로 마이그레이션할 때 해당 인덱스를 상위 테이블에서 제거해야 합니다. 결과 인덱스 이름은 `<original_index_name>_<partition_number>` 형식입니다.
+  PostgreSQL은 파티션된 인덱스를 지원하지 않습니다.

## 마이그레이션 고려 사항
<a name="CHAP_Source.SQLServer.ToPostgreSQL.MigrationConsiderations"></a>

SQL Server 스키마에서 PostgreSQL로 마이그레이션할 때 고려해야 할 사항: 
+ PostgreSQL에서는 스키마의 모든 객체 이름(인덱스 포함)이 고유해야 합니다. 인덱스 이름은 기본 테이블의 스키마에서 고유해야 합니다. SQL Server에서는 서로 다른 테이블에서 인덱스 이름이 동일할 수 있습니다.

  인덱스 이름의 고유성을 보장하기 위해는 인덱스 이름이 고유하지 않은 경우 고유한 인덱스 이름을 생성할 수 있는 옵션을 AWS SCT 제공합니다. 이렇게 하려면 프로젝트 속성에서 **Generate unique index names(고유한 인덱스 이름 생성)** 옵션을 선택합니다. 이 옵션은 기본적으로 활성화되어 있습니다. 이 옵션을 활성화하면 IX\$1table\$1name\$1index\$1name 형식을 사용하여 고유한 인덱스 이름이 생성됩니다. 이 옵션을 비활성화하면 인덱스 이름이 변경되지 않습니다.
+ GOTO 문과 레이블을 사용하여 문 실행 순서를 변경할 수 있습니다. GOTO 문 뒤에 오는 Transact-SQL 문은 건너뛰며 프로세스는 레이블에서 계속됩니다. GOTO 문과 레이블은 프로시저, 배치(batch), 문 블록 내 어디든 사용할 수 있습니다. GOTO 문은 중첩될 수 있습니다.

  PostgreSQL은 GOTO 명령문을 사용하지 않습니다. 가 GOTO 문이 포함된 코드를 AWS SCT 변환할 때 BEGIN...END 또는 LOOP...END LOOP 문을 사용하도록 문을 변환합니다. 다음 표에서가 GOTO 문을 AWS SCT 변환하는 방법의 예를 찾을 수 있습니다.  
**SQL Server GOTO 문 및 변환된 PostgreSQL 문**    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/SchemaConversionTool/latest/userguide/CHAP_Source.SQLServer.ToPostgreSQL.html)
+ PostgreSQL은 MERGE 문을 지원하지 않습니다.는 다음과 같은 방식으로 MERGE 문의 동작을에 AWS SCT 뮬레이션합니다.
  + INSERT ON CONFLICT 생성.
  + UPDATE FROM DML 문 사용(예: MERGE without a WHEN NOT MATCHED 절)
  + CURSOR 사용(예: MERGE with DELETE 절) 또는 복잡한 MERGE ON 조건문 사용
+ AWS SCT 는 Amazon RDS가 대상일 때 객체 트리에 데이터베이스 트리거를 추가할 수 있습니다.
+ AWS SCT 는 Amazon RDS가 대상일 때 객체 트리에 서버 수준 트리거를 추가할 수 있습니다.
+ SQL Server는 `deleted` 및 `inserted` 테이블을 자동으로 생성하고 관리합니다. 이러한 임시 메모리 상주 테이블을 사용하여 특정 데이터 수정의 영향을 테스트하고 DML 트리거 작업에 대한 조건을 설정할 수 있습니다.는 DML 트리거 문 내에서 이러한 테이블의 사용을 변환할 AWS SCT 수 있습니다.
+ AWS SCT Amazon RDS가 대상인 경우는 연결된 서버를 객체 트리에 추가할 수 있습니다.
+ Microsoft SQL Server에서 PostgreSQL로 마이그레이션하면 내장된 SUSER\$1SNAME 함수가 다음과 같이 변환됩니다.
  + SUSER\$1SNAME - 보안 식별 번호(SID)와 연결된 로그인 이름을 반환합니다.
  + SUSER\$1SNAME(<server\$1user\$1sid>) – 지원되지 않습니다.
  + SUSER\$1SNAME() CURRENT\$1USER – 현재 실행 컨텍스트의 사용자 이름을 반환합니다.
  + SUSER\$1SNAME(NULL) – NULL을 반환합니다.
+ 테이블 반환 함수 변환이 지원됩니다. 테이블 반환 함수는 테이블을 반환하며 쿼리에서 테이블을 대신할 수 있습니다.
+ PATINDEX에서는 유효한 모든 텍스트 및 문자 데이터 형식의 지정된 표현식에서 패턴이 처음으로 발생하는 시작 위치를 반환하고, 패턴을 찾을 수 없는 경우 0을 반환합니다. SQL Server에서 Amazon RDS for PostgreSQL로 변환할 때는 PATINDEX를 aws\$1sqlserver\$1ext.patindex(<패턴 문자>, <표현 문자 변형>)와 함께 사용하는 애플리케이션 코드를 AWS SCT 대체합니다.
+ SQL Server에서 사용자 정의 테이블 유형은 테이블 구조의 정의를 나타내는 유형입니다. 사용자 정의 테이블 유형을 사용하여 저장 프로시저 또는 함수에 테이블-값 파라미터를 선언합니다. 또한 사용자 정의 테이블 유형을 사용하여 저장 프로시저 또는 함수의 배치 또는 본문에 사용할 테이블 변수를 선언할 수 있습니다. 임시 테이블을 생성하여 PostgreSQL에서이 유형을에 AWS SCT 뮬레이션했습니다.

SQL Server에서 PostgreSQL로 변환할 때는 SQL Server 시스템 객체를 PostgreSQL에서 인식 가능한 객체로 AWS SCT 변환합니다. 다음 표에서는 시스템 객체가 어떻게 변환되는지 보여줍니다.

 


| MS SQL Server 사용 사례 | PostgreSQL 대체 | 
| --- | --- | 
| SYS.SCHEMAS | AWS\$1SQLSERVER\$1EXT.SYS\$1SCHEMAS | 
| SYS.TABLES | AWS\$1SQLSERVER\$1EXT.SYS\$1TABLES | 
| SYS.VIEWS | AWS\$1SQLSERVER\$1EXT.SYS\$1VIEWS | 
| SYS.ALL\$1VIEWS | AWS\$1SQLSERVER\$1EXT.SYS\$1ALL\$1VIEWS | 
| SYS.TYPES | AWS\$1SQLSERVER\$1EXT.SYS\$1TYPES | 
| SYS.COLUMNS | AWS\$1SQLSERVER\$1EXT.SYS\$1COLUMNS | 
| SYS.ALL\$1COLUMNS | AWS\$1SQLSERVER\$1EXT.SYS\$1ALL\$1COLUMNS | 
| SYS.FOREIGN\$1KEYS | AWS\$1SQLSERVER\$1EXT.SYS\$1FOREIGN\$1KEYS | 
| SYS.SYSFOREIGNKEYS | AWS\$1SQLSERVER\$1EXT.SYS\$1SYSFOREIGNKEYS | 
| SYS.FOREIGN\$1KEY\$1COLUMNS | AWS\$1SQLSERVER\$1EXT.SYS\$1FOREIGN\$1KEY\$1COLUMNS | 
| SYS.KEY\$1CONSTRAINTS | AWS\$1SQLSERVER\$1EXT.SYS\$1KEY\$1CONSTRAINTS | 
| SYS.IDENTITY\$1COLUMNS | AWS\$1SQLSERVER\$1EXT.SYS\$1IDENTITY\$1COLUMNS | 
| SYS.PROCEDURES | AWS\$1SQLSERVER\$1EXT.SYS\$1PROCEDURES | 
| SYS.INDEXES | AWS\$1SQLSERVER\$1EXT.SYS\$1INDEXES | 
| SYS.SYSINDEXES | AWS\$1SQLSERVER\$1EXT.SYS\$1SYSINDEXES | 
| SYS.OBJECTS | AWS\$1SQLSERVER\$1EXT.SYS\$1OBJECTS | 
| SYS.ALL\$1OBJECTS | AWS\$1SQLSERVER\$1EXT.SYS\$1ALL\$1OBJECTS | 
| SYS.SYSOBJECTS | AWS\$1SQLSERVER\$1EXT.SYS\$1SYSOBJECTS | 
| SYS.SQL\$1MODULES | AWS\$1SQLSERVER\$1EXT.SYS\$1SQL\$1MODULES | 
| SYS.DATABASES | AWS\$1SQLSERVER\$1EXT.SYS\$1DATABASES | 
| INFORMATION\$1SCHEMA.SCHEMATA  | AWS\$1SQLSERVER\$1EXT.INFORMATION\$1SCHEMA\$1SCHEMATA | 
| INFORMATION\$1SCHEMA.VIEWS | AWS\$1SQLSERVER\$1EXT.INFORMATION\$1SCHEMA\$1VIEWS | 
| INFORMATION\$1SCHEMA.TABLES | AWS\$1SQLSERVER\$1EXT.INFORMATION\$1SCHEMA\$1TABLES | 
| INFORMATION\$1SCHEMA.COLUMNS | AWS\$1SQLSERVER\$1EXT.INFORMATION\$1SCHEMA\$1COLUMNS | 
| INFORMATION\$1SCHEMA.CHECK\$1CONSTRAINTS | AWS\$1SQLSERVER\$1EXT.INFORMATION\$1SCHEMA\$1CHECK\$1CONSTRAINTS | 
| INFORMATION\$1SCHEMA.REFERENTIAL\$1CONSTRAINTS | AWS\$1SQLSERVER\$1EXT.INFORMATION\$1SCHEMA\$1REFERENTIAL\$1CONSTRAINTS | 
| INFORMATION\$1SCHEMA.TABLE\$1CONSTRAINTS | AWS\$1SQLSERVER\$1EXT.INFORMATION\$1SCHEMA\$1TABLE\$1CONSTRAINTS | 
| INFORMATION\$1SCHEMA.KEY\$1COLUMN\$1USAGE | AWS\$1SQLSERVER\$1EXT.INFORMATION\$1SCHEMA\$1KEY\$1COLUMN\$1USAGE | 
| INFORMATION\$1SCHEMA.CONSTRAINT\$1TABLE\$1USAGE | AWS\$1SQLSERVER\$1EXT.INFORMATION\$1SCHEMA\$1CONSTRAINT\$1TABLE\$1USAGE  | 
| INFORMATION\$1SCHEMA.CONSTRAINT\$1COLUMN\$1USAGE | AWS\$1SQLSERVER\$1EXT.INFORMATION\$1SCHEMA\$1CONSTRAINT\$1COLUMN\$1USAGE  | 
| INFORMATION\$1SCHEMA.ROUTINES | AWS\$1SQLSERVER\$1EXT.INFORMATION\$1SCHEMA\$1ROUTINES | 
| SYS.SYSPROCESSES | AWS\$1SQLSERVER\$1EXT.SYS\$1SYSPROCESSES | 
| sys.system\$1objects | AWS\$1SQLSERVER\$1EXT.SYS\$1SYSTEM\$1OBJECTS | 

# AWS SCT 확장 팩을 사용하여 PostgreSQL에서 SQL Server 에이전트 에뮬레이션
<a name="CHAP_Source.SQLServer.ToPostgreSQL.ExtensionPack.Agent"></a>

SQL Server 에이전트는 SQL Server 작업을 실행하는 Microsoft Windows 서비스입니다. SQL Server 에이전트는 일정에 따라, 특정 이벤트 발생 시 또는 필요에 따라 작업을 실행합니다. SQL Server 에이전트에 대한 자세한 내용은 [Microsoft 기술 문서](https://docs.microsoft.com/en-us/sql/ssms/agent/sql-server-agent?view=sql-server-ver15)를 참조하세요.

PostgreSQL은 SQL Server 에이전트와 동일한 기능을 제공하지 않습니다. SQL Server 에이전트 기능을 에뮬레이션하기 위해는 확장 팩을 AWS SCT 생성합니다. 이 확장 팩은 AWS Lambda 및 Amazon CloudWatch를 사용합니다.는 일정을 관리하고 작업을 실행하는 데 사용하는 인터페이스를 AWS Lambda 구현합니다. Amazon CloudWatch는 예약 규칙을 유지 관리합니다.

AWS Lambda 및 Amazon CloudWatch는 JSON 파라미터를 사용하여 상호 작용합니다. 이 JSON 파라미터의 구조는 다음과 같습니다.

```
{
    "mode": mode,
    "parameters": {
        list of parameters
    },
    "callback": procedure name
}
```

이전 예제에서 *`mode`*는 작업 유형이고 `list of parameters`는 작업 유형에 따라 달라지는 파라미터 집합입니다. 또한 `procedure name`은 작업이 완료된 후 실행되는 프로시저의 이름입니다.

AWS SCT 는 Lambda 함수 하나를 사용하여 작업을 제어하고 실행합니다. CloudWatch 규칙은 작업 실행을 시작하고, 작업을 시작하는 데 필요한 정보를 제공합니다. CloudWatch 규칙이 트리거되면 규칙의 파라미터를 사용하여 Lambda 함수를 시작합니다.

프로시저를 호출하는 단순 작업을 생성하려면 다음 형식을 사용합니다.

```
{
    "mode": "run_job",
    "parameters": {
        "vendor": "mysql",
        "cmd": "lambda_db.nightly_job"
    }
}
```

여러 단계가 포함된 작업을 생성하려면 다음 형식을 사용합니다.

```
{
    "mode": "run_job",
    "parameters": {
        "job_name": "Job1",
        "enabled": "true",
        "start_step_id": 1,
        "notify_level_email": [0|1|2|3],
        "notify_email": email,
        "delete_level": [0|1|2|3],
        "job_callback": "ProcCallBackJob(job_name, code, message)",
        "step_callback": "ProcCallBackStep(job_name, step_id, code, message)"
    },
    "steps": [
        {
            "id":1,
            "cmd": "ProcStep1",
            "cmdexec_success_code": 0,
            "on_success_action": [|2|3|4],
            "on_success_step_id": 1,
            "on_fail_action": 0,
            "on_fail_step_id": 0,
            "retry_attempts": number,
            "retry_interval": number
        },
        {
            "id":2,
            "cmd": "ProcStep2",
            "cmdexec_success_code": 0,
            "on_success_action": [1|2|3|4],
            "on_success_step_id": 0,
            "on_fail_action": 0,
            "on_fail_step_id": 0,
            "retry_attempts": number,
            "retry_interval": number
        },
        ...
]
}
```

PostgreSQL에서 SQL Server 에이전트 동작을 에뮬레이션하기 위해 AWS SCT 확장 팩은 다음 테이블과 절차도 생성합니다.

## PostgreSQL에서 SQL Server 에이전트를 에뮬레이션하는 테이블
<a name="CHAP_Source.SQLServer.ToPostgreSQL.ExtensionPack.Agent.Tables"></a>

SQL Server 에이전트를 에뮬레이션하기 위해 확장 팩은 다음 테이블을 사용합니다.

**sysjobs**  
작업에 대한 정보를 저장합니다.

**sysjobsteps**  
작업의 단계에 대한 정보를 저장합니다.

**sysschedules**  
작업 예약에 대한 정보를 저장합니다.

**sysjobschedules**  
개별 작업의 예약 정보를 저장합니다.

**sysjobhistory**  
예약된 작업의 실행 관련 정보를 저장합니다.

## PostgreSQL에서 SQL Server 에이전트를 에뮬레이션하는 프로시저
<a name="CHAP_Source.SQLServer.ToPostgreSQL.ExtensionPack.Agent.Procedures"></a>

SQL Server 에이전트를 에뮬레이션하기 위해 확장 팩은 다음 프로시저를 사용합니다.

**sp\$1add\$1job**  
새 작업을 추가합니다.

**sp\$1add\$1jobstep**  
작업에 단계를 추가합니다.

**sp\$1add\$1schedule**  
Amazon CloudWatch에 새 예약 규칙을 생성합니다. 여러 작업에서 이 예약 일정을 사용할 수 있습니다.

**sp\$1attach\$1schedule**  
선택한 작업의 예약을 설정합니다.

**sp\$1add\$1jobschedule**  
Amazon CloudWatch에서 작업에 대한 예약 규칙을 생성하고 이 규칙의 대상을 설정합니다.

**sp\$1update\$1job**  
이전에 생성한 작업의 속성을 업데이트합니다.

**sp\$1update\$1jobstep**  
작업의 단계 속성을 업데이트합니다.

**sp\$1update\$1schedule**  
Amazon CloudWatch에서 예약 규칙의 속성을 업데이트합니다.

**sp\$1update\$1jobschedule**  
지정된 작업의 예약 속성을 업데이트합니다.

**sp\$1delete\$1job**  
작업을 삭제합니다.

**sp\$1delete\$1jobstep**  
작업에서 작업 단계를 삭제합니다.

**sp\$1delete\$1schedule**  
일정을 삭제합니다.

**sp\$1delete\$1jobschedule**  
Amazon CloudWatch에서 지정된 작업의 예약 규칙을 삭제합니다.

**sp\$1detach\$1schedule**  
예약과 작업 간의 연결을 제거합니다.

**get\$1jobs, update\$1job**  
와 상호 작용하는 내부 절차입니다 AWS Elastic Beanstalk.

**sp\$1verify\$1job\$1date, sp\$1verify\$1job\$1time, sp\$1verify\$1job, sp\$1verify\$1jobstep, sp\$1verify\$1schedule, sp\$1verify\$1job\$1identifiers, sp\$1verify\$1schedule\$1identifiers**  
설정을 확인하는 내부 프로시저입니다.

## PostgreSQL에서 SQL Server 에이전트를 에뮬레이션하는 프로시저의 구문
<a name="CHAP_Source.SQLServer.ToPostgreSQL.ExtensionPack.Agent.Syntax"></a>

확장 팩의 `aws_sqlserver_ext.sp_add_job` 프로시저는 `msdb.dbo.sp_add_job` 프로시저를 에뮬레이션합니다. 소스 SQL Server 에이전트 프로시저에 대한 자세한 내용은 [Microsoft 기술 문서](https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-add-job-transact-sql?view=sql-server-ver15)를 참조하세요.

```
par_job_name varchar,
par_enabled smallint = 1,
par_description varchar = NULL::character varying,
par_start_step_id integer = 1,
par_category_name varchar = NULL::character varying,
par_category_id integer = NULL::integer,
par_owner_login_name varchar = NULL::character varying,
par_notify_level_eventlog integer = 2,
par_notify_level_email integer = 0,
par_notify_level_netsend integer = 0,
par_notify_level_page integer = 0,
par_notify_email_operator_name varchar = NULL::character varying,
par_notify_netsend_operator_name varchar = NULL::character varying,
par_notify_page_operator_name varchar = NULL::character varying,
par_delete_level integer = 0,
inout par_job_id integer = NULL::integer,
par_originating_server varchar = NULL::character varying,
out returncode integer
```

확장 팩의 `aws_sqlserver_ext.sp_add_jobstep` 프로시저는 `msdb.dbo.sp_add_jobstep` 프로시저를 에뮬레이션합니다. 소스 SQL Server 에이전트 프로시저에 대한 자세한 내용은 [Microsoft 기술 문서](https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-add-jobstep-transact-sql?view=sql-server-ver15)를 참조하세요.

```
par_job_id integer = NULL::integer,
par_job_name varchar = NULL::character varying,
par_step_id integer = NULL::integer,
par_step_name varchar = NULL::character varying,
par_subsystem varchar = 'TSQL'::bpchar,
par_command text = NULL::text,
par_additional_parameters text = NULL::text,
par_cmdexec_success_code integer = 0,
par_on_success_action smallint = 1,
par_on_success_step_id integer = 0,
par_on_fail_action smallint = 2,
par_on_fail_step_id integer = 0,
par_server varchar = NULL::character varying,
par_database_name varchar = NULL::character varying,
par_database_user_name varchar = NULL::character varying,
par_retry_attempts integer = 0,
par_retry_interval integer = 0,
par_os_run_priority integer = 0,
par_output_file_name varchar = NULL::character varying,
par_flags integer = 0,
par_proxy_id integer = NULL::integer,
par_proxy_name varchar = NULL::character varying,
inout par_step_uid char = NULL::bpchar,
out returncode integer
```

확장 팩의 `aws_sqlserver_ext.sp_add_schedule` 프로시저는 `msdb.dbo.sp_add_schedule` 프로시저를 에뮬레이션합니다. 소스 SQL Server 에이전트 프로시저에 대한 자세한 내용은 [Microsoft 기술 문서](https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-add-schedule-transact-sql?view=sql-server-ver15)를 참조하세요.

```
par_schedule_name varchar,
par_enabled smallint = 1,
par_freq_type integer = 0,
par_freq_interval integer = 0,
par_freq_subday_type integer = 0,
par_freq_subday_interval integer = 0,
par_freq_relative_interval integer = 0,
par_freq_recurrence_factor integer = 0,
par_active_start_date integer = NULL::integer,
par_active_end_date integer = 99991231,
par_active_start_time integer = 0,
par_active_end_time integer = 235959,
par_owner_login_name varchar = NULL::character varying,
*inout par_schedule_uid char = NULL::bpchar,*
inout par_schedule_id integer = NULL::integer,
par_originating_server varchar = NULL::character varying,
out returncode integer
```

확장 팩의 `aws_sqlserver_ext.sp_attach_schedule` 프로시저는 `msdb.dbo.sp_attach_schedule` 프로시저를 에뮬레이션합니다. 소스 SQL Server 에이전트 프로시저에 대한 자세한 내용은 [Microsoft 기술 문서](https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-attach-schedule-transact-sql?view=sql-server-ver15)를 참조하세요.

```
par_job_id integer = NULL::integer,
par_job_name varchar = NULL::character varying,
par_schedule_id integer = NULL::integer,
par_schedule_name varchar = NULL::character varying,
par_automatic_post smallint = 1,
out returncode integer
```

확장 팩의 `aws_sqlserver_ext.sp_add_jobschedule` 프로시저는 `msdb.dbo.sp_add_jobschedule` 프로시저를 에뮬레이션합니다. 소스 SQL Server 에이전트 프로시저에 대한 자세한 내용은 [Microsoft 기술 문서](https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-add-jobschedule-transact-sql?view=sql-server-ver15)를 참조하세요.

```
par_job_id integer = NULL::integer,
par_job_name varchar = NULL::character varying,
par_name varchar = NULL::character varying,
par_enabled smallint = 1,
par_freq_type integer = 1,
par_freq_interval integer = 0,
par_freq_subday_type integer = 0,
par_freq_subday_interval integer = 0,
par_freq_relative_interval integer = 0,
par_freq_recurrence_factor integer = 0,
par_active_start_date integer = NULL::integer,
par_active_end_date integer = 99991231,
par_active_start_time integer = 0,
par_active_end_time integer = 235959,
inout par_schedule_id integer = NULL::integer,
par_automatic_post smallint = 1,
inout par_schedule_uid char = NULL::bpchar,
out returncode integer
```

확장 팩의 `aws_sqlserver_ext.sp_delete_job` 프로시저는 `msdb.dbo.sp_delete_job` 프로시저를 에뮬레이션합니다. 소스 SQL Server 에이전트 프로시저에 대한 자세한 내용은 [Microsoft 기술 문서](https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-delete-job-transact-sql?view=sql-server-ver15)를 참조하세요.

```
par_job_id integer = NULL::integer,
par_job_name varchar = NULL::character varying,
par_originating_server varchar = NULL::character varying,
par_delete_history smallint = 1,
par_delete_unused_schedule smallint = 1,
out returncode integer
```

확장 팩의 `aws_sqlserver_ext.sp_delete_jobstep` 프로시저는 `msdb.dbo.sp_delete_jobstep` 프로시저를 에뮬레이션합니다. 소스 SQL Server 에이전트 프로시저에 대한 자세한 내용은 [Microsoft 기술 문서](https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-delete-jobsteplog-transact-sql?view=sql-server-ver15)를 참조하세요.

```
par_job_id integer = NULL::integer,
par_job_name varchar = NULL::character varying,
par_step_id integer = NULL::integer,
out returncode integer
```

확장 팩의 `aws_sqlserver_ext.sp_delete_jobschedule` 프로시저는 `msdb.dbo.sp_delete_jobschedule` 프로시저를 에뮬레이션합니다. 소스 SQL Server 에이전트 프로시저에 대한 자세한 내용은 [Microsoft 기술 문서](https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-delete-jobschedule-transact-sql?view=sql-server-ver15)를 참조하세요.

```
par_job_id integer = NULL::integer,
par_job_name varchar = NULL::character varying,
par_name varchar = NULL::character varying,
par_keep_schedule integer = 0,
par_automatic_post smallint = 1,
out returncode integer
```

확장 팩의 `aws_sqlserver_ext.sp_delete_schedule` 프로시저는 `msdb.dbo.sp_delete_schedule` 프로시저를 에뮬레이션합니다. 소스 SQL Server 에이전트 프로시저에 대한 자세한 내용은 [Microsoft 기술 문서](https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-delete-schedule-transact-sql?view=sql-server-ver15)를 참조하세요.

```
par_schedule_id integer = NULL::integer,
par_schedule_name varchar = NULL::character varying,
par_force_delete smallint = 0,
par_automatic_post smallint = 1,
out returncode integer
```

확장 팩의 `aws_sqlserver_ext.sp_detach_schedule` 프로시저는 `msdb.dbo.sp_detach_schedule` 프로시저를 에뮬레이션합니다. 소스 SQL Server 에이전트 프로시저에 대한 자세한 내용은 [Microsoft 기술 문서](https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-detach-schedule-transact-sql?view=sql-server-ver15)를 참조하세요.

```
par_job_id integer = NULL::integer,
par_job_name varchar = NULL::character varying,
par_schedule_id integer = NULL::integer,
par_schedule_name varchar = NULL::character varying,
par_delete_unused_schedule smallint = 0,
par_automatic_post smallint = 1,
out returncode integer
```

확장 팩의 `aws_sqlserver_ext.sp_update_job` 프로시저는 `msdb.dbo.sp_update_job` 프로시저를 에뮬레이션합니다. 소스 SQL Server 에이전트 프로시저에 대한 자세한 내용은 [Microsoft 기술 문서](https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-update-job-transact-sql?view=sql-server-ver15)를 참조하세요.

```
par_job_id integer = NULL::integer
par_job_name varchar = NULL::character varying
par_new_name varchar = NULL::character varying
par_enabled smallint = NULL::smallint
par_description varchar = NULL::character varying
par_start_step_id integer = NULL::integer
par_category_name varchar = NULL::character varying
par_owner_login_name varchar = NULL::character varying
par_notify_level_eventlog integer = NULL::integer
par_notify_level_email integer = NULL::integer
par_notify_level_netsend integer = NULL::integer
par_notify_level_page integer = NULL::integer
par_notify_email_operator_name varchar = NULL::character varying
par_notify_netsend_operator_name varchar = NULL::character varying
par_notify_page_operator_name varchar = NULL::character varying
par_delete_level integer = NULL::integer
par_automatic_post smallint = 1
out returncode integer
```

확장 팩의 `aws_sqlserver_ext.sp_update_jobschedule` 프로시저는 `msdb.dbo.sp_update_jobschedule` 프로시저를 에뮬레이션합니다. 소스 SQL Server 에이전트 프로시저에 대한 자세한 내용은 [Microsoft 기술 문서](https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-update-jobschedule-transact-sql?view=sql-server-ver15)를 참조하세요.

```
par_job_id integer = NULL::integer
par_job_name varchar = NULL::character varying
par_name varchar = NULL::character varying
par_new_name varchar = NULL::character varying
par_enabled smallint = NULL::smallint
par_freq_type integer = NULL::integer
par_freq_interval integer = NULL::integer
par_freq_subday_type integer = NULL::integer
par_freq_subday_interval integer = NULL::integer
par_freq_relative_interval integer = NULL::integer
par_freq_recurrence_factor integer = NULL::integer
par_active_start_date integer = NULL::integer
par_active_end_date integer = NULL::integer
par_active_start_time integer = NULL::integer
                par_active_end_time integer = NULL::integer
par_automatic_post smallint = 1
out returncode integer
```

확장 팩의 `aws_sqlserver_ext.sp_update_jobstep` 프로시저는 `msdb.dbo.sp_update_jobstep` 프로시저를 에뮬레이션합니다. 소스 SQL Server 에이전트 프로시저에 대한 자세한 내용은 [Microsoft 기술 문서](https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-update-jobstep-transact-sql?view=sql-server-ver15)를 참조하세요.

```
par_job_id integer = NULL::integer
par_job_name varchar = NULL::character varying
par_step_id integer = NULL::integer
par_step_name varchar = NULL::character varying
par_subsystem varchar = NULL::character varying
par_command text = NULL::text
par_additional_parameters text = NULL::text
par_cmdexec_success_code integer = NULL::integer
par_on_success_action smallint = NULL::smallint
par_on_success_step_id integer = NULL::integer
par_on_fail_action smallint = NULL::smallint
par_on_fail_step_id integer = NULL::integer
par_server varchar = NULL::character varying
par_database_name varchar = NULL::character varying
par_database_user_name varchar = NULL::character varying
par_retry_attempts integer = NULL::integer
par_retry_interval integer = NULL::integer
par_os_run_priority integer = NULL::integer
par_output_file_name varchar = NULL::character varying
par_flags integer = NULL::integer
par_proxy_id integer = NULL::integer
par_proxy_name varchar = NULL::character varying
out returncode integer
```

확장 팩의 `aws_sqlserver_ext.sp_update_schedule` 프로시저는 `msdb.dbo.sp_update_schedule` 프로시저를 에뮬레이션합니다. 소스 SQL Server 에이전트 프로시저에 대한 자세한 내용은 [Microsoft 기술 문서](https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-update-schedule-transact-sql?view=sql-server-ver15)를 참조하세요.

```
par_schedule_id integer = NULL::integer
par_name varchar = NULL::character varying
par_new_name varchar = NULL::character varying
par_enabled smallint = NULL::smallint
par_freq_type integer = NULL::integer
par_freq_interval integer = NULL::integer
par_freq_subday_type integer = NULL::integer
par_freq_subday_interval integer = NULL::integer
par_freq_relative_interval integer = NULL::integer
par_freq_recurrence_factor integer = NULL::integer
par_active_start_date integer = NULL::integer
par_active_end_date integer = NULL::integer
par_active_start_time integer = NULL::integer
par_active_end_time integer = NULL::integer
par_owner_login_name varchar = NULL::character varying
par_automatic_post smallint = 1
out returncode integer
```

## PostgreSQL에서 SQL Server 에이전트를 에뮬레이션하는 프로시저 사용 예제
<a name="CHAP_Source.SQLServer.ToPostgreSQL.ExtensionPack.Agent.Examples"></a>

새 작업을 추가하려면 다음과 같이 `aws_sqlserver_ext.sp_add_job` 프로시저를 사용합니다.

```
SELECT * FROM aws_sqlserver_ext.sp_add_job (
    par_job_name := 'test_job',
    par_enabled := 1::smallint,
    par_start_step_id := 1::integer,
    par_category_name := '[Uncategorized (Local)]',
    par_owner_login_name := 'sa');
```

새 작업 단계를 추가하려면 다음과 같이 `aws_sqlserver_ext.sp_add_jobstep` 프로시저를 사용합니다.

```
SELECT * FROM aws_sqlserver_ext.sp_add_jobstep (
    par_job_name := 'test_job',
    par_step_id := 1::smallint,
    par_step_name := 'test_job_step1',
    par_subsystem := 'TSQL',
    par_command := 'EXECUTE [dbo].[PROC_TEST_JOB_STEP1];',
    par_server := NULL,
    par_database_name := 'GOLD_TEST_SS');
```

단순 일정을 추가하려면 다음과 같이 `aws_sqlserver_ext.sp_add_schedule` 프로시저를 사용합니다.

```
SELECT * FROM aws_sqlserver_ext.sp_add_schedule(
    par_schedule_name := 'RunOnce',
    par_freq_type := 1,
    par_active_start_time := 233000);
```

작업 일정을 설정하려면 다음과 같이 `aws_sqlserver_ext.sp_attach_schedule` 프로시저를 사용합니다.

```
SELECT * FROM aws_sqlserver_ext.sp_attach_schedule (
    par_job_name := 'test_job',
    par_schedule_name := 'NightlyJobs');
```

작업에 대한 예약을 생성하려면 다음과 같이 `aws_sqlserver_ext.sp_add_jobschedule` 프로시저를 사용합니다.

```
SELECT * FROM aws_sqlserver_ext.sp_add_jobschedule (
    par_job_name := 'test_job2',
    par_name := 'test_schedule2',
    par_enabled := 1::smallint,
    par_freq_type := 4,
    par_freq_interval := 1,
    par_freq_subday_type := 4,
    par_freq_subday_interval := 1,
    par_freq_relative_interval := 0,
    par_freq_recurrence_factor := 0,
    par_active_start_date := 20100801,
    par_active_end_date := 99991231,
    par_active_start_time := 0,
    par_active_end_time := 0);
```

## PostgreSQL에서 SQL Server 에이전트를 에뮬레이션하기 위한 사용 사례 예제
<a name="CHAP_Source.SQLServer.ToPostgreSQL.ExtensionPack.Agent.UseCases"></a>

소스 데이터베이스 코드가 SQL Server Agent를 사용하여 작업을 실행하는 경우 용 SQL Server to PostgreSQL 확장 팩 AWS SCT 을 사용하여이 코드를 PostgreSQL로 변환할 수 있습니다. 확장 팩은 AWS Lambda 함수를 사용하여 SQL Server 에이전트의 동작을 에뮬레이션합니다.

새 AWS Lambda 함수를 생성하거나 기존 함수를 등록할 수 있습니다.

**새 AWS Lambda 함수를 생성하려면**

1. 의 대상 데이터베이스 트리 AWS SCT에서 컨텍스트(마우스 오른쪽 버튼 클릭) 메뉴를 열고 **확장 팩 적용을** 선택한 다음 **PostgreSQL**을 선택합니다.

   확장 팩 마법사가 표시됩니다.

1. **SQL Server Agent emulation service** 탭에서 다음을 수행합니다.
   + ** AWS Lambda 함수 생성을** 선택합니다.
   + **Database login**에 대상 데이터베이스 사용자의 이름을 입력합니다.
   + **데이터베이스 암호**에 이전 단계에서 입력한 사용자 이름의 암호를 입력합니다.
   + **Python library folder**에 Python 라이브러리 폴더의 경로를 입력합니다.
   + ** AWS Lambda 함수 생성을** 선택한 **후 다음을** 선택합니다.

**이전에 배포한 AWS Lambda 함수를 등록하려면**
+ 대상 데이터베이스에서 다음 스크립트를 실행합니다.

  ```
  SELECT
      FROM aws_sqlserver_ext.set_service_setting(
          p_service := 'JOB', 
          p_setting := 'LAMBDA_ARN', 
          p_value := ARN)
  ```

  이전 예제에서 *`ARN`*은 배포된 AWS Lambda 함수의 Amazon 리소스 이름(ARN)입니다.

다음 예제에서는 한 단계로 구성된 단순 작업을 생성합니다. 이 작업은 5분마다 이전에 생성된 `job_example` 함수를 실행합니다. 이 함수는 `job_example_table` 테이블에 레코드를 삽입합니다.

**이 단순 작업을 생성하려면**

1. 다음과 같이 `aws_sqlserver_ext.sp_add_job` 함수를 사용하여 작업을 생성합니다.

   ```
   SELECT
       FROM aws_sqlserver_ext.sp_add_job (
           par_job_name := 'test_simple_job');
   ```

1. 다음과 같이 `aws_sqlserver_ext.sp_add_jobstep` 함수를 사용하여 작업 단계를 생성합니다.

   ```
   SELECT
       FROM aws_sqlserver_ext.sp_add_jobstep (
           par_job_name := 'test_simple_job', 
           par_step_name := 'test_simple_job_step1', 
           par_command := 'PERFORM job_simple_example;');
   ```

   작업 단계는 함수가 수행하는 작업을 지정합니다.

1. 다음과 같이 `aws_sqlserver_ext.sp_add_jobschedule` 함수를 사용하여 작업에 대한 스케줄러를 생성합니다.

   ```
   SELECT
       FROM aws_sqlserver_ext.sp_add_jobschedule (
           par_job_name := 'test_simple_job', 
           par_name := 'test_schedule', 
           par_freq_type := 4, /* Daily */
           par_freq_interval := 1, /* frequency_interval is unused */
           par_freq_subday_type := 4, /* Minutes */
           par_freq_subday_interval := 5 /* 5 minutes */);
   ```

   작업 단계는 함수가 수행하는 작업을 지정합니다.

이 작업을 삭제하려면 다음과 같이 `aws_sqlserver_ext.sp_delete_job` 함수를 사용합니다.

```
PERFORM aws_sqlserver_ext.sp_delete_job(
    par_job_name := 'PeriodicJob1'::character varying,
    par_delete_history := 1::smallint,
    par_delete_unused_schedule := 1::smallint);
```

# AWS SCT 확장 팩을 사용하여 PostgreSQL에서 SQL Server Database Mail 에뮬레이션
<a name="CHAP_Source.SQLServer.ToPostgreSQL.ExtensionPack.Mail"></a>

SQL Server Database Mail을 사용하여 SQL Server 데이터베이스 엔진 또는 Azure SQL Managed Instance에서 사용자에게 이메일 메시지를 보낼 수 있습니다. 이러한 이메일 메시지는 쿼리 결과를 포함하거나 네트워크에 있는 리소스의 파일을 포함할 수 있습니다. SQL Server Database Mail에 대한 자세한 내용은 [Microsoft 기술 문서](https://docs.microsoft.com/en-us/sql/relational-databases/database-mail/database-mail?view=sql-server-ver15)를 참조하세요.

PostgreSQL은 SQL Server Database Mail과 동일한 기능을 제공하지 않습니다. SQL Server Database Mail 기능을 에뮬레이션하기 위해 AWS SCT 는 확장 팩을 생성합니다. 이 확장 팩은 AWS Lambda 및 Amazon Simple Email Service(Amazon SES)를 사용합니다.는 사용자에게 Amazon SES 이메일 전송 서비스와 상호 작용할 수 있는 인터페이스를 AWS Lambda 제공합니다. 이 상호 작용을 설정하려면 Lambda 함수의 Amazon 리소스 이름(ARN)을 추가합니다.

새 이메일 계정의 경우 다음 명령을 사용합니다.

```
do
$$
begin
PERFORM sysmail_add_account_sp (
    par_account_name :='your_account_name',
    par_email_address := 'your_account_email',
    par_display_name := 'your_account_display_name',
    par_mailserver_type := 'AWSLAMBDA'
    par_mailserver_name := 'ARN'
);
end;
$$ language plpgsql;
```

Lambda 함수의 ARN을 기존 이메일 계정에 추가하려면 다음 명령을 사용합니다.

```
do
$$
begin
PERFORM sysmail_update_account_sp (
    par_account_name :='existind_account_name',
    par_mailserver_type := 'AWSLAMBDA'
    par_mailserver_name := 'ARN'
);
end;
$$ language plpgsql;
```

이전 예제에서 *`ARN`*은 Lambda 함수의 ARN입니다.

PostgreSQL에서 SQL Server Database Mail 동작을 에뮬레이션하기 위해 AWS SCT 확장 팩은 다음과 같은 테이블, 보기 및 프로시저를 사용합니다.

## PostgreSQL에서 SQL Server Database Mail을 에뮬레이션하는 테이블
<a name="CHAP_Source.SQLServer.ToPostgreSQL.ExtensionPack.Mail.Tables"></a>

SQL Server Database Mail을 에뮬레이션하기 위해 확장 팩은 다음 테이블을 사용합니다.

**sysmail\$1account**  
이메일 계정에 대한 정보를 저장합니다.

**sysmail\$1profile**  
사용자 프로필에 대한 정보를 저장합니다.

**sysmail\$1server**  
이메일 서버에 대한 정보를 저장합니다.

**sysmail\$1mailitems**  
이메일 메시지 목록을 저장합니다.

**sysmail\$1attachment**  
각 이메일 첨부 파일마다 하나의 행을 포함합니다.

**sysmail\$1log**  
이메일 메시지 전송에 대한 서비스 정보를 저장합니다.

**sysmail\$1profileaccount**  
사용자 프로필 및 이메일 계정에 대한 정보를 저장합니다.

## PostgreSQL에서 SQL Server Database Mail을 에뮬레이션하는 보기
<a name="CHAP_Source.SQLServer.ToPostgreSQL.ExtensionPack.Mail.Views"></a>

SQL Server Database Mail을 에뮬레이션하기 위해는 호환성을 보장하기 위해 PostgreSQL 데이터베이스에 다음 뷰를 AWS SCT 생성합니다. 확장 팩에서는 이러한 보기를 사용하지 않지만 변환된 코드는 이러한 보기를 쿼리할 수 있습니다.

**sysmail\$1allitems**  
모든 이메일 목록이 포함됩니다.

**sysmail\$1faileditems**  
전송할 수 없는 이메일 목록이 포함됩니다.

**sysmail\$1sentitems**  
보낸 이메일 목록이 포함됩니다.

**sysmail\$1unsentitems**  
아직 전송되지 않은 이메일 목록이 포함됩니다.

**sysmail\$1mailattachments**  
첨부 파일 목록이 포함됩니다.

## PostgreSQL에서 SQL Server Database Mail을 에뮬레이션하는 프로시저
<a name="CHAP_Source.SQLServer.ToPostgreSQL.ExtensionPack.Mail.Procedures"></a>

SQL Server Database Mail을 에뮬레이션하기 위해 확장 팩은 다음 프로시저를 사용합니다.

**sp\$1send\$1dbmail**  
지정된 수신자에게 이메일을 보냅니다.

**sysmail\$1add\$1profile\$1sp**  
새 사용자 프로필을 생성합니다.

**sysmail\$1add\$1account\$1sp**  
SMTP(Simple Mail Transfer Protocol) 보안 인증 정보 등과 같은 정보를 저장하는 새로운 이메일 계정을 생성합니다.

**sysmail\$1add\$1profileaccount\$1sp**  
지정된 사용자 프로필에 이메일 계정을 추가합니다.

**sysmail\$1update\$1profile\$1sp**  
설명, 이름 등과 같은 사용자 프로필의 속성을 변경합니다.

**sysmail\$1update\$1account\$1sp**  
기존 이메일 계정의 정보를 변경합니다.

**sysmail\$1update\$1profileaccount\$1sp**  
지정된 사용자 프로필의 이메일 계정 정보를 업데이트합니다.

**sysmail\$1delete\$1profileaccount\$1sp**  
지정된 사용자 프로필에서 이메일 계정을 제거합니다.

**sysmail\$1delete\$1account\$1sp**  
이메일 계정을 삭제합니다.

**sysmail\$1delete\$1profile\$1sp**  
사용자 프로필을 삭제합니다.

**sysmail\$1delete\$1mailitems\$1sp**  
내부 테이블에서 이메일을 삭제합니다.

**sysmail\$1help\$1profile\$1sp**  
사용자 프로필에 대한 정보를 표시합니다.

**sysmail\$1help\$1account\$1sp**  
이메일 계정에 대한 정보를 표시합니다.

**sysmail\$1help\$1profileaccount\$1sp**  
사용자 프로필과 연결된 이메일 계정 관련 정보를 표시합니다.

**sysmail\$1dbmail\$1json**  
 AWS Lambda 함수에 대한 JSON 요청을 생성하는 내부 절차입니다.

**sysmail\$1verify\$1profile\$1sp, sysmail\$1verify\$1account\$1sp, sysmail\$1verify\$1addressparams\$1sp**  
설정을 확인하는 내부 프로시저입니다.

**sp\$1get\$1dbmail, sp\$1set\$1dbmail, sysmail\$1dbmail\$1xml**  
더 이상 사용되지 않는 내부 프로시저입니다.

## PostgreSQL에서 SQL Server Database Mail을 에뮬레이션하는 프로시저의 구문
<a name="CHAP_Source.SQLServer.ToPostgreSQL.ExtensionPack.Mail.Syntax"></a>

확장 팩의 `aws_sqlserver_ext.sp_send_dbmail` 프로시저는 `msdb.dbo.sp_send_dbmail` 프로시저를 에뮬레이션합니다. 소스 SQL Server Database Mail 프로시저에 대한 자세한 내용은 [Microsoft 기술 문서](https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-send-dbmail-transact-sql?view=sql-server-ver15)를 참조하세요.

```
par_profile_name varchar = NULL::character varying,
par_recipients text = NULL::text,
par_copy_recipients text = NULL::text,
par_blind_copy_recipients text = NULL::text,
par_subject varchar = NULL::character varying,
par_body text = NULL::text,
par_body_format varchar = NULL::character varying,
par_importance varchar = 'NORMAL'::character varying,
par_sensitivity varchar = 'NORMAL'::character varying,
par_file_attachments text = NULL::text,
par_query text = NULL::text,
par_execute_query_database varchar = NULL::character varying,
par_attach_query_result_as_file smallint = 0,
par_query_attachment_filename varchar = NULL::character varying,
par_query_result_header smallint = 1,
par_query_result_width integer = 256,
par_query_result_separator VARCHAR = ' '::character varying,
par_exclude_query_output smallint = 0,
par_append_query_error smallint = 0,
par_query_no_truncate smallint = 0,
par_query_result_no_padding smallint = 0,
out par_mailitem_id integer,
par_from_address text = NULL::text,
par_reply_to text = NULL::text,
out returncode integer
```

확장 팩의 `aws_sqlserver_ext.sysmail_delete_mailitems_sp` 프로시저는 `msdb.dbo.sysmail_delete_mailitems_sp` 프로시저를 에뮬레이션합니다. 소스 SQL Server Database Mail 프로시저에 대한 자세한 내용은 [Microsoft 기술 문서](https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sysmail-delete-mailitems-sp-transact-sql?view=sql-server-ver15)를 참조하세요.

```
par_sent_before timestamp = NULL::timestamp without time zone,
par_sent_status varchar = NULL::character varying,
out returncode integer
```

확장 팩의 `aws_sqlserver_ext.sysmail_add_profile_sp` 프로시저는 `msdb.dbo.sysmail_add_profile_sp` 프로시저를 에뮬레이션합니다. 소스 SQL Server Database Mail 프로시저에 대한 자세한 내용은 [Microsoft 기술 문서](https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sysmail-add-profile-sp-transact-sql?view=sql-server-ver15)를 참조하세요.

```
par_profile_name varchar,
par_description varchar = NULL::character varying,
out par_profile_id integer,
out returncode integer
```

확장 팩의 `aws_sqlserver_ext.sysmail_add_account_sp` 프로시저는 `msdb.dbo.sysmail_add_account_sp` 프로시저를 에뮬레이션합니다. 소스 SQL Server Database Mail 프로시저에 대한 자세한 내용은 [Microsoft 기술 문서](https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sysmail-add-account-sp-transact-sql?view=sql-server-ver15)를 참조하세요.

```
par_account_name varchar
par_email_address varchar
par_display_name varchar = NULL::character varying
par_replyto_address varchar = NULL::character varying
par_description varchar = NULL::character varying
par_mailserver_name varchar = NULL::character varying
par_mailserver_type varchar = 'SMTP'::bpchar
par_port integer = 25
par_username varchar = NULL::character varying
par_password varchar = NULL::character varying
par_use_default_credentials smallint = 0
par_enable_ssl smallint = 0
out par_account_id integer
out returncode integer
```

확장 팩의 `aws_sqlserver_ext.sysmail_add_profileaccount_sp` 프로시저는 `msdb.dbo.sysmail_add_profileaccount_sp` 프로시저를 에뮬레이션합니다. 소스 SQL Server Database Mail 프로시저에 대한 자세한 내용은 [Microsoft 기술 문서](https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sysmail-add-profileaccount-sp-transact-sql?view=sql-server-ver15)를 참조하세요.

```
par_profile_id integer = NULL::integer,
par_profile_name varchar = NULL::character varying,
par_account_id integer = NULL::integer,
par_account_name varchar = NULL::character varying,
par_sequence_number integer = NULL::integer,
out returncode integer
```

확장 팩의 `aws_sqlserver_ext.sysmail_help_profile_sp` 프로시저는 `msdb.dbo.sysmail_help_profile_sp` 프로시저를 에뮬레이션합니다. 소스 SQL Server Database Mail 프로시저에 대한 자세한 내용은 [Microsoft 기술 문서](https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sysmail-help-profile-sp-transact-sql?view=sql-server-ver15)를 참조하세요.

```
par_profile_id integer = NULL::integer,
par_profile_name varchar = NULL::character varying,
out returncode integer
```

확장 팩의 `aws_sqlserver_ext.sysmail_update_profile_sp` 프로시저는 `msdb.dbo.sysmail_update_profile_sp` 프로시저를 에뮬레이션합니다. 소스 SQL Server Database Mail 프로시저에 대한 자세한 내용은 [Microsoft 기술 문서](https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sysmail-update-profile-sp-transact-sql?view=sql-server-ver15)를 참조하세요.

```
par_profile_id integer = NULL::integer,
par_profile_name varchar = NULL::character varying,
par_description varchar = NULL::character varying,
out returncode integer
```

확장 팩의 `aws_sqlserver_ext.sysmail_delete_profile_sp` 프로시저는 `msdb.dbo.sysmail_delete_profile_sp` 프로시저를 에뮬레이션합니다. 소스 SQL Server Database Mail 프로시저에 대한 자세한 내용은 [Microsoft 기술 문서](https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sysmail-delete-profile-sp-transact-sql?view=sql-server-ver15)를 참조하세요.

```
par_profile_id integer = NULL::integer,
par_profile_name varchar = NULL::character varying,
par_force_delete smallint = 1,
out returncode integer
```

확장 팩의 `aws_sqlserver_ext.sysmail_help_account_sp` 프로시저는 `msdb.dbo.sysmail_help_account_sp` 프로시저를 에뮬레이션합니다. 소스 SQL Server Database Mail 프로시저에 대한 자세한 내용은 [Microsoft 기술 문서](https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sysmail-help-account-sp-transact-sql?view=sql-server-ver15)를 참조하세요.

```
par_account_id integer = NULL::integer,
par_account_name varchar = NULL::character varying,
out returncode integer
```

확장 팩의 `aws_sqlserver_ext.sysmail_update_account_sp` 프로시저는 `msdb.dbo.sysmail_update_account_sp` 프로시저를 에뮬레이션합니다. 소스 SQL Server Database Mail 프로시저에 대한 자세한 내용은 [Microsoft 기술 문서](https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sysmail-update-account-sp-transact-sql?view=sql-server-ver15)를 참조하세요.

```
par_account_id integer = NULL::integer,
par_account_name varchar = NULL::character varying,
par_email_address varchar = NULL::character varying,
par_display_name varchar = NULL::character varying,
par_replyto_address varchar = NULL::character varying,
par_description varchar = NULL::character varying,
par_mailserver_name varchar = NULL::character varying,
par_mailserver_type varchar = NULL::character varying,
par_port integer = NULL::integer,
par_username varchar = NULL::character varying,
par_password varchar = NULL::character varying,
par_use_default_credentials smallint = NULL::smallint,
par_enable_ssl smallint = NULL::smallint,
par_timeout integer = NULL::integer,
par_no_credential_change smallint = NULL::smallint,
out returncode integer
```

확장 팩의 `aws_sqlserver_ext.sysmail_delete_account_sp` 프로시저는 `msdb.dbo.sysmail_delete_account_sp` 프로시저를 에뮬레이션합니다. 소스 SQL Server Database Mail 프로시저에 대한 자세한 내용은 [Microsoft 기술 문서](https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sysmail-delete-account-sp-transact-sql?view=sql-server-ver15)를 참조하세요.

```
par_account_id integer = NULL::integer,
par_account_name varchar = NULL::character varying,
out returncode integer
```

확장 팩의 `aws_sqlserver_ext.sysmail_help_profileaccount_sp` 프로시저는 `msdb.dbo.sysmail_help_profileaccount_sp` 프로시저를 에뮬레이션합니다. 소스 SQL Server Database Mail 프로시저에 대한 자세한 내용은 [Microsoft 기술 문서](https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sysmail-help-profileaccount-sp-transact-sql?view=sql-server-ver15)를 참조하세요.

```
par_profile_id integer = NULL::integer,
par_profile_name varchar = NULL::character varying,
par_account_id integer = NULL::integer,
par_account_name varchar = NULL::character varying,
out returncode integer
```

확장 팩의 `aws_sqlserver_ext.sysmail_update_profileaccount_sp` 프로시저는 `msdb.dbo.sysmail_update_profileaccount_sp` 프로시저를 에뮬레이션합니다. 소스 SQL Server Database Mail 프로시저에 대한 자세한 내용은 [Microsoft 기술 문서](https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sysmail-update-profileaccount-sp-transact-sql?view=sql-server-ver15)를 참조하세요.

```
par_profile_id integer = NULL::integer,
par_profile_name varchar = NULL::character varying,
par_account_id integer = NULL::integer,
par_account_name varchar = NULL::character varying,
par_sequence_number integer = NULL::integer,
out returncode integer
```

확장 팩의 `aws_sqlserver_ext.sysmail_delete_profileaccount_sp` 프로시저는 `msdb.dbo.sysmail_delete_profileaccount_sp` 프로시저를 에뮬레이션합니다. 소스 SQL Server Database Mail 프로시저에 대한 자세한 내용은 [Microsoft 기술 문서](https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sysmail-delete-profileaccount-sp-transact-sql?view=sql-server-ver15)를 참조하세요.

```
par_profile_id integer = NULL::integer,
par_profile_name varchar = NULL::character varying,
par_account_id integer = NULL::integer,
par_account_name varchar = NULL::character varying,
out returncode integer
```

## PostgreSQL에서 SQL Server Database Mail을 에뮬레이션하는 프로시저 사용 예제
<a name="CHAP_Source.SQLServer.ToPostgreSQL.ExtensionPack.Mail.Examples"></a>

이메일을 보내려면 다음과 같이 `aws_sqlserver_ext.sp_send_dbmail` 프로시저를 사용합니다.

```
PERFORM sp_send_dbmail (
    par_profile_name := 'Administrator',
    par_recipients := 'hello@rusgl.info',
    par_subject := 'Automated Success Message',
    par_body := 'The stored procedure finished'
);
```

다음 예제는 쿼리 결과가 포함된 이메일을 전송하는 방법을 보여줍니다.

```
PERFORM sp_send_dbmail (
    par_profile_name := 'Administrator',
    par_recipients := 'hello@rusgl.info',
    par_subject := 'Account with id = 1',
    par_query := 'SELECT COUNT(*)FROM Account WHERE id = 1'
);
```

다음 예제는 HTML 코드가 포함된 이메일을 전송하는 방법을 보여줍니다.

```
DECLARE var_tableHTML TEXT;
SET var_tableHTML := CONCAT(
    '<H1>Work Order Report</H1>',
    '<table border="1">',
    '<tr><th>Work Order ID</th><th>Product ID</th>',
    '<th>Name</th><th>Order Qty</th><th>Due Date</th>',
    '<th>Expected Revenue</th></tr>',
    '</table>'
);
PERFORM sp_send_dbmail (
    par_recipients := 'hello@rusgl.info',
    par_subject := 'Work Order List',
    par_body := var_tableHTML,
    par_body_format := 'HTML'
);
```

이메일을 삭제하려면 다음과 같이 `aws_sqlserver_ext.sysmail_delete_mailitems_sp` 프로시저를 사용합니다.

```
DECLARE var_GETDATE datetime;
SET var_GETDATE = NOW();
PERFORM sysmail_delete_mailitems_sp (
    par_sent_before := var_GETDATE
);
```

다음 예제는 가장 오래된 이메일을 삭제하는 방법을 보여줍니다.

```
PERFORM sysmail_delete_mailitems_sp (
    par_sent_before := '31.12.2015'
);
```

다음 예제는 전송할 수 없는 모든 이메일을 삭제하는 방법을 보여줍니다.

```
PERFORM sysmail_delete_mailitems_sp (
    par_sent_status := 'failed'
);
```

새 사용자 프로필을 생성하려면 다음과 같이 `aws_sqlserver_ext.sysmail_add_profile_sp` 프로시저를 사용합니다.

```
PERFORM sysmail_add_profile_sp (
    profile_name := 'Administrator',
    par_description := 'administrative mail'
);
```

다음 예제는 새 프로필을 생성하고 고유한 프로필 식별자를 변수로 저장하는 방법을 보여줍니다.

```
DECLARE var_profileId INT;
SELECT par_profile_id
    FROM sysmail_add_profile_sp (
        profile_name := 'Administrator',
        par_description := ' Profile used for administrative mail.')
    INTO var_profileId;
    
SELECT var_profileId;
```

새 이메일 계정을 생성하려면 다음과 같이 `aws_sqlserver_ext.sysmail_add_account_sp` 프로시저를 사용합니다.

```
PERFORM sysmail_add_account_sp (
    par_account_name :='Audit Account',
    par_email_address := 'dba@rusgl.info',
    par_display_name := 'Test Automated Mailer',
    par_description := 'Account for administrative e-mail.',
    par_mailserver_type := 'AWSLAMBDA'
    par_mailserver_name := 'arn:aws:lambda:us-west-2:555555555555:function:pg_v3'
);
```

사용자 프로필에 이메일 계정을 추가하려면 다음과 같이 `aws_sqlserver_ext.sysmail_add_profileaccount_sp` 프로시저를 사용합니다.

```
PERFORM sysmail_add_profileaccount_sp (
    par_account_name := 'Administrator',
    par_account_name := 'Audit Account',
    par_sequence_number := 1
);
```

## PostgreSQL에서 SQL Server Database Mail을 에뮬레이션하기 위한 사용 사례 예제
<a name="CHAP_Source.SQLServer.ToPostgreSQL.ExtensionPack.Mail.UseCases"></a>

소스 데이터베이스 코드가 SQL Server Database Mail을 사용하여 이메일을 보내는 경우 AWS SCT 확장 팩을 사용하여이 코드를 PostgreSQL로 변환할 수 있습니다.

**PostgreSQL 데이터베이스에서 이메일을 보내려면**

1.  AWS Lambda 함수를 생성하고 구성합니다.

1.  AWS SCT 확장 팩을 적용합니다.

1. 다음과 같이 `sysmail_add_profile_sp` 함수를 사용하여 사용자 프로필을 생성합니다.

1. 다음과 같이 `sysmail_add_account_sp` 함수를 사용하여 이메일 계정을 생성합니다.

1. 다음과 같이 `sysmail_add_profileaccount_sp` 함수를 사용하여 이 이메일 계정을 사용자 프로필에 추가합니다.

   ```
   CREATE OR REPLACE FUNCTION aws_sqlserver_ext.
   proc_dbmail_settings_msdb()
   RETURNS void
   AS
   $BODY$
   BEGIN
   PERFORM aws_sqlserver_ext.sysmail_add_profile_sp(
       par_profile_name := 'Administrator',
       par_description := 'administrative mail'
   );
   PERFORM aws_sqlserver_ext.sysmail_add_account_sp(
       par_account_name := 'Audit Account',
       par_description := 'Account for administrative e-mail.',
       par_email_address := 'dba@rusgl.info',
       par_display_name := 'Test Automated Mailer',
       par_mailserver_type := 'AWSLAMBDA'
       par_mailserver_name := 'your_ARN'
   );
   PERFORM aws_sqlserver_ext.sysmail_add_profileaccount_sp(
       par_profile_name := 'Administrator',
       par_account_name := 'Audit Account',
       par_sequence_number := 1
   );
   END;
   $BODY$
   LANGUAGE plpgsql;
   ```

1. 다음과 같이 `sp_send_dbmail` 함수를 사용하여 이메일을 보냅니다.

   ```
   CREATE OR REPLACE FUNCTION aws_sqlserver_ext.
   proc_dbmail_send_msdb()
   RETURNS void
   AS
   $BODY$
   BEGIN
   PERFORM aws_sqlserver_ext.sp_send_dbmail(
       par_profile_name := 'Administrator',
       par_recipients := 'hello@rusgl.info',
       par_body := 'The stored procedure finished',
       par_subject := 'Automated Success Message'
   );
   END;
   $BODY$
   LANGUAGE plpgsql;
   ```

모든 사용자 프로필에 대한 정보를 보려면 다음과 같이 `sysmail_help_profile_sp` 프로시저를 사용합니다.

```
SELECT FROM aws_sqlserver_ext.sysmail_help_profile_sp();
```

다음 예제는 특정 사용자 프로필에 대한 정보를 표시합니다.

```
select from aws_sqlserver_ext.sysmail_help_profile_sp(par_profile_id := 1);
select from aws_sqlserver_ext.sysmail_help_profile_sp(par_profile_name := 'Administrator');
```

모든 이메일 계정에 대한 정보를 보려면 다음과 같이 `sysmail_help_account_sp` 프로시저를 사용합니다.

```
select from aws_sqlserver_ext.sysmail_help_account_sp();
```

다음 예제는 특정 이메일 계정에 대한 정보를 표시합니다.

```
select from aws_sqlserver_ext.sysmail_help_account_sp(par_account_id := 1);
select from aws_sqlserver_ext.sysmail_help_account_sp(par_account_name := 'Audit Account');
```

사용자 프로필과 연결된 모든 이메일 계정에 대한 정보를 보려면 다음과 같이 `sysmail_help_profileaccount_sp` 프로시저를 사용합니다.

```
select from aws_sqlserver_ext.sysmail_help_profileaccount_sp();
```

다음 예제는 식별자, 프로필 이름 또는 계정 이름을 기준으로 레코드를 필터링합니다.

```
select from aws_sqlserver_ext.sysmail_help_profileaccount_sp(par_profile_id := 1);
select from aws_sqlserver_ext.sysmail_help_profileaccount_sp(par_profile_id := 1, par_account_id := 1);
select from aws_sqlserver_ext.sysmail_help_profileaccount_sp(par_profile_name := 'Administrator');
select from aws_sqlserver_ext.sysmail_help_profileaccount_sp(par_account_name := 'Audit Account');
```

사용자 프로필 이름 또는 설명을 변경하려면 다음과 같이 `sysmail_update_profile_sp` 프로시저를 사용합니다.

```
select aws_sqlserver_ext.sysmail_update_profile_sp(
    par_profile_id := 2,
    par_profile_name := 'New profile name'
);
```

이메일 계정 설정을 변경하려면 다음과 같이 `ysmail_update_account_sp` 프로시저를 사용합니다.

```
select from aws_sqlserver_ext.sysmail_update_account_sp (
    par_account_name := 'Audit Account',
    par_mailserver_name := 'arn:aws:lambda:region:XXXXXXXXXXXX:function:func_test',
    par_mailserver_type := 'AWSLAMBDA'
);
```

# 를 사용하여 SQL Server에서 Amazon RDS for SQL Server로 마이그레이션 AWS Schema Conversion Tool
<a name="CHAP_Source.SQLServer.ToRDSSQLServer"></a>

SQL Server 스키마와 코드를 Amazon RDS for SQL Server로 마이그레이션할 경우 몇 가지 사항을 고려해야 합니다.
+ AWS SCT 는 SQL Server 에이전트를 변환하여 Amazon RDS for SQL Server DB 인스턴스에서 일정, 알림 및 작업을 제공할 수 있습니다. 변환 후 Amazon RDS for SQL Server DB 인스턴스를 SSRS(SQL Server Reporting Service), SSAS(SQL Server Analysis Services), SSIS(SQL Server Integration Services)와 함께 사용할 수 있습니다.
+ 현재 Amazon RDS는 SQL Server Service Broker 또는 CREATE ENDPOINT 명령을 실행하는 데 필요한 추가 T-SQL 엔드포인트를 지원하지 않습니다.
+ Amazon RDS는 연결된 서버를 제한적으로 지원합니다. 연결된 서버를 사용하는 SQL Server 애플리케이션 코드를 변환할 때는 애플리케이션 코드를 AWS SCT 변환합니다. 사용자는 이 변환된 코드를 실행하기 전에 먼저 연결 서버를 사용하는 객체의 동작을 검토해야 합니다.
+ 상시 가동 기능이 사용됩니다.
+  AWS SCT 평가 보고서는 변환을 위한 서버 지표를 제공합니다. SQL Server 인스턴스에 대한 이러한 측정치에는 다음이 포함됩니다.
  + 데이터 미러링이 사용됩니다.
  + SQL Server 로그 전달이 구성되었습니다.
  + 장애 조치 클러스터가 사용됩니다.
  + Database Mail이 구성되었습니다.
  + 전체 텍스트 검색 서비스가 사용됩니다. Amazon RDS for SQL Server는 전체 텍스트 검색이 제한적이며 의미 체계 검색을 지원하지 않습니다.
  + 데이터 품질 서비스(DQS)가 설치되었습니다. Amazon RDS는 DQS를 지원하지 않으므로 Amazon EC2 인스턴스에 SQL Server를 설치하는 것이 좋습니다.

## RDS for SQL Server를 대상으로 사용하기 위한 권한
<a name="CHAP_Source.SQLServer.ToRDSSQLServer.ConfigureTarget"></a>

RDS for SQL Server로 마이그레이션하려면 데이터베이스 사용자를 생성하고 각 데이터베이스에 필요한 권한을 부여합니다. 다음과 같은 코드 예제를 사용할 수 있습니다.

```
CREATE LOGIN user_name WITH PASSWORD 'your_password';
                
USE db_name
CREATE USER user_name FOR LOGIN user_name
GRANT VIEW DEFINITION TO user_name
GRANT VIEW DATABASE STATE TO user_name
GRANT CREATE SCHEMA TO user_name;
GRANT CREATE TABLE TO user_name;
GRANT CREATE VIEW TO user_name;
GRANT CREATE TYPE TO user_name;
GRANT CREATE DEFAULT TO user_name;
GRANT CREATE FUNCTION TO user_name;
GRANT CREATE PROCEDURE TO user_name;
GRANT CREATE ASSEMBLY TO user_name;
GRANT CREATE AGGREGATE TO user_name;
GRANT CREATE FULLTEXT CATALOG TO user_name;
GRANT CREATE SYNONYM TO user_name;
GRANT CREATE XML SCHEMA COLLECTION TO user_name;
```

이전 예제에서 *user\$1name*을 사용자 이름으로 바꿉니다. 그런 다음 *db\$1name*을 대상 데이터베이스의 이름으로 바꿉니다. 마지막으로 *your\$1password*를 안전한 암호로 바꿉니다.