Ich arbeite mit MSSQL Server Management Studio 2008 und muss die Ansicht für die Datenabstimmung einem Dritten zur Verfügung stellen. Ich habe die entsprechende Ansicht erstellt, kann jedoch keinen Benutzer erstellen und diesem Benutzer die erforderlichen Berechtigungen zum Auswählen in der Ansicht erteilen.
Ich folgte den Assistenten zum Erstellen eines Anmeldenamens und eines Benutzers und fügte dann meine Ansicht im Abschnitt "Sicherheit" hinzu, wobei das Kontrollkästchen "Gewähren" für "Auswählen" aktiviert war. Alles schien in Ordnung zu sein, aber als ich mich als dieser Benutzer anmeldete und versuchte, "Select * from MyViewName" auszuführen, wurde mir mitgeteilt, dass die Auswahlberechtigung verweigert wurde.
Ich habe den Benutzer gerade neu erstellt (diesmal nur mit SQL anstelle des Assistenten) und explizit Auswahlberechtigungen erteilt. Jetzt erhalte ich den Fehler: Msg 916, Level 14, State 1, Line 2
The server principal "username" is not able to access the database "unrelated_db" under the current security context.
(Ich weiß nicht, warum versucht wird, auf die nicht verknüpfte Datenbank zuzugreifen ...)
Ich weiß wirklich nicht, wohin ich von hier aus gehen soll. Auch hier muss ich im Grunde nur einen Benutzer erstellen, den ich dem Dritten geben kann, damit dieser eine Verbindung zu unserer Datenbank herstellt und aus dieser Ansicht auswählt.
quelle
Antworten:
Bitte benutzen Sie hierfür nicht die Benutzeroberfläche. Es ist ein verwirrendes Durcheinander.
Es hört sich für mich so an, als ob Sie einen Benutzer in einer Datenbank für ein bestimmtes Login erstellen möchten, der nur die Berechtigung hat, aus einer Ansicht auszuwählen. Also, da Sie bereits das Login erstellt haben:
BEARBEITEN hier ein Beispiel für ein Skript, das zu dem von Ihnen genannten Fehler führt.
Erstellen Sie zunächst eine Tabelle in der unrelated_db:
Erstellen Sie jetzt ein relativ eingeschränktes Login:
Erstellen Sie nun eine Datenbank, in der die Ansicht gespeichert wird, und fügen Sie die Anmeldung als Benutzer hinzu:
Erstellen Sie nun eine Funktion, die auf die Tabelle in der anderen Datenbank verweist, und ein Synonym für die andere Tabelle:
Erstellen Sie nun eine lokale Tabelle:
Erstellen Sie nun eine Ansicht , die Referenzen der Tabelle, die Funktion und das Synonym und Erteilung
SELECT
zuusername
:Versuchen Sie nun, als auszuführen
username
und wählen Sie nur die lokale Spalte aus der Ansicht aus:Ergebnis:
Ändern Sie nun die Ansicht so, dass keine externen Objekte referenziert werden, und führen Sie die obigen Schritte
SELECT
erneut aus.Sie können uns nicht nur die Skripte für die Zahlungsdetails, Kontodetails und MyView-Objekte anzeigen, sondern auch mitteilen, ob diese Abfrage Ergebnisse liefert. Sie können Verweise auf verschiedene Objekte über die Katalogansicht finden
sys.sql_expression_dependencies
, aber diese Ansicht ist nicht perfekt - ich glaube, es hängt davon ab, dass alle Ansichten aktualisiert werden (falls sich Ansichten beispielsweise auf andere Ansichten beziehen oder das zugrunde liegende Schema geändert hat) um genau zu sein.SQL Server wird nicht nur versuchen, darauf zuzugreifen
unrelated_db
Spaß Es muss eine Verbindung zu dieser Datenbank in der Ansicht bestehen, die Sie verwenden möchten. Leider können wir nur spekulieren, wenn wir die Ansichtsdefinition und weitere Details zu den Objekten, die sie berührt, nicht sehen können. Die beiden wichtigsten Dinge, an die ich denken kann, sind Synonyme oder Funktionen, die dreiteilige Namen verwenden. Wenn wir jedoch die tatsächlichen Skripte sehen, erhalten wir eine viel bessere Vorstellung, anstatt zu raten. :-)Möglicherweise möchten Sie auch überprüfen
sys.dm_sql_referenced_entities
, aber diese Funktion gibt im obigen Beispiel nichts Nützliches zurück.quelle
Sie können dies folgendermaßen testen:
quelle