El paquete de SSIS no se ejecuta cuando recibe una llamada de un paso de trabajo del Agente SQL Server

Se aplica: SQL Server 2008 DeveloperSQL Server 2008 EnterpriseSQL Server 2008 Standard

Síntomas


Cuando llama a un paquete de Microsoft SQL Server 2005 Integration Services (SSIS) desde un paso de trabajo del Agente SQL Server, el paquete de SSIS no se ejecuta. Sin embargo, si no modifica el paquete de SSIS, se ejecutará correctamente fuera del Agente SQL Server.

Solución


Para resolver este problema, utilice uno de los métodos siguientes. El método más apropiado depende del entorno y del motivo de que el paquete fallara. Los motivos por los que puede fallar el paquete son los siguientes: 
  • La cuenta de usuario que se utilizó para ejecutar el paquete en el Agente SQL Server difiere del autor del paquete original.
  • La cuenta de usuario no tiene los permisos necesarios para realizar las conexiones o para acceder a recursos que se encuentran fuera del paquete de SSIS.
El paquete puede no ejecutarse en los escenarios siguientes:
  • El usuario actual no puede descifrar secretos del paquete. Este escenario se puede producir si la cuenta actual o la cuenta de ejecución difieren del autor del paquete original y la configuración de la propiedad ProtectionLevel del paquete no permite que el usuario actual descifre secretos del paquete.
  • Una conexión de SQL Server que usa seguridad integrada falla porque el usuario actual no tiene los permisos necesarios.
  • El acceso al fichero falla porque el usuario actual no tiene los permisos necesarios para escribir en el recurso compartido de archivos al que accede el administrador de conexión. Por ejemplo, este escenario se puede producir con proveedores de registros de texto que no usan nombre y contraseña de inicio de sesión. Este escenario también se puede producir con cualquier tarea que dependa del administrador de conexión de archivos, como una tarea de sistema de archivos de SSIS.
  • Una configuración de paquete de SSIS basada en el Registro usa las claves del Registro de HKEY_CURRENT_USER. Las claves del Registro HKEY_CURRENT_USER son específicas del usuario.
  • Una tarea o un administrador de conexión requieren que la cuenta de usuario actual disponga de los permisos correctos.
Método 1: Usar la cuenta de proxy del Agente SQL Server
Cree una cuenta de proxy del Agente SQL Server. Esta cuenta de proxy debe usar una credencial que permita al Agente SQL Server ejecutar el trabajo como la cuenta que creó el paquete o como una cuenta que dispone de los permisos necesarios.

Este método sirve para descifrar secretos y cumple con los requisitos de claves por el usuario. Sin embargo, este método puede funcionar de forma limitada porque las claves de usuario del paquete de SSIS afectan al usuario actual y al equipo actual. Por lo tanto, si mueve el paquete a otro equipo, este método aún puede fallar, aunque el paso de trabajo use la cuenta de proxy correcta.


Método 2: Establecer la propiedad ProtectionLevel del paquete de SSIS en ServerStorage
Cambie la propiedad ProtectionLevel del paquete de SSIS a ServerStorage. Esta configuración almacena el paquete en una base de datos de SQL Server y permite el control de acceso a través de roles de la base de datos de SQL Server.

Método 3: Establecer la propiedad ProtectionLevel del paquete de SSIS en EncryptSensitiveWithPassword
Cambie la propiedad ProtectionLevel del paquete de SSIS a EncryptSensitiveWithPassword. Esta configuración usa una contraseña para el cifrado. Después puede modificar la línea de comandos del paso de trabajo del Agente SQL Server para incluir esta contraseña.


Método 4: Usar los archivos de configuración del paquete de SSIS
Utilice los archivos de configuración del paquete de SSIS para almacenar información confidencial y guarde estos archivos de configuración en una carpeta segura. Después puede cambiar la propiedad ProtectionLevel a DontSaveSensitive para que no se cifre el paquete y no intente guardar secretos en el paquete. Cuando ejecuta el paquete de SSIS, la información necesaria se carga del archivo de configuración. Asegúrese de que los archivos de configuración están protegidos correctamente si contienen información confidencial.


Método 5: Crear una plantilla de paquete
Para una solución a largo plazo, cree una plantilla de paquete que use un nivel de protección que difiera de la configuración predeterminada. Este problema no se producirá en paquetes futuros.

Estado


