

# Uso del Agente SQL Server para Amazon RDS
<a name="Appendix.SQLServer.CommonDBATasks.Agent"></a>

Con Amazon RDS, puede usar el Agente SQL Server en una instancia de base de datos en la que se ejecuta Microsoft SQL Server Enterprise Edition, Standard Edition o Web Edition. El Agente SQL Server es un servicio de Microsoft Windows que ejecuta tareas administrativas programadas que se denominan trabajos. Puede usar el Agente SQL Server para ejecutar trabajos de T-SQL que reconstruyan índices, ejecuten comprobaciones de daños y agrupen datos en una instancia de base de datos de SQL Server.

Cuando se crea una instancia de base de datos de SQL Server, el usuario maestro tiene asignado el rol `SQLAgentUserRole`.

El Agente SQL Server puede ejecutar un trabajo según un calendario, en respuesta a un evento concreto o bajo demanda. Para obtener más información, consulte [SQL Server Agent](http://msdn.microsoft.com/en-us/library/ms189237) en la documentación de Microsoft.

**nota**  
Evite programar trabajos para que se ejecuten durante los periodos de mantenimiento y de copia de seguridad de la instancia de base de datos. Los procesos de mantenimiento y copia de seguridad lanzados por AWS podrían interrumpir el trabajo o hacer que se cancele.  
En las implementaciones Multi-AZ, los trabajos de SQL Server Agent se replican desde el host principal al host secundario cuando la función de replicación de trabajos está activada. Para obtener más información, consulte [Activación de la replicación de trabajos del agente de SQL Server](#SQLServerAgent.Replicate).  
Las implementaciones multi-AZ tienen un límite de 10 000 trabajos del Agente SQL Server. Si se necesitan límites más altos, solicite un aumento; para ello, contáctese con Soporte. Abra la página del [centro de AWS Support](https://console.aws.amazon.com/support/home#/), inicie sesión si es preciso y, luego, elija **Create Case (Crear caso)**. Seleccione **Service limit increase (Aumento del límite de servicio)**. Rellene y envíe el formulario.

Para ver el historial de un trabajo individual del Agente de SQL Server en SQL Server Management Studio (SSMS), abra el explorador de objetos, haga clic con el botón derecho en el trabajo y, a continuación, elija **View History (Ver historial)**.

Como el Agente SQL Server se ejecuta en un anfitrión administrado de una instancia de base de datos, algunas opciones no son compatibles:
+ No se admite la ejecución de trabajos de reproducción y de scripts de línea de comando por medio de ActiveX, el shell de comandos de Windows o Windows PowerShell.
+ No puede iniciar, detener ni reiniciar el Agente de SQL Server de forma manual.
+ Las notificaciones de email a través del Agente de SQL Server no están disponibles desde una instancia de base de datos.
+ No se admiten las alertas ni los operadores del Agente de SQL Server.
+ No se admite el uso del Agente de SQL Server para crear copias de seguridad. Utilice Amazon RDS para realizar una copia de seguridad de la instancia de base de datos.
+ Actualmente, RDS para SQL Server no admite el uso de tokens del Agente SQL Server.

## Activación de la replicación de trabajos del agente de SQL Server
<a name="SQLServerAgent.Replicate"></a>

Puede activar la replicación de trabajos del agente de SQL Server mediante el siguiente procedimiento almacenado:

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

Puede ejecutar el procedimiento almacenado en todas las versiones de SQL Server compatibles con Amazon RDS for SQL Server. Los trabajos de las siguientes categorías se replican:
+ [Sin categoría (local)]
+ [Sin categoría (multiservidor)]
+ [Sin categoría]
+ Recopilador de datos
+ Asesor de ajuste del motor de base de datos
+ Mantenimiento de bases de datos
+ Texto completo

Solo se replican los trabajos que utilizan pasos de trabajo de T-SQL. Los trabajos con tipos de pasos como SQL Server Integration Services (SSIS), SQL Server Reporting Services (SSRS), Replication y PowerShell no se replican. Los trabajos que utilizan Database Mail y objetos de nivel de servidor no se replican.

**importante**  
El host principal es el origen de información para la replicación. Antes de activar la replicación de trabajos, asegúrese de que sus trabajos de SQL Server Agent están en el principal. Si no lo hace, podría eliminar sus trabajos de SQL Server Agent si activa la característica cuando hay trabajos más nuevos en el host secundario.

Puede utilizar la siguiente función para confirmar si la replicación está activada.

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

 La consulta T-SQL devuelve lo siguiente si los trabajos del agente de SQL Server se están replicando. Si no se están replicando, no devuelve nada para `object_class`.

![\[Los trabajos del agente de SQL Server se están replicando\]](http://docs.aws.amazon.com/es_es/AmazonRDS/latest/UserGuide/images/SQLAgentJob.png)


Puede utilizar la siguiente función para saber cuál fue la última vez que se sincronizaron los objetos con la configuración de hora UTC.

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

Por ejemplo, supongamos que modifica un trabajo de agente de SQL Server a las 01:00. Se espera que la hora de sincronización más reciente sea posterior a las 01:00, lo que indica que se ha producido la sincronización.

Tras la sincronización, se espera que los valores que se devuelven para `date_created` y `date_modified` en el nodo secundario coincidan.

![\[La última vez que se sincronizaron los objetos del servidor fue a las 01:21:23\]](http://docs.aws.amazon.com/es_es/AmazonRDS/latest/UserGuide/images/SQLAgentJob_last_sync_time.png)


Si también utiliza la replicación con `tempdb`, puede habilitar la replicación tanto para los trabajos del Agente SQL como para la configuración de `tempdb` proporcionándolos en el parámetro `@object_type`:

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

Para obtener información sobre la replicación con `tempdb`, consulte [Configuración de TempDB para implementaciones multi-AZ](SQLServer.TempDB.MAZ.md).

# Roles de Agente SQL Server
<a name="SQLServerAgent.AgentRoles"></a>

RDS para SQL Server admite los siguientes roles de Agente SQL Server con diferentes niveles de permisos para administrar los trabajos:
+ **SQLAgentUserRole**

  Permisos
  + Crear y administrar trabajos, programaciones y operadores propios
  + Ver las propiedades de los trabajos y las programaciones propios
  + No puede ver ni administrar trabajos creados por otros usuarios

  Este rol es adecuado para usuarios que necesitan crear y administrar trabajos propios, pero no requieren acceso a los trabajos creados por otros usuarios.
+ **SQLAgentReaderRole**

  Permisos
  + Todos los permisos de SQLAgentUserRole
  + Ver una lista de todos los trabajos y programaciones, incluidos los creados por otros
  + Ver las propiedades de todos los trabajos
  + Consultar el historial de trabajos

  Este rol es adecuado para usuarios que necesitan supervisar el estado de todos los trabajos, pero no necesitan administrarlos.
+ **SQLAgentOperatorRole**

  Permisos
  + Todos los permisos de SQLAgentUserRole y SQLAgentReaderRole
  + Ejecutar, detener o iniciar trabajos
  + Administrar el historial de trabajos
  + Habilitar o deshabilitar trabajos y programaciones
  + Ver operadores y proxies

  Este rol proporciona los permisos más completos y es adecuado para usuarios que necesitan tener control total sobre todos los trabajos.

Utilice el siguiente comando para asignar los roles al inicio de sesión de SQL Server:

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

## Administración de SQLAgentOperatorRole en RDS para SQL Server
<a name="SQLServerAgent.AgentRoles.ManageSQLAgentOperatorRole"></a>

Para ver los trabajos actuales, debe agregar SQLAgentOperatorRole al inicio de sesión de SQL Server y eliminarlo antes de desconectarse de la base de datos.

Para visualizar el árbol de Agente SQL Server en SQL Server Management Studio, siga estas instrucciones:

**Visualización de Agente SQL Server en SQL Server Management Studio (SSMS)**

1. Con las credenciales maestras de RDS, inicie sesión en la instancia de RDS SQL Server y conceda al usuario deseado el rol 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
   ```

   Estos comandos crean el usuario en la base de datos `msdb`, en caso de que no exista. También agrega al usuario a SQLAgentUserRole, para que se pueda ver el árbol de Agente SQL Server en SSMS. Por último, concede permisos de alteración en SQLAgentOperatorRole al usuario. Esto permite al usuario agregarse o eliminarse de ese rol. 

1. Para agregarse al rol mencionado anteriormente, conéctese a la instancia de RDS SQL Server con el usuario que necesita ver los trabajos y ejecute el siguiente script.

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

   Después de esto, haga clic con el botón derecho en la carpeta **Trabajos** y elija **Actualizar**.

1. Al realizar esta acción, la pestaña **Trabajos** muestra el botón **\$1** (más). Haga clic para expandir la lista de trabajos de Agente SQL Server.

1. 
**importante**  
Antes de desconectarse de la instancia de RDS SQL Server, debe eliminarse de SQLAgentOperatorRole.

   Para eliminar el inicio de sesión de SQLAgentOperatorRole, ejecute la siguiente consulta antes de desconectarse o cerrar Management Studio:

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

Para obtener más información, consulte [Leveraging SQLAgentOperatorRole in RDS SQL Server](https://aws.amazon.com/blogs/database/leveraging-sqlagentoperatorrole-in-rds-sql-server/).

# Agregar un usuario al rol SQLAgentUser
<a name="SQLServerAgent.AddUser"></a>

Para que otro inicio de sesión o usuario pueda utilizar el agente de SQL Server, debe iniciar sesión como usuario maestro y hacer lo siguiente:

1. Cree otro inicio de sesión de nivel de servidor con el comando `CREATE LOGIN`.

1. Cree un usuario en `msdb` con el comando `CREATE USER` y, a continuación, vincule este usuario al inicio de sesión que creó en el paso anterior.

1. Agregue el usuario a `SQLAgentUserRole` con el procedimiento almacenado en el sistema `sp_addrolemember`.

Por ejemplo, suponga que su nombre de usuario principal es **admin** y que desea dar acceso al agente de SQL Server a un usuario llamado **theirname** con la contraseña **theirpassword**. En ese caso, puede usar el siguiente procedimiento.

**Para agregar un usuario al rol SQLAgentUser**

1. Inicie sesión como usuario maestro.

1. Ejecute los comandos siguientes:

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

# Eliminación de un trabajo del Agente de SQL Server
<a name="SQLServerAgent.DeleteJob"></a>

Utilice el procedimiento almacenado `sp_delete_job` para eliminar trabajos del Agente de SQL Server en Amazon RDS para Microsoft SQL Server.

No puede utilizar SSMS para eliminar trabajos del Agente de SQL Server. Si intenta hacerlo, obtendrá un mensaje de error similar al siguiente:

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

Como servicio administrado, RDS tiene la restricción de ejecutar procedimientos que obtienen acceso al registro de Windows. Cuando utiliza SSMS, este intenta ejecutar un proceso (`xp_regread`) para el que RDS no está autorizado.

**nota**  
En RDS para SQL Server, solo los miembros del rol de administrador del sistema pueden actualizar o eliminar trabajos que pertenezcan a un inicio de sesión diferente. Para obtener más información, consulte [Aprovechamiento de SQLAgentOperatorRole en el servidor de RDS para SQL](https://aws.amazon.com/blogs/database/leveraging-sqlagentoperatorrole-in-rds-sql-server/).

**Para eliminar un trabajo del Agente de SQL Server**
+ Ejecute la siguiente instrucción T-SQL:

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