SSIS-pakket wordt niet uitgevoerd wanneer het wordt aangeroepen vanuit een SQL Server Agent taakstap

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

Originele productversie: SQL Server
Origineel KB-nummer: 918760

Symptomen

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

Oplossing

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

  • 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 voor het maken van verbindingen of voor toegang tot resources buiten het SSIS-pakket.

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

  • De huidige gebruiker kan geen geheimen van het pakket ontsleutelen. Dit scenario kan zich voordoen als het huidige account of het uitvoeringsaccount verschilt van de oorspronkelijke auteur van het pakket en de instelling van de eigenschap ProtectionLevel van het pakket de huidige gebruiker niet in staat stelt geheimen in het pakket te 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 te schrijven naar de bestandsshare waartoe verbindingsbeheer toegang heeft. Dit scenario kan zich bijvoorbeeld voordoen bij tekstlogboekproviders 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 SSIS-pakketconfiguratie 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 de juiste machtigingen heeft.

Gebruik de volgende methoden om het probleem op te lossen:

  • Methode 1: Gebruik een SQL Server Agent proxyaccount. Maak een SQL Server Agent proxyaccount. Dit proxyaccount moet een referentie gebruiken waarmee SQL Server Agent de taak kan uitvoeren als het account waarmee het pakket is 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 naar een andere computer verplaatst, kan deze methode daarom 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-pakket ProtectionLevel in EncryptSensitiveWithPassword. Deze instelling maakt gebruik van een wachtwoord voor versleuteling. Vervolgens kunt u de opdrachtregel van de SQL Server Agent taakstap wijzigen om dit wachtwoord op te nemen.

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

  • Methode 5: Een pakketsjabloon maken. Voor een langetermijnoplossing maakt u een pakketsjabloon die gebruikmaakt van een beveiligingsniveau dat afwijkt 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 ProtectionLevel eigenschap 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. In de tekst in de SQL Server Agent Taakgeschiedenis wordt informatie weergegeven die er ongeveer als volgt uitziet:

Pakketgeheimen ontsleutelen

De standaardinstelling voor de eigenschap SSIS-pakket ProtectionLevel is EncryptSensitiveWithUserKey. Wanneer het pakket wordt opgeslagen, versleutelt SSIS alleen de onderdelen van het pakket die eigenschappen bevatten die zijn gemarkeerd sensitive, zoals wachtwoorden, gebruikersnamen en verbindingsreeksen. 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 Service-account. Dit standaardaccount is waarschijnlijk een andere gebruiker dan de auteur van het pakket. Daarom kan de SQL Server Agent taakstap laden en beginnen met het uitvoeren van de taakstap, maar het pakket mislukt omdat er geen verbinding kan worden gemaakt. Het pakket kan bijvoorbeeld geen OLE DB-verbinding of een FTP-verbinding voltooien. Het pakket mislukt omdat het de referenties die nodig zijn om verbinding te maken niet kan ontsleutelen.

Belangrijk

Houd rekening met het ontwikkelingsproces en de omgeving om te bepalen welke accounts op elke computer nodig zijn en 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 Dtutil.exe SSIS-opdrachtpromptprogramma gebruiken om de beveiligingsniveaus te wijzigen met behulp van een .cmd-bestand en het subsysteem SQL Server Agent opdracht. Volg bijvoorbeeld deze stappen. Omdat u het hulpprogramma Dtutil.exe in batchbestanden en lussen kunt gebruiken, kunt u deze stappen uitvoeren voor meerdere pakketten tegelijk.

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

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

    Opmerking

    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 SQL Server Agent Taakgeschiedenis, 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-subsysteem in plaats van de SSIS-subsysteemopdracht.

Over SSIS-logboekregistratie

Met SSIS-logboek- en logboekproviders kunt u details vastleggen over de uitvoering en fouten van het pakket. Standaard worden in het pakket geen gegevens geregistreerd. U moet het pakket configureren om gegevens te registreren. Wanneer u het pakket configureert om informatie te registreren, 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.

Over de opdracht en uitvoerinformatie van het exec-subsysteem

Met behulp van de exec-subsysteemopdrachtbenadering voegt u uitgebreide schakelopties voor consolelogboekregistratie toe aan de SSIS-opdrachtregel om het uitvoerbare bestand Dtexec.exe SSIS-opdrachtregel aan te roepen. Daarnaast gebruikt u de functie Geavanceerde taak van het uitvoerbestand. U kunt ook de optie Stap-uitvoer opnemen in de geschiedenis gebruiken om de logboekgegevens om te leiden naar een bestand of naar de SQL Server Agent Taakgeschiedenis.

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 er niet van op de hoogte dat de standaardinstellingen voor de taakstap van de agent hen in deze status plaatsen. Zie de volgende onderwerpen in SQL Server 2005 Books Online voor meer informatie over SQL Server Agent proxy's en SSIS:

  • Pakketuitvoering plannen in SQL Server Agent
  • SQL Server Agent proxy's maken