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 ~> NDS
noche a la mañana.
Los dos paquetes SSIS que me interesan manejan las partes transit db ~> staging
y 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 system
y 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í execute
permiso para este UpdateMaterialInventory
procedimiento. Esto evita tener que otorgar execute
permiso al usuario del dominio msdb.dbo.sp_start_job
, lo que sería excesivo.
El trabajo del Agente SQL NDS-ManualMaterialInventory
es 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
.
SSISProxy
es 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 SSISProxyCredentials
crearon 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?
fuente