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.

19voto

James Orr Punkte 4865
GRANT SELECT ON [viewname] TO [user]

sollte es tun.

19voto

HTTP 410 Punkte 16820

Da Sie in einem Ihrer Kommentare angeben, dass sich die betreffende Tabelle in einer anderen Datenbank befindet, müssen Sie Eigentumskettung gilt. Ich vermute, dass es irgendwo einen Bruch in der Kette gibt - überprüfen Sie diesen Link für alle Einzelheiten.

19voto

Kosmo Punkte 191

Auch ich hatte dieses Problem. Ich habe die Informationen aus dem oben genannten Link verwendet und eine schnelle Lösung gefunden. Wenn Sie ein anderes Schema haben, sagen wir Test und Benutzer erstellen utest Eigentümer des Schemas Test und zwischen den Ansichten im Schema Test Sie haben Aussicht vTestView basierend auf den Tabellen des Schemas dbo Beim Auswählen von Objekten erhalten Sie die oben genannte Fehlermeldung - kein Zugriff auf Basisobjekte. Es war genug für mich, die Anweisung

ALTER AUTHORIZATION ON test.vTestView TO dbo ;

was bedeutet, dass ich einen Eigentümerwechsel von vTextView vom Schema, zu dem es gehört ( Test ) zum Datenbankbenutzer dbo Eigentümer des Schemas dbo . Danach wird der Benutzer ohne weitere Berechtigungen utest können auf die Daten von test.vTestView

1voto

Jing He Punkte 609

Die vorangegangenen Antworten sind zum Teil richtig, Sie können Folgendes verwenden GRANT-Anweisung um nur die Berechtigung für eine Ansicht zu erteilen, ohne die Berechtigung für ihre Basistabelle zu erteilen.

Da es sich jedoch um eine datenbankübergreifende Lösung handelt, müssen Sie auch die datenbankübergreifende Eigentumskette auf Instanzebene aktivieren. Corss Database Ownership Chaining

Sie müssen auch sicherstellen, dass die Ansicht und die Basistabelle demselben Eigentümer gehören, sonst funktioniert die Eigentümerkette nicht. In modernen Versionen von SQL Server (vielleicht nach SQL Server 2003) sind alle Tabellen und Ansichten standardmäßig Eigentum des jeweiligen Schemas, was bedeutet, dass der Eigentümer des Schemas auch derselbe sein sollte. Standardmäßig ist das Schema jeder Benutzertabelle "dbo", was "Datenbankeigentümer" bedeutet, so dass der Datenbankeigentümer der beiden zugehörigen DBs derselbe sein sollte.

DB Owner

Sie können diese beiden Artikel lesen, um mehr über SQL Server Ownership Chaining und Cross Database Owernship Chaining zu erfahren. https://www.mssqltips.com/sqlservertip/6394/understanding-sql-server-ownership-chaining/ https://www.mssqltips.com/sqlservertip/1782/understanding-cross-database-ownership-chaining-in-sql-server/

Und vielleicht wollen Sie auch mehr über SQL Server Logins und Datenbankbenutzer wissen, denn für den Benutzer, dem Sie nur in DB A Zugriff auf die Ansicht gewähren wollen, müssen Sie ihm zumindest die Rolle "public" in der DB geben, in der sich Ihre Basistabelle befindet: https://docs.microsoft.com/en-us/sql/relational-databases/security/authentication-access/create-a-database-user?view=sql-server-ver15

0voto

cciotti Punkte 730

Sie können Berechtigungen für eine Ansicht und nicht für die Basistabelle erteilen. Dies ist einer der Gründe, warum Menschen gerne Ansichten verwenden.

Schauen Sie hier nach: GRANT Objektberechtigungen (Transact-SQL)

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