Ausführen eines SSIS-Pakets aus einem SQL Agent-Auftrag, der einem Benutzer einer Nicht-Sysadmin-Domäne gehört

16

Ich habe zwei SSIS-Pakete, die über Nacht (über SQL Server Agent) als Teil einer größeren SSIS-Bereitstellung ohne Probleme ausgeführt werden. Alles verwendet die Windows-Authentifizierung, und der geplante Auftrag gehört einem Systemadministrator (also mir) und wird als SQL Server-Agentendienstkonto ausgeführt.

Die Daten gehen also im Wesentlichen source system ~> transit db ~> staging ~> NDSüber Nacht.

Die beiden SSIS-Pakete, die mir wichtig sind, behandeln die transit db ~> stagingund staging ~> NDSTeile für einen bestimmten Datensatz.

Ein Domänenbenutzer (kein Systemadministrator) führt eine Aktion aus, bei der source systemdie interessanten Daten in das System verschoben transit dbwerden. Ich benötige daher eine Möglichkeit, diese aktualisierten Daten während der Arbeitszeit abzurufen, um das System zu aktualisieren NDS: Es wurde entschieden, dass dies der einfachste Weg ist, den diese Person auszulösen Diese ETL wurde durch Klicken auf eine Schaltfläche in einer makrofähigen Excel-Arbeitsmappe erstellt, die über ODBC (unter Verwendung der Windows-Authentifizierung) eine Verbindung zu SQL Server herstellt und eine gespeicherte Prozedur ausführt.

Die gespeicherte Prozedur sieht folgendermaßen aus:

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

Die gespeicherte Prozedur "sister" in [msdb] sieht folgendermaßen aus:

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

Dieser [SqlAgentProxy] -Benutzer ist ein Windows-Benutzer, den ich in [msdb] außerhalb der Anmeldung des Domänenbenutzers erstellt habe und für den ich die executeBerechtigung für dieses UpdateMaterialInventoryVerfahren erteilt habe . Auf diese Weise müssen Sie dem Domänenbenutzer keine übermäßigen executeBerechtigungen erteilen msdb.dbo.sp_start_job.

Der SQL Agent-Auftrag NDS-ManualMaterialInventorygehört dem Domänenbenutzer und umfasst zwei Schritte vom Typ [SQL Server Integration Services-Paket], die auf Ausführen als eingestellt sind SSISProxy .

SSISProxyist ein SQL Server-Agent-Proxy, der dem Subsystem [SQL Server Integration Services-Paket] unter Verwendung des Namens des Berechtigungsnachweises zugeordnet ist SSISProxyCredentials. Das Login des Domain-Benutzers wurde zu den Proxy-Account-Principals hinzugefügt .

Die SSISProxyCredentialswurden mit der Identität desselben Domänenbenutzers erstellt, der die gesamte SSIS-ETL über Nacht ausführt, und das Kennwort wurde vierfach überprüft.

Nun, wenn ich das laufen lasse:

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

Ich bekomme diese Ausgabe:

Job 'NDS-ManualMaterialInventory' started successfully.

Die Berufserfahrung erzählt jedoch eine viel weniger ermutigende Geschichte:

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

Und Schritt 1 Details:

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.

Der Job schlägt fehl und es wird nirgendwo etwas protokolliert.

Wenn ich den Jobbesitzer in mich selbst ändere und die Ausführung der Schritte als SQL Server-Agentendienstkonto ändere, wird der Job ausgeführt, ist erfolgreich und protokolliert 1.067 Zeilen in [Metadaten]. [Dbo]. [Sysssislog].

Es sieht so aus, als ob etwas an der Einrichtung des Proxys / der Anmeldeinformationen nicht stimmt. Welchen Teil mache ich falsch?

Mathieu Guindon
quelle

Antworten:

18

Das Problem sieht komplexer aus als es ist. Seit Sie SQL 2014 verwenden, werden Sie wahrscheinlich von den neuen Sicherheitsfunktionen gebissen, die 2012 eingeführt wurden.

Das Einzige, was wirklich zählt, ist:

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

Die Anmeldung Ihres Proxy-Benutzers hat höchstwahrscheinlich keinen Zugriff auf den SSISDB-Katalog (obwohl er möglicherweise Zugriff auf SQL Server hat).
Sie müssen die Anmeldung einem SSISDB-Benutzer zuordnen und den Zugriff auf die SSISDB-Ordner / -Projekte in Integration Services konfigurieren.

In diesem MSDN-Blogbeitrag finden Sie Tipps zur SSIS-Katalogzugriffskontrolle und SQL 2012-SSIS-Katalogberechtigungen

Sobald Sie das Paket tatsächlich geladen haben, treten möglicherweise andere Probleme mit dem Sicherheitskontext auf, Sie sollten jedoch eine bessere Protokollierung von den Integrationsservices selbst erhalten.

Tom V - Team Monica
quelle
3
Genau das. Vielen Dank, dass Sie alles getan haben :-)
Mathieu Guindon