Ejecutar el paquete SSIS desde el trabajo del Agente SQL propiedad de un usuario de dominio que no sea sysadmin

16

Tengo dos paquetes SSIS que se ejecutan programados durante la noche (a través del Agente SQL Server) como parte de una implementación SSIS más grande, sin ningún problema. Todo está utilizando la autenticación de Windows, y el trabajo programado es propiedad de un administrador del sistema (bueno, yo) y se ejecuta como la cuenta de servicio del Agente SQL Server.

Entonces, los datos esencialmente van de la source system ~> transit db ~> staging ~> NDSnoche a la mañana.

Los dos paquetes SSIS que me interesan manejan las partes transit db ~> stagingy staging ~> NDS, respectivamente, para un conjunto específico de datos.

Un usuario de dominio (que no sea administrador de sistemas) hace algo en el source systemy eso empuja los datos interesantes al interior transit db, por lo que necesito una forma de obtener estos datos actualizados durante las horas de trabajo para actualizar el NDS: se decidió que la forma más simple para que esta persona se active ese ETL, fue haciendo clic en un botón en un libro de Excel habilitado para macros, que se conecta a SQL Server a través de ODBC (usando la autenticación de Windows) y ejecuta un procedimiento almacenado.

El procedimiento almacenado se ve así:

create procedure dbo.UpdateMaterialInventory
as
begin
    execute msdb.dbo.UpdateMaterialInventory;
end

El procedimiento almacenado "hermana" en [msdb] se ve así:

create procedure dbo.UpdateMaterialInventory
with execute as 'SqlAgentProxy'
as
begin
    execute msdb.dbo.sp_start_job N'NDS-ManualMaterialInventory';
end

Este usuario [SqlAgentProxy] es un usuario de Windows que creé en [msdb] fuera del inicio de sesión del usuario de dominio, al que le concedí executepermiso para este UpdateMaterialInventoryprocedimiento. Esto evita tener que otorgar executepermiso al usuario del dominio msdb.dbo.sp_start_job, lo que sería excesivo.

El trabajo del Agente SQL NDS-ManualMaterialInventoryes propiedad del usuario del dominio y tiene 2 pasos, cada uno de tipo [Paquete de servicios de integración de SQL Server], configurado para Ejecutar como SSISProxy .

SSISProxyes un proxy del Agente SQL Server que está asignado al subsistema [Paquete de servicios de integración de SQL Server], utilizando el nombre de la credencial SSISProxyCredentials. El inicio de sesión del usuario del dominio se agregó a los principales de la cuenta Proxy .

Se SSISProxyCredentialscrearon con la identidad del mismo usuario de dominio que ejecuta todo el SSIS ETL durante la noche, y su contraseña se verificó por cuádruple.

Ahora, si ejecuto esto:

execute as login=N'DOMAIN\thatperson'
exec NDS.dbo.UpdateMaterialInventory;
go

Me sale esta salida:

Job 'NDS-ManualMaterialInventory' started successfully.

Sin embargo, el historial laboral cuenta una historia mucho menos alentadora:

The job failed.  The Job was invoked by User DOMAIN\thatperson.
The last step to run was step 1 (Extract).

Y detalles del paso 1:

Executed as user: {domain user that runs SSIS ETL overnight}.
Microsoft (R) SQL Server Execute Package Utility  Version 12.0.4100.1 for 64-bit
Copyright (C) Microsoft Corporation. All rights reserved.
Started:  2:18:50 PM  Failed to execute IS server package because of error 0x80131904.
Server: {server name}, Package path: \SSISDB\Foo\Bar\foobar.dtsx, Environment reference Id: NULL.
Description: Login failed for user '{domain user that runs SSIS ETL overnight}'.
Source: .Net SqlClient Data Provider 
Started:  2:18:50 PM  Finished: 2:18:51 PM  Elapsed:  0.094 seconds.
The package execution failed.
The step failed.

El trabajo falla y no se registra nada en ninguna parte.

Si cambio el propietario del trabajo para que sea yo mismo, y cambio los pasos que se ejecutan para que sean la cuenta de servicio del Agente SQL Server, el trabajo se ejecuta, se realiza correctamente y registra 1.067 filas en [Metadata]. [Dbo]. [Sysssislog].

Parece que hay algo que no está bien acerca de cómo se configuran el proxy / credenciales. ¿Qué parte estoy haciendo mal?

Mathieu Guindon
fuente

Respuestas:

18

El problema parece más complejo de lo que es. Como está utilizando SQL 2014, probablemente le estén mordiendo las nuevas características de seguridad introducidas en 2012.

Lo único que realmente importa es:

Server: {server name}, Package path: \SSISDB\Foo\Bar\foobar.dtsx, Environment reference Id: NULL.   
Description: Login failed for user '{domain user that runs SSIS ETL overnight}'.

Lo más probable es que el inicio de sesión de su usuario proxy no tenga acceso al catálogo SSISDB (a pesar de que podría tener acceso a SQL Server).
Debe asignar el inicio de sesión a un usuario SSISDB y configurar el acceso a las carpetas / proyectos SSISDB en Integration Services.

Eche un vistazo a esta publicación de blog de MSDN Consejos de control de acceso al catálogo SSIS y permisos del catálogo SSIS SQL 2012

Una vez que el paquete se está cargando, puede encontrarse con otros problemas de contexto de seguridad, pero debería obtener un mejor registro de los servicios de integración.

Tom V - Equipo Mónica
fuente
3
Exactamente esto. Gracias por ir más allá :-)
Mathieu Guindon