Ich muss den Zugriff auf einen bestimmten Benutzer beschränken, er muss jedoch weiterhin in der Lage sein, die Daten in Tabellen von dbo anzuzeigen.
Ich versuche Folgendes zu tun:
- Das Dbo-Schema funktioniert wie gewohnt und hat Zugriff auf alles
- schema1 schema hat nur Zugriff auf schema1-Objekte
- Wenn eine Schema1-Ansicht oder eine gespeicherte Prozedur auf Daten in Tabellen zugreift, deren Eigentümer dbo ist, wird die Berechtigungskette entsprechend verkettet
- Benutzer1 hat Zugriff auf Schema1 und sonst nichts. außer im Fall von # 3
Folgendes habe ich versucht:
- Erstellen Sie einen Benutzer1, der einem Test-Login mit einem zufälligen Passwort zugeordnet ist
- Erstellt ein paar Tabellen im Dbo-Schema mit einigen Testdaten
- Erstellt ein Schema1-Schema
- Erstellt ein schema1.get_profiles, das aus einer Ansicht namens schema1.profiles auswählt, die auf Daten in dbo.people, dbo.taglinks und dbo.tags zugreift
Verwenden Sie jedoch die folgende Anweisung, während Sie als Benutzer1 angemeldet sind:
EXEC get_profiles 1
Ergebnisse in:
The SELECT permission was denied on the object 'tags', database 'schema_test', schema 'dbo'.
Ich habe versucht WITH EXECUTE AS OWNER
und kann nicht verstehen, wie "Eigentumsverkettung" funktionieren soll.
Ich habe es auch versucht
GRANT EXECUTE ON SCHEMA::schema1 TO user1
GRANT INSERT ON SCHEMA::schema1 TO user1
GRANT SELECT ON SCHEMA::schema1 TO user1
GRANT UPDATE ON SCHEMA::schema1 TO user1
GRANT VIEW DEFINITION ON SCHEMA::schema1 TO user1
Ich erhalte jedoch die folgende Fehlermeldung (obwohl ich ein Benutzer mit DBO-Zugriff bin):
Cannot grant, deny, or revoke permissions to sa, dbo, entity owner, information_schema, sys, or yourself.
Ich brauche user1, um über die gespeicherten Prozeduren, die ich gebe, auf die Daten zugreifen zu können, und sonst nichts.
Darüber hinaus soll dies möglicherweise in einer vorhandenen SQL Azure-Datenbank ausgeführt werden, aber ich teste zuerst mit einer lokalen Dummy-Datenbank.
quelle
Antworten:
Das Grundkonzept besteht darin, die GRANT / DENY-Schemaberechtigungen zu verwenden . Sie können Berechtigungen effizient verwalten, indem Sie eine Rolle erstellen und dieser dann Mitglieder hinzufügen.
Nachfolgend finden Sie ein Beispiel, das Sie ausführlich erklärt
Testen Sie jetzt:
Erstellen Sie nun gespeicherte Prozeduren:
Jetzt gewähren Sie UserA Ausführungsberechtigungen für den SP von schemaB
Testen Sie es, um festzustellen, ob UserA SP von SchemaB ausführen kann. Es wird vorübergehen
BenutzerA kann jedoch keine Daten aus SchemaB anzeigen
Alternativ können Sie DATABASE ROLE verwenden und Benutzer hinzufügen, um die Verwaltung der Berechtigungen zu vereinfachen:
Die folgende Anweisung stellt sicher, dass UserA schemaA und NOT schemaB sehen kann. Das Gute ist, dass Sie der
SchemaBUsesSchemaAProc
Rolle einfach Benutzer hinzufügen können, die alle Berechtigungen erben, die dieser Rolle erteilt wurden.Wenn Sie nur zulassen möchten, dass UserA SPs ausführt, deren Eigentümer SchemaB ist, übernimmt die folgende Anweisung die Aufgabe:
Auf diese Weise kann BenutzerA die Tabellen von SchemaB nicht sehen, aber weiterhin Procs von SchemaB ausführen.
Nachfolgend wird die Berechtigungshierarchie erläutert :
quelle