Este comportamiento es una característica del diseño de la aplicación.

Información avanzada


Pasos para reproducir el problema

  1. Inicie sesión como un usuario que no sea miembro del grupo SQLServer2005SQLAgentUse. Por ejemplo, puede crear un usuario local.
  2. Cree un paquete de SSIS y agregue la tarea ExecuteSQL. Use un administrador de conexión OLE DB con el archivo msdb local usando la cadena siguiente: ‘Windows Authentication’ -SQLSourceType: "Direct Input" -SQLStatement: "sp_who"
  3. Ejecute el paquete para comprobar que funciona correctamente.
  4. Tenga en cuenta que la propiedad ProtectionLevel se establece en EncryptSensitiveWithPassword.
  5. Cree un trabajo del Agente SQL Server y un paso de trabajo. En la lista Ejecutar como, haga clic en Servicio de Agente SQL Server para ejecutar el paso de trabajo.
El texto en el historial de trabajos del Agente SQL Server muestra una información similar a la siguiente:

Descifrar secretos del paquete

La configuración predeterminada de la propiedad ProtectionLevel del paquete de SSIS es EncryptSensitiveWithUserKey. Cuando se guarda el paquete, SSIS solo cifra las partes del paquete que contienen propiedades marcadas como "confidenciales", como contraseñas, nombres de usuario y cadenas de conexión. Por lo tanto, cuando se vuelve a cargar el paquete, el usuario actual debe cumplir con los requisitos de cifrado para las propiedades confidenciales por descifrar. Si embargo, el usuario actual no debe cumplir con los requisitos de cifrado para cargar el paquete. Cuando ejecuta el paquete mediante un paso de trabajo del Agente SQL Server, la cuenta predeterminada es la cuenta de servicio del Agente SQL Server. Es muy probable que esta cuenta predeterminada sea un usuario diferente del autor del paquete. Por lo tanto, el paso de trabajo del Agente SQL Server puede cargar y ejecutar el paso de trabajo, pero el paquete falla porque no se puede completar la conexión. Por ejemplo, el paquete no puede completar una conexión OLE DB o una conexión FTP. El paquete falla porque no puede descifrar las credenciales que necesita para conectarse.


Importante: Tenga en cuenta el proceso de desarrollo y el entorno para determinar qué cuentas son necesarias y deben utilizarse en cada equipo. La configuración EncryptSensitiveWithUserKey de la propiedad ProtectionLevel es un parámetro muy eficaz. Esta configuración no debe descartarse porque es complicada de implementar inicialmente. Puede cifrar los paquetes cuando ha iniciado sesión en la cuenta apropiada. También puede usar la utilidad de símbolo del sistema de SSIS Dtutil.exe para cambiar los niveles de protección usando un archivo .cmd y el subsistema de comandos del Agente SQL Server. Por ejemplo, siga estos pasos: Como puede usar la utilidad Dtutil.exe en archivos por lotes y bucles, puede realizar los pasos siguientes para varios paquetes al mismo tiempo.
  1. Modifique el paquete que desea cifrar con una contraseña.
  2. Use la utilidad Dtutil.exe mediante un paso de trabajo del Agente SQL Server Sistema operativo (cmd Exec) para cambiar la propiedad ProtectionLevel a EncryptSensitiveWithUserKey. Este proceso implica descifrar el paquete con la contraseña y, después, volver a cifrar el paquete. La clave de usuario que se usa para cifrar el paquete es la configuración del paso de trabajo del Agente SQL Server en la lista Ejecutar como.

    Nota: Dado que la clave incluye el nombre de usuario y el nombre del equipo, el efecto de mover los paquetes a otro equipo puede ser limitado.

Comprobar que dispone de información detallada sobre el error del paquete de SSIS

En lugar de depender en la información detallada del historial de trabajos del Agente SQL Server, puede usar el registro de SSIS para comprobar de que dispone de la información sobre el error del paquete de SSIS. También puede ejecutar el paquete usando el comando de subsistema exec, en lugar del comando de subsistema SSIS.

Acerca del registro de SSIS

El registro de SSIS y los proveedores de registro le permiten capturar detalles sobre la ejecución del paquete y los errores. De manera predeterminada, el paquete no registra información. Debe configurar el paquete para que registre información. Cuando configure el paquete para registrar información, la información detallada que se muestra es similar a la siguiente: En este caso, sabrá que se trata de un problema de permisos:

