Il pacchetto SSIS non viene eseguito quando viene chiamato da un passaggio di processo SQL Server Agent

Questo articolo consente di risolvere il problema che si verifica quando si chiama un pacchetto SSIS da un passaggio di processo SQL Server Agent.

Versione originale del prodotto: SQL Server
Numero KB originale: 918760

Sintomi

Quando si chiama un pacchetto di Microsoft SQL Server Integration Services (SSIS) da un passaggio di processo SQL Server Agent, il pacchetto SSIS non viene eseguito. Tuttavia, se non si modifica il pacchetto SSIS, verrà eseguito correttamente all'esterno di SQL Server Agent.

Risoluzione

Per risolvere il problema, utilizzare uno dei metodi riportati di seguito: Il metodo più appropriato dipende dall'ambiente e dal motivo per cui il pacchetto non è riuscito. I motivi per cui il pacchetto potrebbe non essere riuscito sono i seguenti:

  • L'account utente usato per eseguire il pacchetto in SQL Server Agent differisce dall'autore del pacchetto originale.
  • L'account utente non dispone delle autorizzazioni necessarie per stabilire connessioni o per accedere alle risorse esterne al pacchetto SSIS.

Il pacchetto potrebbe non essere eseguito negli scenari seguenti:

  • L'utente corrente non può decrittografare i segreti dal pacchetto. Questo scenario può verificarsi se l'account corrente o l'account di esecuzione è diverso dall'autore del pacchetto originale e l'impostazione della proprietà ProtectionLevel del pacchetto non consente all'utente corrente di decrittografare i segreti nel pacchetto.
  • Una connessione SQL Server che usa la sicurezza integrata non riesce perché l'utente corrente non dispone delle autorizzazioni necessarie.
  • L'accesso ai file non riesce perché l'utente corrente non dispone delle autorizzazioni necessarie per scrivere nella condivisione file a cui accede la gestione connessione. Ad esempio, questo scenario può verificarsi con i provider di log di testo che non usano un account di accesso e una password. Questo scenario può verificarsi anche con qualsiasi attività che dipende dalla gestione connessione file, ad esempio un'attività del file system SSIS.
  • Una configurazione del pacchetto SSIS basata sul Registro di sistema usa le chiavi del HKEY_CURRENT_USER Registro di sistema. Le HKEY_CURRENT_USER chiavi del Registro di sistema sono specifiche dell'utente.
  • Un'attività o una gestione connessione richiede che l'account utente corrente disponga delle autorizzazioni corrette.

Per risolvere il problema, usare i metodi seguenti:

  • Metodo 1: usare un account proxy SQL Server Agent. Creare un account proxy SQL Server Agent. Questo account proxy deve usare una credenziale che consenta SQL Server Agent eseguire il processo come account che ha creato il pacchetto o come account con le autorizzazioni necessarie.

    Questo metodo consente di decrittografare i segreti e soddisfa i requisiti chiave dell'utente. Tuttavia, questo metodo può avere esito positivo limitato perché le chiavi utente del pacchetto SSIS coinvolgono l'utente corrente e il computer corrente. Pertanto, se si sposta il pacchetto in un altro computer, questo metodo potrebbe comunque non riuscire, anche se il passaggio del processo usa l'account proxy corretto.

  • Metodo 2: impostare la proprietà Pacchetto ProtectionLevel SSIS su ServerStorage. Modificare la proprietà SSIS Package ProtectionLevel in ServerStorage. Questa impostazione archivia il pacchetto in un database SQL Server e consente il controllo di accesso tramite SQL Server ruoli del database.

  • Metodo 3: impostare la proprietà Pacchetto ProtectionLevel SSIS su EncryptSensitiveWithPassword. Modificare la proprietà Pacchetto ProtectionLevel SSIS in EncryptSensitiveWithPassword. Questa impostazione usa una password per la crittografia. È quindi possibile modificare la riga di comando del passaggio del processo SQL Server Agent per includere questa password.

  • Metodo 4: usare i file di configurazione del pacchetto SSIS. Usare i file di configurazione del pacchetto SSIS per archiviare le informazioni riservate e quindi archiviare questi file di configurazione in una cartella protetta. È quindi possibile modificare la ProtectionLevel proprietà in DontSaveSensitive in modo che il pacchetto non sia crittografato e non tenti di salvare i segreti nel pacchetto. Quando si esegue il pacchetto SSIS, le informazioni necessarie vengono caricate dal file di configurazione. Assicurarsi che i file di configurazione siano adeguatamente protetti se contengono informazioni riservate.

  • Metodo 5: Creare un modello di pacchetto. Per una risoluzione a lungo termine, creare un modello di pacchetto che usa un livello di protezione diverso dall'impostazione predefinita. Questo problema non si verificherà nei pacchetti futuri.

Procedura per riprodurre il problema

  1. Accedere come utente che non fa parte del gruppo SQLServerSQLAgentUser. Ad esempio, è possibile creare un utente locale.
  2. Creare un pacchetto SSIS e quindi aggiungere un'attività ExecuteSQL. Usare una gestione connessione OLE DB al file msdb locale usando la stringa seguente: 'Windows Authentication' -SQLSourceType: "Direct Input" -SQLStatement: "sp_who".
  3. Eseguire il pacchetto per assicurarsi che venga eseguito correttamente.
  4. La ProtectionLevel proprietà è impostata EncryptSensitiveWithPasswordsu .
  5. Creare un processo SQL Server Agent e un passaggio di processo. Nell'elenco RunAs fare clic su SQL Server Agent Service (Servizio SQL Server Agent) per eseguire il passaggio del processo. Il testo nella cronologia processi SQL Server Agent visualizza informazioni simili alle seguenti:

Decrittografare i segreti del pacchetto

L'impostazione predefinita per la proprietà del pacchetto ProtectionLevel SSIS è EncryptSensitiveWithUserKey. Quando il pacchetto viene salvato, SSIS crittografa solo le parti del pacchetto che contengono proprietà contrassegnate, sensitivead esempio password, nomi utente e stringhe di connessione. Pertanto, quando il pacchetto viene ricaricato, l'utente corrente deve soddisfare i requisiti di crittografia per le sensitive proprietà da decrittografare. Tuttavia, l'utente corrente non deve soddisfare i requisiti di crittografia per caricare il pacchetto. Quando si esegue il pacchetto tramite un passaggio di processo SQL Server Agent, l'account predefinito è l'account del servizio SQL Server Agent. Questo account predefinito è molto probabilmente un utente diverso dall'autore del pacchetto. Pertanto, il passaggio del processo SQL Server Agent può caricare e iniziare a eseguire il passaggio del processo, ma il pacchetto ha esito negativo perché non può completare una connessione. Ad esempio, il pacchetto non può completare una connessione OLE DB o FTP. Il pacchetto ha esito negativo perché non può decrittografare le credenziali che deve avere per connettersi.

Importante

Prendere in considerazione il processo di sviluppo e l'ambiente per determinare quali account sono necessari e usati in ogni computer. L'impostazione EncryptSensitiveWithUserKey della ProtectionLevel proprietà è un'impostazione potente. Questa impostazione non deve essere scontata perché all'inizio causa complicazioni di distribuzione. È possibile crittografare i pacchetti quando si è connessi all'account appropriato. È anche possibile usare l'utilità del prompt dei comandi Dtutil.exe SSIS per modificare i livelli di protezione usando un file di .cmd e il sottosistema di comandi SQL Server Agent. Seguire, ad esempio, questa procedura. Poiché è possibile usare l'utilità Dtutil.exe nei file batch e nei cicli, è possibile seguire questa procedura per diversi pacchetti contemporaneamente.

  1. Modificare il pacchetto da crittografare usando una password.

  2. Usare l'utilità Dtutil.exe tramite un passaggio del processo di SQL Server Agent del sistema operativo (cmd Exec) per modificare la ProtectionLevel proprietà in EncryptSensitiveWithUserKey. Questo processo prevede la decrittografia del pacchetto usando la password e quindi la crittografia del pacchetto. La chiave utente usata per crittografare il pacchetto è l'impostazione SQL Server Agent passaggio del processo nell'elenco RunAs.

    Nota

    Poiché la chiave include il nome utente e il nome del computer, l'effetto dello spostamento dei pacchetti in un altro computer potrebbe essere limitato.

Assicurarsi di avere informazioni dettagliate sull'errore del pacchetto SSIS

Anziché basarsi sui dettagli limitati nella cronologia processi SQL Server Agent, è possibile usare la registrazione SSIS per assicurarsi di avere informazioni sull'errore del pacchetto SSIS. È anche possibile eseguire il pacchetto usando il comando del sottosistema exec anziché il comando del sottosistema SSIS.

Informazioni sulla registrazione SSIS

I provider di log e registrazione SSIS consentono di acquisire i dettagli sull'esecuzione del pacchetto e sugli errori. Per impostazione predefinita, il pacchetto non registra le informazioni. È necessario configurare il pacchetto per registrare le informazioni. Quando si configura il pacchetto per registrare le informazioni, vengono visualizzate informazioni dettagliate simili alle seguenti. In questo caso, si saprà che si tratta di un problema di autorizzazioni:

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,Unable to connect to FTP server using "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,Failed to acquire connection "user01.msdb". Connection may not be configured correctly or you may not have the right permissions on this connection.

Informazioni sul comando del sottosistema exec e sulle informazioni di output

Usando l'approccio del comando del sottosistema exec, si aggiungono opzioni dettagliate di registrazione della console alla riga di comando SSIS per chiamare il file eseguibile della riga di comando SSIS Dtexec.exe. Si usa anche la funzionalità Processo avanzato del file di output. È anche possibile usare l'opzione Includi output passaggio nella cronologia per reindirizzare le informazioni di registrazione a un file o alla cronologia processi SQL Server Agent.

Di seguito è riportato un esempio di riga di comando:

 dtexec.exe /FILE "C:\_work\SSISPackages\ProtectionLevelTest\ProtectionLevelTest\AgentTesting.dtsx" /MAXCONCURRENT " -1 " /CHECKPOINTING OFF /REPORTING V /CONSOLELOG NCOSGXMT

La registrazione della console restituisce dettagli simili ai seguenti:

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:34 End Log

Riferimenti

Sfortunatamente, gli utenti non sono a conoscenza del fatto che le impostazioni predefinite del passaggio del processo dell'agente le inseriscono in questo stato. Per altre informazioni sui proxy SQL Server Agent e SSIS, vedere gli argomenti seguenti nella documentazione online di SQL Server 2005:

  • Pianificazione dell'esecuzione del pacchetto in SQL Server Agent
  • Creazione di proxy di SQL Server Agent