Delen via


SSIS-pakket wordt niet uitgevoerd wanneer het wordt aangeroepen vanuit een stap in een SQL Server Agent-taak

Dit artikel helpt u bij het oplossen van het probleem dat optreedt wanneer u een SSIS-pakket aanroept vanuit een SQL Server Agent-taakstap.

Oorspronkelijke productversie: SQL Server
Oorspronkelijk KB-nummer: 918760

Symptomen

Wanneer u een Microsoft SQL Server Integration Services-pakket (SSIS) aanroept vanuit een SQL Server Agent-taakstap, wordt het SSIS-pakket niet uitgevoerd. Als u het SSIS-pakket echter niet wijzigt, wordt het uitgevoerd buiten SQL Server Agent.

Oplossing

U kunt dit probleem op een van de volgende manieren oplossen: De meest geschikte methode is afhankelijk van de omgeving en de reden dat het pakket is mislukt. Redenen waarom het pakket mogelijk is mislukt, zijn als volgt:

  • Het gebruikersaccount dat wordt gebruikt om het pakket uit te voeren onder SQL Server Agent verschilt van de oorspronkelijke auteur van het pakket.
  • Het gebruikersaccount beschikt niet over de vereiste machtigingen om verbindingen te maken of om toegang te krijgen tot resources buiten het SSIS-pakket.

Het pakket wordt mogelijk niet uitgevoerd in de volgende scenario's:

  • De huidige gebruiker kan geheimen niet ontsleutelen uit het pakket. Dit scenario kan optreden als het huidige account of het uitvoeringsaccount verschilt van de oorspronkelijke auteur van het pakket en de eigenschapsinstelling ProtectionLevel van het pakket de huidige gebruiker geheimen in het pakket niet laat ontsleutelen.
  • Een SQL Server-verbinding die gebruikmaakt van geïntegreerde beveiliging mislukt omdat de huidige gebruiker niet over de vereiste machtigingen beschikt.
  • Bestandstoegang mislukt omdat de huidige gebruiker niet over de vereiste machtigingen beschikt om naar de bestandsshare te schrijven waartoe het verbindingsbeheer toegang heeft. Dit scenario kan bijvoorbeeld optreden bij sms-logboekproviders die geen aanmelding en een wachtwoord gebruiken. Dit scenario kan ook optreden bij elke taak die afhankelijk is van het bestandsverbindingsbeheer, zoals een SSIS-bestandssysteemtaak.
  • Een configuratie van een SSIS-pakket op basis van een register maakt gebruik van de HKEY_CURRENT_USER registersleutels. De HKEY_CURRENT_USER registersleutels zijn gebruikersspecifiek.
  • Een taak of verbindingsbeheerder vereist dat het huidige gebruikersaccount over de juiste machtigingen beschikt.

Gebruik de volgende methoden om het probleem op te lossen:

  • Methode 1: Een SQL Server Agent-proxyaccount gebruiken. Maak een SQL Server Agent-proxyaccount. Dit proxyaccount moet een referentie gebruiken waarmee SQL Server Agent de taak kan uitvoeren als het account dat het pakket heeft gemaakt of als een account met de vereiste machtigingen.

    Deze methode werkt om geheimen te ontsleutelen en voldoet aan de belangrijkste vereisten van de gebruiker. Deze methode kan echter een beperkt succes hebben omdat de gebruikerssleutels van het SSIS-pakket de huidige gebruiker en de huidige computer omvatten. Als u het pakket daarom naar een andere computer verplaatst, kan deze methode nog steeds mislukken, zelfs als de taakstap het juiste proxyaccount gebruikt.

  • Methode 2: Stel de eigenschap SSIS-pakket ProtectionLevel in op ServerStorage. Wijzig de eigenschap SSIS Package ProtectionLevel in ServerStorage. Met deze instelling wordt het pakket opgeslagen in een SQL Server-database en is toegangsbeheer mogelijk via SQL Server-databaserollen.

  • Methode 3: Stel de eigenschap SSIS-pakket ProtectionLevel in op EncryptSensitiveWithPassword. Wijzig de eigenschap SSIS Package ProtectionLevel in EncryptSensitiveWithPassword. Deze instelling maakt gebruik van een wachtwoord voor versleuteling. Vervolgens kunt u de opdrachtregel voor de sql Server Agent-taakstap wijzigen om dit wachtwoord op te nemen.

  • Methode 4: SSIS-pakketconfiguratiebestanden gebruiken. Gebruik SSIS Package-configuratiebestanden om gevoelige informatie op te slaan en sla deze configuratiebestanden vervolgens op in een beveiligde map. Vervolgens kunt u de ProtectionLevel eigenschap wijzigen zodat DontSaveSensitive het pakket niet is versleuteld en geen geheimen probeert op te slaan in het pakket. Wanneer u het SSIS-pakket uitvoert, worden de vereiste gegevens uit het configuratiebestand geladen. Zorg ervoor dat de configuratiebestanden adequaat zijn beveiligd als ze gevoelige informatie bevatten.

  • Methode 5: Maak een pakketsjabloon. Voor een langetermijnoplossing maakt u een pakketsjabloon die gebruikmaakt van een beveiligingsniveau dat verschilt van de standaardinstelling. Dit probleem treedt niet op in toekomstige pakketten.