OnError,DOMAINNAME,DOMAINNAME\USERNAME,FTP Task,{C73DE41C-D0A6-450A-BB94-DF6D913797A1},{2F0AF5AF-2FFD-4928-88EE-1B58EB431D74},4/28/2006 1:51:59 PM,4/28/2006 1:51:59 PM,-1073573489,0x,No se puede conectar al servidor FTP con "FTP Connection Manager".

OnError,DOMAINNAME,DOMAINNAME\USERNAME,Execute SQL Task,{C6C7286D-57D4-4490-B12D-AC9867AE5762},{F5761A49-F2F9-4575-9E2B-B3D381D6E1F3},4/28/2006 4:07:00 PM,4/28/2006 4:07:00 PM,-1073573396,0x,No se pudo adquirir la conexión "user01.msdb". Puede ser que la conexión no esté configurada correctamente o que no tenga los permisos adecuados en esta conexión.

Acerca del comando de subsistema exec y la información obtenida

Cuando usa el comando de subsistema exec, agrega conmutadores de registro de la consola en modo detallado a la línea de comandos de SSIS para llamar al archivo ejecutable Dtexec.exe de la línea de comandos de SSIS. Además, usa la característica de trabajo avanzada del archivo de salida. También puede usar la opción Incluir salida de paso en el historial para redirigir la información de registro a un archivo o al historial de trabajos del Agente SQL Server.

A continuación se muestra un ejemplo de una línea de comandos:
 
dtexec.exe /FILE "C:\_work\SSISPackages\ProtectionLevelTest\ProtectionLevelTest\AgentTesting.dtsx" /MAXCONCURRENT " -1 " /CHECKPOINTING OFF  /REPORTING V  /CONSOLELOG NCOSGXMT 


El registro /console devuelve información similar a la siguiente:
 
Error: 2006-04-27 18:13:34.76   Code: 0xC0202009   Source: AgentTesting Connection manager "(local).msdb"   Description: An OLE DB error has occurred. Error code: 0x80040E4D.An OLE DB record is available.  Source: "Microsoft SQL Native Client"  Hresult: 0x80040E4D  Description: "Login failed for user 'DOMAINNAME\username'.".End Error 
 
Error: 2006-04-28 13:51:59.19   Code: 0xC0016016   Source:     Description: Failed to decrypt protected XML node "DTS:Property" with error 0x80070002 "The system cannot find the file specified.". You may not be authorized to access this information. This error occurs when there is a cryptographic error. Verify that the correct key is available.End Error 
 
Log:     Name: OnError     Computer: COMPUTERNAME     Operator: DOMAINNAME\username     Source Name: Execute SQL Task     Source GUID: {C6C7286D-57D4-4490-B12D-AC9867AE5762}     Execution GUID: {7AFE3D9E-5F73-42F0-86FE-5EFE264119C8}     Message: Failed to acquire connection "(local).msdb". Connection may not be configured correctly or you may not have the right permissions on this connection.     Start Time: 2006-04-27 18:13:34     End Time: 2006-04-27 18:13:34End Log 

Referencias


Para obtener más información acerca de otros problemas similares, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:

904800 Recibe un mensaje de error "Error al cargar" cuando intenta ejecutar un paquete de SQL Server 2005 Integration Services en SQL Server 2005

Para obtener más información acerca de cómo emplear la utilidad Dtutil.exe en operaciones por lotes, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:

906562 Cómo usar la utilidad dtutil (Dtutil.exe) para establecer el nivel de protección de un lote de paquetes de SQL Server Integration Services (SSIS) en SQL Server 2005

Para obtener más información acerca de cómo crear plantillas de paquetes, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:

908018 Cómo crear una plantilla de paquetes en SQL Server Business Intelligence Development Studio



Para obtener más información acerca de seguridad de paquetes de SSIS y la propiedad ProtectionLevel, consulte el tema "Consideraciones de seguridad para Integration Services" en los Libros en pantalla de SQL Server 2005.

Lamentablemente, los usuarios desconocen que la configuración predeterminada del paso de trabajo del agente les pone en este estado. Para obtener información adicional sobre proxies del Agente SQL Server y SSIS, consulte los temas siguientes en los Libros en pantalla de SQL Server 2005:
  • Programar la ejecución de paquetes en el Agente SQL Server
  • Crear proxies de Agente SQL Server