Esecuzione del pacchetto SSIS dal processo dell'agente SQL di proprietà di un utente di dominio non amministratore di sistema


16

Ho due pacchetti SSIS che vengono programmati durante la notte (tramite SQL Server Agent) come parte di una distribuzione SSIS più ampia, senza problemi. Tutto utilizza l'autenticazione di Windows e il processo pianificato è di proprietà di un amministratore di sistema (beh, io) ed eseguito come account del servizio agente di SQL Server.

Quindi, i dati essenzialmente vanno source system ~> transit db ~> staging ~> NDSdall'oggi al domani.

I due pacchetti SSIS a cui tengo, gestiscono rispettivamente le parti transit db ~> staginge staging ~> NDS, per un insieme specifico di dati.

Un utente di dominio (non amministratore di sistema) fa qualcosa nel source systeme che inserisce i dati interessanti nel transit db, quindi ho bisogno di un modo per recuperare questi dati aggiornati durante l'orario di lavoro per aggiornare il NDS: è stato deciso che il modo più semplice per questa persona di innescare tale ETL, facendo clic su un pulsante in una cartella di lavoro Excel abilitata per le macro, si collega a SQL Server tramite ODBC (utilizzando l'autenticazione di Windows) ed esegue una procedura memorizzata.

La procedura memorizzata è simile alla seguente:

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

La procedura memorizzata "sorella" in [msdb] è simile alla seguente:

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

Questo utente [SqlAgentProxy] è un utente Windows che ho creato in [msdb] al di fuori dell'accesso dell'utente del dominio, al quale ho concesso l' executeautorizzazione a questa UpdateMaterialInventoryprocedura. Questo evita di dover concedere l' executeautorizzazione all'utente del dominio msdb.dbo.sp_start_job, il che sarebbe eccessivo.

Il processo di SQL Agent NDS-ManualMaterialInventoryè di proprietà dell'utente del dominio e prevede 2 passaggi, ciascuno di tipo [Pacchetto SQL Server Integration Services], impostato su Esegui come SSISProxy .

SSISProxyè un proxy di SQL Server Agent mappato al sottosistema [SQL Server Integration Services Package], utilizzando il nome della credenziale SSISProxyCredentials. L'accesso dell'utente del dominio è stato aggiunto ai principali dell'account proxy .

Sono SSISProxyCredentialsstati creati con l' identità dello stesso utente di dominio che esegue l'intero SSL ETL durante la notte e la sua password è stata verificata quadrupla.

Ora, se eseguo questo:

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

Ottengo questo risultato:

Job 'NDS-ManualMaterialInventory' started successfully.

Tuttavia, la storia del lavoro racconta una storia molto meno incoraggiante:

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

E i dettagli del passaggio 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.

Il lavoro ha esito negativo e nulla viene registrato da nessuna parte.

Se cambio il proprietario del lavoro per essere me stesso e cambio i passaggi ' run come essere l'account del servizio agente di SQL Server, il lavoro viene eseguito, ha esito positivo e registra 1.067 righe in [Metadata]. [Dbo]. [Sysssislog].

Sembra che ci sia qualcosa di sbagliato nel modo in cui sono impostati il ​​proxy / le credenziali. Quale parte sto sbagliando?

Risposte:


18

Il problema sembra più complesso di quello che è. Dato che stai usando SQL 2014, probabilmente sarai morso dalle nuove funzionalità di sicurezza introdotte nel 2012.

L'unica cosa che conta davvero è:

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}'.

Molto probabilmente il login dell'utente Proxy non ha accesso al catalogo SSISDB (anche se potrebbe avere accesso a SQL Server).
È necessario mappare l'accesso a un utente SSISDB e configurare l'accesso alle cartelle / ai progetti SSISDB in Integration Services.

Dai un'occhiata a questo post sul blog MSDN Suggerimenti per il controllo dell'accesso al catalogo SSIS e Autorizzazioni per il catalogo SSIS di SQL 2012

Dopo aver effettivamente caricato il pacchetto, è possibile che si verifichino altri problemi relativi al contesto di sicurezza, ma è necessario ottenere una migliore registrazione dai servizi di integrazione stessi.


3
Esattamente questo. Grazie per essere andato ben oltre :-)
Mathieu Guindon,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.