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 ~> staging
und staging ~> NDS
Teile für einen bestimmten Datensatz.
Ein Domänenbenutzer (kein Systemadministrator) führt eine Aktion aus, bei der source system
die interessanten Daten in das System verschoben transit db
werden. 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 execute
Berechtigung für dieses UpdateMaterialInventory
Verfahren erteilt habe . Auf diese Weise müssen Sie dem Domänenbenutzer keine übermäßigen execute
Berechtigungen erteilen msdb.dbo.sp_start_job
.
Der SQL Agent-Auftrag NDS-ManualMaterialInventory
gehört dem Domänenbenutzer und umfasst zwei Schritte vom Typ [SQL Server Integration Services-Paket], die auf Ausführen als eingestellt sind SSISProxy
.
SSISProxy
ist 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 SSISProxyCredentials
wurden 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?