

# Amazon RDS에 SQL Server Agent 사용
<a name="Appendix.SQLServer.CommonDBATasks.Agent"></a>

Amazon RDS에서는 Microsoft SQL Server Enterprise Edition, Standard Edition 또는 Web Edition을 실행하는 DB 인스턴스에서 SQL Server 에이전트를 사용할 수 있습니다. SQL Server 에이전트는 예약된 관리 작업을 실행하는 Microsoft Windows 서비스입니다. SQL Server 에이전트를 사용하면 T-SQL 작업을 통해 인덱스를 리빌드하고, 손상 검사를 실행하고, SQL Server DB 인스턴스의 데이터를 집계할 수 있습니다.

SQL Server DB 인스턴스를 생성하면 마스터 사용자가 `SQLAgentUserRole` 역할에 등록됩니다.

SQL Server 에이전트는 특정 이벤트 발생 시, 혹은 필요에 따라 예약 작업을 실행할 수 있습니다. 자세한 내용은 Microsoft 설명서에서 [SQL Server 에이전트](http://msdn.microsoft.com/en-us/library/ms189237)를 참조하세요.

**참고**  
DB 인스턴스의 유지 관리 및 백업 기간 중에는 작업 실행을 예약하지 마세요. AWS를 통해 시작되는 유지 관리 및 백업 프로세스에 의해 작업이 중단되거나 취소될 수 있습니다.  
다중 AZ 배포에서 SQL Server 에이전트 작업은 작업 복제 기능이 켜져 있을 때 기본 호스트에서 보조 호스트로 복제됩니다. 자세한 내용은 [SQL Server 에이전트 작업 복제 켜기](#SQLServerAgent.Replicate) 섹션을 참조하세요.  
다중 AZ 배포에서는 SQL Server 에이전트 작업이 10,000개로 제한됩니다. 한도를 늘려야 할 경우 지원에 문의하여 할당량 증대를 요청하세요. [[지원 센터(AWS Support Center)](https://console.aws.amazon.com/support/home#/)] 페이지를 열고 필요한 경우, 로그인한 다음 [**사례 생성(Create Case)**]을 선택합니다. **Service Limit increase(서비스 한도 증가)**를 선택합니다. 양식을 작성하고 제출합니다.

SQL Server Management Studio(SSMS)에서 SQL Server 에이전트의 개별 작업 기록을 보려면 Object Explorer를 열고 작업을 마우스 오른쪽 버튼으로 클릭한 다음 [**기록 보기(View History)**]를 선택합니다.

SQL Server 에이전트는 DB 인스턴스의 관리형 호스트에서 실행되므로 일부 작업이 지원되지 않습니다.
+ 예를 들어 ActiveX, Windows cmdshell 또는 Windows PowerShell을 사용하여 복제 작업이나 명령줄 스크립트를 실행하는 것은 지원되지 않습니다.
+ SQL Server 에이전트를 수동으로 시작, 중지 또는 다시 시작할 수 없습니다.
+ SQL Server 에이전트를 통한 이메일 알림은 DB 인스턴스에서 사용할 수 없습니다.
+ SQL Server 에이전트 알림 및 연산자는 지원되지 않습니다.
+ SQL Server 에이전트를 사용한 백업 생성은 지원되지 않습니다. DB 인스턴스를 백업하려면 Amazon RDS를 사용합니다.
+ 현재 RDS for SQL Server는 SQL Server 에이전트 토큰 사용을 지원하지 않습니다.

## SQL Server 에이전트 작업 복제 켜기
<a name="SQLServerAgent.Replicate"></a>

다음 저장 프로시저를 사용하여 SQL Server 에이전트 작업 복제를 켤 수 있습니다.

```
EXECUTE msdb.dbo.rds_set_system_database_sync_objects @object_types = 'SQLAgentJob';
```

Amazon RDS for SQL Server에서 지원하는 모든 SQL Server 버전에서 저장 프로시저를 실행할 수 있습니다. 다음 범주의 작업이 복제됩니다.
+ [분류되지 않음(로컬)]
+ [분류되지 않음(멀티 서버)]
+ [분류되지 않음]
+ 데이터 수집기
+ 데이터베이스 엔진 튜닝 관리자
+ 데이터베이스 유지 관리
+ 전체 텍스트

T-SQL 작업 단계를 사용하는 작업만 복제됩니다. SSIS(SQL Server Integration Services), SSRS(SQL Server Reporting Service), 복제 및 PowerShell과 같은 단계 유형이 있는 작업은 복제되지 않습니다. 데이터베이스 메일 및 서버 수준 객체를 사용하는 작업은 복제되지 않습니다.

**중요**  
프라이머리 호스트는 복제를 위한 신뢰할 수 있는 소스입니다. 작업 복제를 설정하기 전에 SQL Server 에이전트 작업이 프라이머리에 있는지 확인합니다. 새 작업이 보조 호스트에 있을 때 이 기능을 설정하면 SQL Server 에이전트 작업이 삭제될 수 있습니다.

다음 기능을 사용하면 복제가 켜져 있는지 확인할 수 있습니다.

```
SELECT * from msdb.dbo.rds_fn_get_system_database_sync_objects();
```

 T-SQL 쿼리는 SQL Server 에이전트 작업이 복제되는 경우 다음을 반환합니다. 복제하지 않으면 `object_class`에 대해 아무 것도 반환하지 않습니다.

![\[SQL Server 에이전트 작업이 복제 중입니다.\]](http://docs.aws.amazon.com/ko_kr/AmazonRDS/latest/UserGuide/images/SQLAgentJob.png)


다음 함수를 사용하여 객체가 마지막으로 동기화된 시간(UTC 시간)을 찾을 수 있습니다.

```
SELECT * from msdb.dbo.rds_fn_server_object_last_sync_time();
```

예를 들어 SQL Server 에이전트 작업을 01:00에 수정한다고 가정합니다. 가장 최근에 동기화된 시간은 동기화가 수행되었음을 나타내는 01:00 이후일 것으로 예상합니다.

동기화 후에는 보조 노드에서 반환된 `date_created`와 `date_modified`가 일치할 것으로 예상됩니다.

![\[서버 객체가 마지막으로 동기화된 시간은 01:21:23이었습니다.\]](http://docs.aws.amazon.com/ko_kr/AmazonRDS/latest/UserGuide/images/SQLAgentJob_last_sync_time.png)


`tempdb` 복제를 함께 사용하는 경우 `@object_type` 파라미터에 SQL 에이전트 작업과 `tempdb` 구성을 제공하여 둘 모두에 대해 복제를 활성화할 수 있습니다.

```
EXECUTE msdb.dbo.rds_set_system_database_sync_objects @object_types = 'SQLAgentJob,TempDbFile';
```

`tempdb` 복제에 대한 자세한 내용은 [다중 AZ 배포에 대한 TempDB 구성](SQLServer.TempDB.MAZ.md) 섹션을 참조하세요.

# SQL Server 에이전트 역할
<a name="SQLServerAgent.AgentRoles"></a>

RDS for SQL Server는 작업 관리를 위한 각기 다른 수준의 권한을 가진 다음과 같은 SQL Server 에이전트 역할을 지원합니다.
+ **SQLAgentUserRole**

  권한
  + 자체 작업, 일정 및 연산자 생성 및 관리
  + 자체 작업 및 일정의 속성 보기
  + 다른 사용자가 생성한 작업을 보거나 관리할 수 없음

  이 역할은 자신의 작업을 생성하고 관리해야 하지만 다른 사용자가 생성한 작업에는 액세스할 필요가 없는 사용자에게 적합합니다.
+ **SQLAgentReaderRole**

  권한
  + SQLAgentUserRole의 모든 권한
  + 다른 사용자가 생성한 작업 및 일정을 포함하여 모든 작업 및 일정 목록 보기
  + 모든 작업의 속성 보기
  + 작업 기록 검토

  이 역할은 모든 작업의 상태를 모니터링해야 하지만 관리할 필요는 없는 사용자에게 적합합니다.
+ **SQLAgentOperatorRole**

  권한
  + SQLAgentUserRole 및 SQLAgentReaderRole의 모든 권한
  + 작업 실행, 중지 또는 시작
  + 작업 기록 관리
  + 작업 및 일정 활성화/비활성화
  + 연산자 및 프록시 보기

  이 역할은 가장 포괄적인 권한을 제공하며 모든 작업을 완전히 제어해야 하는 사용자에게 적합합니다.

다음 명령을 사용하여 SQL Server 로그인에 역할을 할당합니다.

```
USE msdb;
EXEC sp_addrolemember 'SQLAgentOperatorRole', 'username';
```

## RDS for SQL Server에서 SQLAgentOperatorRole 관리
<a name="SQLServerAgent.AgentRoles.ManageSQLAgentOperatorRole"></a>

현재 작업을 보려면 SQL Server 로그인에 SQLAgentOperatorRole을 추가하고 데이터베이스 연결을 해제하기 전에 제거해야 합니다.

SQL Server Management Studio에서 SQL Server 에이전트 트리를 시각화하려면 다음 지침을 따르세요.

**SQL Server Management Studio(SSMS)에서 SQL Server 에이전트 보기**

1. RDS 마스터 자격 증명을 사용하여 RDS SQL Server 인스턴스에 로그인하고 원하는 사용자에게 SQLAgentUserRole을 부여합니다.

   ```
   USE msdb
   GO
   IF NOT EXISTS(SELECT name FROM sys.database_principals WHERE name = 'UserName')
   BEGIN
   CREATE USER UserName FROM LOGIN UserName
   END
   GO
   ALTER ROLE SQLAgentUserRole ADD MEMBER UserName
   GO
   GRANT ALTER ON ROLE::[SQLAgentOperatorRole] to UserName
   GO
   ```

   이러한 명령은 사용자가 존재하지 않는 경우 `msdb` 데이터베이스에 사용자를 생성합니다. 또한 SSMS의 SQL Server 에이전트 트리가 표시되도록 SQLAgentUserRole에 사용자를 추가합니다. 마지막으로, SQLAgentOperatorRole에 대한 변경 권한을 사용자에게 부여합니다. 이렇게 하면 사용자가 해당 역할에 자신을 추가/제거할 수 있습니다.

1. 위에서 언급한 역할에 자신을 추가하려면 작업을 확인해야 하는 사용자와 함께 RDS SQL Server 인스턴스에 연결하고 다음 스크립트를 실행합니다.

   ```
   use msdb
   go
   ALTER ROLE SQLAgentOperatorRole ADD MEMBER UserName
   GO
   ```

   그런 다음, **작업** 폴더를 마우스 오른쪽 버튼으로 클릭하고 **새로 고침**을 선택합니다.

1. 이 작업을 수행하면 **작업** 탭에 **\$1**(더하기) 버튼이 표시됩니다. 이 버튼을 클릭하여 SQL Server 에이전트 작업 목록을 확장합니다.

1. 
**중요**  
RDS SQL Server 인스턴스에서 연결을 해제하기 전에 SQLAgentOperatorRole에서 자신을 제거해야 합니다.

   SQLAgentOperatorRole에서 로그인을 제거하려면 Management Studio를 연결 해제하거나 닫기 전에 다음 쿼리를 실행합니다.

   ```
   USE msdb
   GO
   ALTER ROLE SQLAgentOperatorRole DROP MEMBER UserName
   GO
   ```

자세한 내용은 [Leveraging SQLAgentOperatorRole in RDS SQL Server](https://aws.amazon.com/blogs/database/leveraging-sqlagentoperatorrole-in-rds-sql-server/)을 참조하세요.

# SQLAgentUser 역할에 사용자 추가
<a name="SQLServerAgent.AddUser"></a>

추가 로그인 또는 사용자의 SQL Server 에이전트 사용을 허용하려면 마스터 사용자로 로그인한 후 다음을 수행합니다.

1. `CREATE LOGIN` 명령을 사용하여 다른 서버 수준 로그인을 생성합니다.

1. `msdb` 명령을 사용하여 `CREATE USER` 사용자를 생성한 다음 이전 단계에서 생성한 로그인에 이 사용자를 연결합니다.

1. `SQLAgentUserRole` 시스템 저장 프로시저를 사용하여 `sp_addrolemember`에 사용자를 추가합니다.

예를 들어 마스터 사용자 이름은 **admin**이며, 이름이 **theirname**이고 암호가 **theirpassword**인 사용자에게 SQL Server 에이전트에 대한 액세스 권한을 부여한다고 가정하겠습니다. 이 경우 다음 절차를 사용할 수 있습니다.

**SQLAgentUser 역할에 사용자를 추가하려면**

1. 마스터 사용자로 로그인합니다.

1. 다음 명령을 실행합니다:

   ```
   --Initially set context to master database
   USE [master];
   GO
   --Create a server-level login named theirname with password theirpassword
   CREATE LOGIN [theirname] WITH PASSWORD = 'theirpassword';
   GO
   --Set context to msdb database
   USE [msdb];
   GO
   --Create a database user named theirname and link it to server-level login theirname
   CREATE USER [theirname] FOR LOGIN [theirname];
   GO
   --Added database user theirname in msdb to SQLAgentUserRole in msdb
   EXEC sp_addrolemember [SQLAgentUserRole], [theirname];
   ```

# SQL Server 에이전트 작업 삭제
<a name="SQLServerAgent.DeleteJob"></a>

`sp_delete_job` 저장 프로시저를 사용하여 Amazon RDS for Microsoft SQL Server의 SQL Server 에이전트 작업을 삭제합니다.

SSMS를 사용하여 SQL Server 에이전트 작업을 삭제할 수는 없습니다. 그렇게 하면 다음과 유사한 오류 메시지가 표시됩니다.

```
The EXECUTE permission was denied on the object 'xp_regread', database 'mssqlsystemresource', schema 'sys'.
```

RDS는 관리형 서비스이기 때문에 Windows 레지스트리에 액세스하는 프로시저의 실행을 제한합니다. SSMS를 사용하는 경우 SSMS는 RDS에 의해 권한이 부여되지 않은 프로세스(`xp_regread`)를 실행하려고 시도합니다.

**참고**  
RDS for SQL Server에서는 sysadmin 역할의 구성원만 다른 로그인에서 소유한 작업을 업데이트하거나 삭제할 수 있습니다. 자세한 내용은 [Leveraging SQLAgentOperatorRole in RDS SQL Server](https://aws.amazon.com/blogs/database/leveraging-sqlagentoperatorrole-in-rds-sql-server/)을 참조하세요.

**SQL Server 에이전트 작업을 삭제하려면**
+ 다음 T-SQL 문을 실행합니다.

  ```
  EXEC msdb..sp_delete_job @job_name = 'job_name';
  ```