23 Stimmen

Gewährung von Select für eine Ansicht und nicht für eine Basistabelle, wenn sich die Basistabelle in einer anderen Datenbank befindet

Ich habe eine Ansicht, die Zeilen aus einer Tabelle in einer anderen Datenbank auswählt. Ich möchte dem View Select-Zugriff gewähren, aber keinen direkten Zugriff auf die Basistabelle. Der View hat eine Where-Klausel, die die Anzahl der Zeilen einschränkt.

Kann ich Select für die Ansicht und nicht für die Basistabelle gewähren, oder muss ich zu einer gespeicherten Prozedur wechseln? Ich würde es lieber nicht auf die letztere Weise tun.

0voto

Sam Punkte 7422

Ich habe dies in einer meiner Datenbanken ausprobiert.

Damit es funktioniert, musste der Benutzer in die Datenbank aufgenommen werden, in der die eigentlichen Daten gespeichert sind. Es waren keine Rechte erforderlich, nur der Zugang.

Haben Sie erwogen, die Ansicht in der Datenbank zu belassen, auf die sie verweist? Re Usability und alle seine Vorteile könnten folgen.

0voto

Eli Punkte 2362

Ich hatte ein ähnliches Problem, bei dem ich die gleiche Fehlermeldung für einen Benutzer erhielt. Ich denke, wenn ich meinen Fehler mitteile, kann ich das Problem aufklären, die Frage beantworten und andere davor bewahren, denselben Fehler zu machen.
Ich wollte, dass ein Benutzer Zugriff auf 4 bestimmte Ansichten hat, ohne Zugriff auf die zugrundeliegenden Tabellen zu haben (oder auf irgendetwas anderes in der DB, was das betrifft).
Zunächst gab ich ihnen die Datenbankrollenmitgliedschaft "db_denydatareader", weil ich dachte, dass dies sie daran hindern würde, irgendetwas aus irgendeiner Tabelle oder Ansicht auszuwählen (was es auch tat - wie ich dachte), obwohl ich dann "select" für diese 4 Ansichten gewährte, in der Annahme, dass es so funktionieren würde, wie ich es beabsichtigte - tat es aber nicht.
Die richtige Vorgehensweise ist einfach pas gewähren Sie ihnen die Rolle db_datareader und gewähren Sie einfach "select" für die Elemente, auf die der Benutzer Zugriff haben soll. Das Ergebnis der obigen Vorgehensweise war, dass der Benutzer auf absolut nichts außerhalb dieser 4 Ansichten zugreifen konnte - die Tabellen, auf denen diese Ansichten basieren, sind für diesen Benutzer ebenfalls nicht verfügbar.

0voto

Asher Punkte 41

Ich habe dieses Problem gehabt. Es scheint, dass obwohl die Berechtigung für "View1" als Teil des Schemas "schema1" vom Eigentümer "dbo" erteilt werden muss, wenn View1 dbo.table1 verwendet.

Solange kein Schema verwendet wird, das nicht Teil von dbo ist, wird dieses Problem möglicherweise nicht offensichtlich, und die normale Lösung "Grant Select to user" würde funktionieren.

0voto

Shaji Punkte 689

Ich habe das so gemacht, dass ich dem Benutzer die Berechtigung für die Tabellen gegeben habe, auf die er keinen Zugriff haben sollte. Dann habe ich die Select-Berechtigung in SSMS feinjustiert, indem ich die Select-Berechtigung nur für die Spalten in meiner Ansicht zugelassen habe. Auf diese Weise ist die Auswahlklausel für die Tabelle nur auf die Spalten beschränkt, die der Benutzer ohnehin in der Ansicht sieht.

enter image description here

Shaji

0voto

Amani Punkte 1

Create view Schema1.viewName1 as (select * from plaplapla)

Schema1 hat alle Tabellen

Create view Schema2.viewName2 as (select * from schema1.viewName1)

schema2 hat keine Tabellen (nur Ansichten Schema)

In diesem Fall können Sie ( select * from viewName2 ) in schema2 , ABER Wenn Sie deleted viewNmae1 from Schema1 dann ViewName2 wird nicht funktionieren.

Amani El Gamal aljamalaisj81@gmail.com

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X