Wie kann man gespeicherte Prozeduren ausführen, aber keine Schreibvorgänge?

11

Ich möchte einen "lesenden" Benutzer auf meiner SQL Server 2012-Instanz einrichten. Ich möchte ihm das Recht einräumen, gespeicherte Prozeduren, Funktionen oder direkte SQL-Anweisungen auszuführen, die Daten aus allen Tabellen und Ansichten abrufen, aber nicht aktualisieren oder einfügen (dh nichts lesen und nichts schreiben).

Kann ich dies einrichten, ohne jeder Funktion oder gespeicherten Prozedur namentlich Rechte zu erteilen, sondern ihm das Ausführungsrecht für jede Funktion oder gespeicherte Prozedur gewähren, indem ich nur das Recht zum Ändern von Tabellen wegnehme?

Wird sich etwas ändern, wenn ich stattdessen SQL Server 2008 ausführe?

Erläuterungen und Ergänzungen:

  1. Wenn eine gespeicherte Prozedur Daten ändert, sollte der Benutzer eine Fehlermeldung erhalten (entweder die Änderung verweigern oder den Zugriff auf die gespeicherte Prozedur vollständig verweigern).
  2. Wenn eine mögliche Lösung das Verweigern von Berechtigungen beinhaltet, kann ich dann bestimmte Berechtigungen nicht erteilen, anstatt sie zu verweigern?
  3. Kann eine Verweigerung auf alle Tabellen, Ansichten usw. (die jetzt und in Zukunft vorhanden sind) in der Datenbank in einer Anweisung angewendet werden?
gt6989b
quelle
Ich bin neu hier, bitte
zögern
1
@KrisGruttemeyer das war der Gedanke - er könnte es ausführen, aber es würde zu einem Fehler führen; alternativ bin ich damit einverstanden, dass er es nicht ausführen darf, solange ich keine Liste von
SPs
1
In diesem Fall müssen Sie Informationen zu SQL Server-Berechtigungen lesen. Es gibt 3 Berechtigungsvarianten: Berechtigungen GRANTerteilen, Berechtigungen DENYverweigern und REVOKEein GRANToder entfernen DENY. Ohne GRANToder kann DENYder Benutzer Berechtigungen erben, beispielsweise durch Zugriff auf eine gespeicherte Prozedur.
JNK
1
@ gt6989b Wenn Sie sich DENY DELETE, INSERT, UPDATEin einer Datenbank oder einem Schema befinden, wirkt sich dies meiner Meinung nach nur auf Tabellen und Ansichten aus.
JNK
1
@ gt6989b - Nur zu bemerken, dass sich die vorgeschlagene Antwort in diesen Kommentaren als falsch herausstellte. Siehe Paul Whites Antwort.
RLF

Antworten:

15

Dies ist nicht so einfach zu erreichen, wie Sie vielleicht denken. Eine Möglichkeit besteht darin, eine neue benutzerdefinierte Datenbankrolle zu erstellen, alle für diese Rolle erforderlichen Berechtigungen zu erteilen und dann Benutzer zur neuen Rolle hinzuzufügen. Dies macht es zumindest einfacher, Benutzern (oder anderen benutzerdefinierten Rollen) diese Berechtigungen in Zukunft zu erteilen. Die folgenden Schritte sind ein guter Anfang:

-- The user-defined role containing all required permissions
CREATE ROLE Readers AUTHORIZATION dbo;

-- Give read-only access to all tables,
-- views on those tables, and in-line
-- functions
ALTER ROLE db_datareader ADD MEMBER Readers;

-- Example: add a user (Bob) to the role
ALTER ROLE Readers ADD MEMBER Bob;

Danach verfügt Bob über umfassende schreibgeschützte Berechtigungen in der Datenbank. Er kann aus allen Tabellen, Ansichten dieser Tabellen und Inline-Funktionen lesen. Er kann jedoch keine Prozeduren ausführen oder Nicht-Inline-Funktionen verwenden.

Sie müssen der Readers-Rolle bestimmte Berechtigungen erteilen, um sichere Funktionen und Verfahren zu erhalten, auf die Readers Zugriff haben soll. Möglicherweise können Sie Schritte ausführen, um diesen Vorgang zu vereinfachen (z. B. das Gruppieren von Objekten in einem Schema und das Erteilen der Ausführungsberechtigung für das Schema anstelle einzelner Objekte), aber es gibt zu viele Details, um sie hier zu behandeln.

Beachten Sie, dass das Fehlen von Berechtigungen zum Ändern von Daten einen Leser nicht daran hindern würde, Daten über eine gespeicherte Prozedur zu ändern, für die ihm die Ausführungsberechtigung erteilt wurde, wenn die zu ändernde Prozedur und das zu ändernde Objekt einen gemeinsamen Eigentümer haben. Eine ausdrückliche Ablehnung würde in diesem Fall auch nicht respektiert. Diese Funktion wird als Ownership Chaining bezeichnet .

Paul White 9
quelle