Condividi tramite


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

Questo articolo illustra come risolvere il problema che si verifica quando si chiama un pacchetto SSIS da un passaggio di processo di 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 di 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 è diverso dall'autore del pacchetto originale.
  • L'account utente non dispone delle autorizzazioni necessarie per stabilire connessioni o per accedere a 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 ai segreti di decrittografia dell'utente corrente nel pacchetto.
  • Una connessione SQL Server che usa la sicurezza integrata ha esito negativo 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 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 chiavi del HKEY_CURRENT_USER 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 di SQL Server Agent. Creare un account proxy di SQL Server Agent. Questo account proxy deve usare credenziali che consentono a SQL Server Agent di eseguire il processo come account che ha creato il pacchetto o come account con le autorizzazioni necessarie.

    Questo metodo funziona per decrittografare i segreti e soddisfare i requisiti chiave da parte 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à Protezione pacchetto SSISLevel in ServerStorage. Questa impostazione archivia il pacchetto in un database di SQL Server e consente il controllo di accesso tramite i ruoli del database di SQL Server.

  • 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 di 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 proprietà ProtectionLevel è impostata su EncryptSensitiveWithPassword.
  5. Creare un processo di SQL Server Agent e un passaggio di processo. Nell'elenco RunAs fare clic su Servizio SQL Server Agent per eseguire il passaggio del processo. Il testo nella cronologia processi di SQL Server Agent visualizza informazioni simili alle seguenti:

Decrittografare i segreti dei pacchetti

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 sensitivecome , ad esempio password, nomi utente e stringa 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 di SQL Server Agent, l'account predefinito è l'account del servizio SQL Server Agent. Questo account predefinito è probabilmente un utente diverso dall'autore del pacchetto. Di conseguenza, il passaggio del processo di SQL Server Agent può caricare e avviare l'esecuzione del passaggio del processo, ma il pacchetto non riesce perché non è in grado di completare una connessione. Ad esempio, il pacchetto non può completare una connessione OLE DB o una connessione FTP. Il pacchetto non riesce perché non è in grado di decrittografare le credenziali necessarie per la connessione.

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 efficace. Questa impostazione non deve essere scontata perché causa complicazioni di distribuzione in un primo momento. È possibile crittografare i pacchetti quando si è connessi all'account appropriato. È anche possibile usare l'utilità del prompt dei comandi SSIS Dtutil.exe per modificare i livelli di protezione usando un file .cmd e il sottosistema dei comandi di SQL Server Agent. Ad esempio, seguire questa procedura. Poiché è possibile usare l'utilità Dtutil.exe nei file e nei cicli batch, è possibile seguire questi passaggi per diversi pacchetti contemporaneamente.

  1. Modificare il pacchetto da crittografare usando una password.

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

    Note

    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

Invece di basarsi sui dettagli limitati nella cronologia processi di 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 sottosistema exec anziché il comando sottosistema SSIS.

Informazioni sulla registrazione SSIS

I provider di log e di registrazione SSIS consentono di acquisire informazioni dettagliate sull'esecuzione e sugli errori del pacchetto. 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 sa 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 e sull'output del sottosistema exec

Usando l'approccio ai comandi del sottosistema exec, si aggiungono opzioni di registrazione della console dettagliate alla riga di comando SSIS per chiamare il file eseguibile della riga di comando SSIS Dtexec.exe. Inoltre, si usa 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 di 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 consapevoli che le impostazioni predefinite del passaggio del processo dell'agente li inseriscono in questo stato. Per altre informazioni sui proxy di SQL Server Agent e SSIS, vedere gli argomenti seguenti nella documentazione online di SQL Server 2005:

  • Pianificazione dell'esecuzione dei pacchetti in SQL Server Agent
  • Creazione di proxy di SQL Server Agent