Stappen om dit probleem te reproduceren

  1. Meld u aan als een gebruiker die geen deel uitmaakt van de groep SQLServerSQLAgentUser. U kunt bijvoorbeeld een lokale gebruiker maken.
  2. Maak een SSIS-pakket en voeg vervolgens een ExecuteSQL-taak toe. Gebruik een OLE DB-verbindingsbeheer voor het lokale msdb-bestand met behulp van de volgende tekenreeks: 'Windows Authentication' -SQLSourceType: "Direct Input" -SQLStatement: "sp_who"
  3. Voer het pakket uit om ervoor te zorgen dat het wordt uitgevoerd.
  4. De eigenschap ProtectionLevel is ingesteld op EncryptSensitiveWithPassword.
  5. Maak een SQL Server Agent-taak en een taakstap. Klik in de lijst Uitvoeren als op SQL Server Agent Service om de taakstap uit te voeren. De tekst in de taakgeschiedenis van de SQL Server Agent geeft informatie weer die lijkt op het volgende:

Pakketgeheimen ontsleutelen

De standaardinstelling voor de SSIS-pakketeigenschap ProtectionLevel is EncryptSensitiveWithUserKey. Wanneer het pakket wordt opgeslagen, versleutelt SSIS alleen de onderdelen van het pakket die eigenschappen bevatten die zijn gemarkeerdsensitive, zoals wachtwoorden, gebruikersnamen en verbindingsreeks s. Wanneer het pakket opnieuw wordt geladen, moet de huidige gebruiker daarom voldoen aan de versleutelingsvereisten voor de sensitive eigenschappen die moeten worden ontsleuteld. De huidige gebruiker hoeft echter niet te voldoen aan de versleutelingsvereisten om het pakket te laden. Wanneer u het pakket uitvoert via een sql Server Agent-taakstap, is het standaardaccount het SQL Server Agent-serviceaccount. Dit standaardaccount is waarschijnlijk een andere gebruiker dan de auteur van het pakket. Daarom kan de sql Server Agent-taakstap worden geladen en gestart met het uitvoeren van de taakstap, maar het pakket mislukt omdat er geen verbinding kan worden voltooid. Het pakket kan bijvoorbeeld geen OLE DB-verbinding of EEN FTP-verbinding voltooien. Het pakket mislukt omdat het de referenties die het nodig heeft om verbinding te maken, niet kan ontsleutelen.

Belangrijk

Overweeg het ontwikkelingsproces en de omgeving om te bepalen welke accounts nodig zijn en op elke computer worden gebruikt. De instelling EncryptSensitiveWithUserKey van de ProtectionLevel eigenschap is een krachtige instelling. Deze instelling mag niet worden afgeprijsd omdat deze in eerste instantie implementatiecomplicaties veroorzaakt. U kunt de pakketten versleutelen wanneer u bent aangemeld bij het juiste account. U kunt ook het hulpprogramma Dtutil.exe SSIS-opdrachtprompt gebruiken om de beveiligingsniveaus te wijzigen met behulp van een .cmd-bestand en het opdrachtsubsysteem sql Server Agent. Voer bijvoorbeeld deze stappen uit. Omdat u het hulpprogramma Dtutil.exe in batchbestanden en -lussen kunt gebruiken, kunt u deze stappen voor verschillende pakketten tegelijk uitvoeren.

  1. Wijzig het pakket dat u wilt versleutelen met behulp van een wachtwoord.

  2. Gebruik het hulpprogramma Dtutil.exe via een SQL Server Agent-taakstap van het besturingssysteem (cmd Exec) om de ProtectionLevel eigenschap te wijzigen in EncryptSensitiveWithUserKey. Dit proces omvat het ontsleutelen van het pakket met behulp van het wachtwoord en het opnieuw versleutelen van het pakket. De gebruikerssleutel die wordt gebruikt voor het versleutelen van het pakket, is de instelling voor de sql Server Agent-taakstap in de lijst Uitvoeren als .

    Notitie

    Omdat de sleutel de gebruikersnaam en de computernaam bevat, kan het effect van het verplaatsen van de pakketten naar een andere computer beperkt zijn.

Zorg ervoor dat u gedetailleerde foutinformatie hebt over de fout in het SSIS-pakket

In plaats van te vertrouwen op de beperkte details in de taakgeschiedenis van de SQL Server-agent, kunt u SSIS-logboekregistratie gebruiken om ervoor te zorgen dat u foutinformatie hebt over de fout in het SSIS-pakket. U kunt het pakket ook uitvoeren met behulp van de opdracht exec subsystem in plaats van de SSIS-subsysteemopdracht.

Over SSIS-logboekregistratie

Met SSIS-logboekregistratie en logboekproviders kunt u details vastleggen over de uitvoering en fouten van het pakket. Standaard worden gegevens van het pakket niet vastgelegd. U moet het pakket configureren voor het vastleggen van gegevens. Wanneer u het pakket configureert voor het vastleggen van gegevens, wordt gedetailleerde informatie weergegeven die er ongeveer als volgt uitziet. In dit geval weet u dat het een machtigingsprobleem is:

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.

Informatie over de opdracht en uitvoer van het exec-subsysteem

Door de opdrachtbenadering van het exec-subsysteem te gebruiken, voegt u uitgebreide consolelogboekregistratie over naar de SSIS-opdrachtregel om het uitvoerbare bestand van de Dtexec.exe SSIS-opdrachtregel aan te roepen. Daarnaast gebruikt u de functie Geavanceerde taak van het uitvoerbestand. U kunt ook de uitvoer van de stap Opnemen gebruiken in de geschiedenisoptie om de logboekgegevens om te leiden naar een bestand of naar de taakgeschiedenis van de SQL Server-agent.

Hier volgt een voorbeeld van een opdrachtregel:

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

De consolelogboekregistratie retourneert details die er ongeveer als volgt uitzien:

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

Verwijzingen

Helaas zijn gebruikers niet op de hoogte dat de standaardinstellingen voor agenttaken deze status hebben. Zie de volgende onderwerpen in SQL Server 2005 Books Online voor meer informatie over SQL Server Agent-proxy's en SSIS:

  • Uitvoering van pakket plannen in SQL Server Agent
  • SQL Server Agent-proxy's maken