2016-07-07 6 views
0

Ich habe eine Anwendung, die eine Ansicht in Datenbank A auf einem Microsoft SQL Server verwendet, der eine SELECT-Abfrage für eine andere Datenbank B auf demselben Server ausführt. Dies ist ein Produktions-SQL-Server. Das Problem besteht darin, dass das Serverbenutzerkonto nur über Berechtigungen für den Zugriff auf Datenbank A verfügt. Wenn der Server die View Select Query ausführt, wird der Fehler angezeigt:Gespeicherte Prozedur/View greift auf eine andere Datenbank auf demselben Server zu (Sicherheitsproblem)

"Der Server Principal" .... "ist nicht in der Lage die Datenbank B unter dem aktuellen Sicherheitskontext zuzugreifen.

es scheint, wie wir die Aussicht auf diese Weise, und es ist zu riskant zu gewähren Zugang zur Datenbank B für den Server (IIS, die die App-Hosts)

verwenden

Gibt es eine Möglichkeit für den Server, die Daten mithilfe der VIEW Select-Abfrage zu erhalten, indem er ein Zertifikat oder ähnliches verwendet?

I Würde mich freuen, wenn mir jemand in die richtige Richtung zeigen könnte. Vielen Dank!

+0

Sie können entweder eine gespeicherte Prozedur mit Administratorrechten für GT-Ergebnisse einrichten oder einen Bat-Cmd mit SQLCMD.EXE ausführen, um Ergebnisse zu erhalten. Die Bat-Datei könnte mit verschiedenen Privilegien ausgeführt werden. – jdweng

Antwort

1

Dies ist ein bisschen lang für einen Kommentar.

SQL Server hat die execute as Klausel genau das tun, was Sie wollen (siehe here). Diese Klausel ist sowohl als eigenständige Version als auch als Option für create procedure, create function und exec verfügbar. Sie können die Abfrage beispielsweise mit einem Benutzer (Sicherheitskontext) ausführen, der über vollständige Berechtigungen verfügt.

Sie können auch eine Funktion definieren, die im Sicherheitskontext des Eigentümers statt des Aufrufers ausgeführt wird (siehe insbesondere here Beispiel A). Es ist einfach, eine Ansicht durch eine Inline-Tabellenwertfunktion zu ersetzen; Sie müssen möglicherweise eine vollständige Tabellenwertfunktion definieren.

0

Sie könnten den Benutzer der zweiten Datenbank hinzufügen, aber nichts anderes tun als die Auswahl aus dieser VIEW. Erstellen Sie eine spezielle Rolle, erteilen Sie dieser Ansicht die Berechtigung SELECT für diese Rolle, und fügen Sie dann den Benutzer dieser Rolle hinzu (und entfernen Sie ihn aus public und allen anderen Rollen).