3

Ich habe eine gespeicherte Prozedur, die Daten in eine Zieltabelle lädt und funktioniert gut, wenn in einer Sitzung mit meinen AD-Anmeldeinformationen ausgeführt.SQL Server führt Prozedur als Benutzer

Wenn ich versuche, es in einem Job auszuführen (wieder mit meinen AD-Details in der Option Ausführen als) plötzlich hat der Login keinen Zugriff auf einen der DBs.

I verwendet

EXEC SP1 

Welche fein gearbeitet.

verwendet I (emuliert die gespeicherte Prozedur in einem Auftrag ausgeführt)

EXECUTE AS user = 'Domain\JDoe' 

EXECUTE SP1 

REVERT 

Welche fehlgeschlagen.

Warum schlägt die gespeicherte Prozedur beim Ausführen mit denselben Anmeldeinformationen fehl, die in einem anderen Sitzungsfenster erfolgreich verwendet werden?

Vielen Dank im Voraus

+0

Haben Sie in Betracht gezogen, Ihren SQL-Job oder Ihre Jobschritte als einen bestimmten (Domänen-) Benutzer auszuführen, anstatt ihn in Ihrer Ausführung zu definieren? – Jens

+0

@Jens, ja, das war mein erster Versuch. Ich habe den Jobverlauf überprüft und festgestellt, dass die Fehlermeldung besagt, dass ich nicht den richtigen Zugriff auf einen der erforderlichen DBs hatte. Nachdem ich gesehen habe, dass ich den SP manuell mit der EXEC-Leitung ausgeführt habe, die so funktioniert hat, habe ich die EXEC AS mit meinem Benutzernamen versucht und es ist mit demselben Fehler wie der Job gescheitert. – Powell21

+0

Welche DBMS verwendest du? – jarlh

Antwort

3

Sie müssen die Quelldatenbank TRUSTWORTHY einzustellen. Beachten Sie, dass dies andere Auswirkungen auf die Sicherheit hat (siehe unten).

Standardmäßig können Sie in SQL Server keinen angenommenen Sicherheitskontext verwenden, um aus einer Datenbank in eine andere Datenbank zu gelangen, wenn die Quelle nicht vertrauenswürdig ist. Wenn Sie eine Datenbank auf TRUSTWORTHY setzen, geben Sie an, dass die Datenbank eine vertrauenswürdige Quelle ist. Dies ist eine Sicherheitsmaßnahme, die verhindern soll, dass jemand, der von einer Anwendung (in der Regel über Injection) in eine Datenbank gelangt, diese dann als Sprungbrett in alle anderen Datenbanken im selben SQL Server verwendet. Durch das Setzen sie Trustworthy Sie sagen „diese Datenbanksichereund niemand kann gehen raus ist, wer nicht soll.

Alter Datenbank Aussagen wie diese erfordern, dass niemand sonst ist in der Datenbank, wenn Sie es ändern. Sie können WITH ROLLBACK IMMEDIATE am Ende des Befehls hinzufügen, um alle anderen zuerst auszuwerfen. Natürlich kann das Konsequenzen haben ... ;-)

Verwandte Themen