Ich habe eine SQL Server 2012-Instanz mit einigen Datenbanken. In einer davon habe ich eine Ansicht erstellt, die Tabellen in mehr als einer Datenbank auswählt.
Ich möchte, dass ein Benutzer diese Ansicht auswählen kann, aber er darf seine Tabellen nicht auswählen. Die Ansicht wurde genau erstellt, weil der Benutzer die Tabellen nicht auswählen kann.
Ich habe /programming/368414/grant-select-on-a-view-not-base-table und http://msdn.microsoft.com/en-us/library/ms188676 gelesen . aspx und trotzdem funktioniert es nicht.
Wenn ich GRANT SELECT TABLE TO USER
für alle Tabellen eine mache , kann der Benutzer die Ansicht auswählen. Aber wenn ich eine Tabelle widerrufe, schlägt dies fehl.
Dies sollte ein einfaches Verfahren sein, aber ich habe Probleme, es zum Laufen zu bringen. Ich habe es schon einmal gesehen (der Besitzer einer Instanz hat mir Zugriff auf eine Ansicht gewährt und es nicht mit ihren Tabellen gemacht), aber ich kann es nicht tun oder jemanden finden, der weiß wie.
Könnte mir jemand ein Tutorial dazu oder ein Codebeispiel geben?
Wenn der Benutzer SELECTs
die Ansicht erhält, erhalte ich die Nachricht:
Die SELECT-Berechtigung wurde für das Objekt
<TABLE>
, die Datenbank<DB>
und das Schema verweigertdbo
.
Wenn ich dieser Tabelle eine Auswahl erteile, ändert die Fehlermeldung den Tabellennamen in eine andere Tabelle, die in der Ansicht gelesen wird.
quelle
Antworten:
Wenn Sie möchten, dass Benutzer aus der Ansicht auswählen, warum gewähren Sie der Tabelle? Mit "widerrufen" meinen Sie explizit widerrufen / verweigern? Verweigern überschreibt die Gewährung, sodass Ihr Problem vorliegt. Sie sollten dies erreichen können, indem Sie der Ansicht eine Bewilligung hinzufügen und in den Tabellen nichts tun.
Hier ist ein kurzes Beispiel, in dem
SELECT
nicht explizit für die Tabelle, sondern für die Ansicht gewährt wurde. Der Benutzer kann aus der Ansicht auswählen, jedoch nicht aus der Tabelle.Beachten Sie, dass davon ausgegangen
foo
wird, dass keine erhöhten Berechtigungen durch explizite Berechtigungen für das Schema oder die Datenbank oder durch Rollen- oder Gruppenmitgliedschaft gewährt wurden.Da Sie Tabellen in mehreren Datenbanken verwenden (es tut mir leid, dass ich das Ende dieses ersten Satzes anfangs verpasst habe), benötigen Sie möglicherweise auch explizite Berechtigungen für die Tabelle (n) in der Datenbank, in der die Ansicht nicht vorhanden ist. Um zu vermeiden, dass den Tabellen eine Auswahl zugewiesen wird, können Sie in jeder Datenbank eine Ansicht erstellen und dann die Ansichten verbinden.
Erstellen Sie zwei Datenbanken und ein Login:
d1
Erstellen Sie in der Datenbank einen Benutzer und erstellen Sie dann eine Tabelle und eine einfache Ansicht für diese Tabelle. Gewähren Sie dem Benutzer nur eine Auswahl für die Ansicht:Erstellen Sie nun in der zweiten Datenbank den Benutzer und anschließend eine weitere Tabelle und eine Ansicht, die diese Tabelle mit der Ansicht in verbindet
d1
. Gewähren Sie Auswahl nur für die Ansicht.Starten Sie nun ein neues Abfragefenster und ändern Sie die Anmeldeinformationen für die Anmeldung
blat
(EXECUTE AS
funktioniert hier nicht). Führen Sie dann im Kontext einer der beiden Datenbanken Folgendes aus, und es sollte einwandfrei funktionieren:Diese sollten beide Msg 229-Fehler ergeben:
Ergebnisse:
quelle
Antwort des Community-Wikis, die ursprünglich vom Autor zu der Frage hinzugefügt wurde:
Das habe ich getan:
SELECT
dem Benutzer in dieser Ansicht Zugriff und NICHT auf eine seiner Tabellen. Der Benutzer konnte die Ansicht und nicht die Tabellen erfolgreich abfragen.SELECT
dem Benutzer in dieser zweiten Ansicht Zugriff und auch NICHT auf eine Tabelle. Der Benutzer konnte diese endgültige Ansicht erfolgreich abfragen und Daten anzeigen.Ich finde es seltsam, dass eine Ansicht Tabellen in ihrer Datenbank abfragen kann, wenn der Benutzer keinen direkten Zugriff hat, dies jedoch nicht in Tabellen aus anderen Datenbanken tun kann. Zumindest hat es funktioniert.
quelle
Wenn Sie
Cross database ownership chaining
für den Server aktivieren, funktionieren datenbankübergreifende Ansichten einwandfrei.https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/sql/enabling-cross-database-access-in-sql-server
achte auf die Risiken
quelle