SQL Server – GRANT, DENY, REVOKE – Berechtigungen verstehen und richtig einsetzen

SQL Server – GRANT, DENY, REVOKE
Berechtigungen verstehen und richtig einsetzen

📅 14. Mai 2025 ✍️ Erfahrener SQL Entwickler & DBA ⏱ 9 Min. Lesezeit

1. Einleitung – Grundlagen der Berechtigungssteuerung

Jede Datenbankanwendung benötigt ein durchdachtes Sicherheitskonzept. Die zentralen T‑SQL‑Anweisungen zur Vergabe, Verweigerung und zum Entzug von Rechten heißen GRANT, DENY und REVOKE. Sie steuern, wer welche Aktionen auf welchen Objekten ausführen darf. In diesem Artikel erkläre ich die Unterschiede, zeige praktische Beispiele und gebe Richtlinien für den Alltag.

💡 Wichtig: Berechtigungen können auf verschiedenen Ebenen erteilt werden: Server (z. B. CREATE DATABASE), Datenbank (z. B. SELECT auf Tabelle), Schema oder individuelle Objekte (Tabelle, Sicht, Prozedur). Die Vererbung über Rollen vereinfacht die Verwaltung erheblich.

2. GRANT – Rechte erteilen

GRANT weist einem Sicherheitskonto (Login, Benutzer oder Rolle) eine bestimmte Berechtigung zu. Die Syntax ist einheitlich: GRANT <Berechtigung> ON <Objekt> TO <Empfänger>. Fehlen weitere Einschränkungen, ist das Recht unbeschränkt gültig.

-- Beispiel: Leserechte auf eine Tabelle erteilen 
USE SalesDB; 
GRANT SELECT ON dbo.Orders TO ReportingUser; 
 
-- Mehrere Rechte auf einmal 
GRANT SELECT, INSERT, UPDATE ON dbo.Products TO AppRole; 
 
-- Berechtigung auf Schema-Ebene (alle Tabellen des Schemas) 
GRANT SELECT ON SCHEMA::Sales TO SalesReader; 
 
-- Ausführungsrecht auf gespeicherte Prozedur 
GRANT EXECUTE ON dbo.usp_GetCustomerData TO JuniorDeveloper;
💡 Best Practice: Erteilen Sie Rechte möglichst über Rollen (CREATE ROLE ...; GRANT ... TO Role; ALTER ROLE ADD MEMBER User). Das vereinfacht die spätere Anpassung und erhöht die Übersichtlichkeit.

3. DENY – Rechte explizit verweigern

DENY ist die schärfste Anweisung: Sie verweigert eine Berechtigung, selbst wenn der Benutzer sie über eine Rolle oder Gruppenmitgliedschaft erhalten hätte. DENY hat Vorrang vor GRANT. Verwenden Sie es sparsam – meist ist der Verzicht auf GRANT (also keine Erteilung) ausreichend.

-- Einer bestimmten Person explizit den Zugriff auf eine Tabelle verwehren 
DENY SELECT ON dbo.Salary TO JohnDoe; 
 
-- Verweigerung auf Spaltenebene (seit SQL Server 2012) 
DENY SELECT ON dbo.Employees (SSN) TO HRRole;
🚨 Achtung: Wenn Sie später die Berechtigung wieder erteilen möchten, müssen Sie zuerst das DENY mit REVOKE aufheben. Ein erneutes GRANT würde ohne vorheriges REVOKE wirkungslos bleiben, da DENY dominiert.

4. REVOKE – Berechtigungen entziehen

REVOKE entfernt eine zuvor erteilte oder verweigerte Berechtigung. Es ist der neutrale Zustand – weder erlaubt noch verboten. Nach einem REVOKE entscheiden allein die anderen Rollen- und Gruppenmitgliedschaften des Benutzers über den Zugriff.

-- Eine erteilte Berechtigung zurücknehmen 
REVOKE SELECT ON dbo.Orders FROM ReportingUser; 
 
-- Eine Verweigerung aufheben (die Berechtigung bleibt aber nicht erteilt) 
REVOKE DENY SELECT ON dbo.Salary TO JohnDoe;
⚠️ Wichtiger Unterschied: REVOKE ist nicht dasselbe wie DENY! REVOKE macht eine explizite Berechtigung rückgängig. DENY setzt eine explizite Sperre. Verwechseln Sie die beiden nicht.

5. Vorrangregeln: Wer gewinnt bei Konflikten?

Ein Benutzer kann Berechtigungen aus verschiedenen Quellen erhalten: eigene GRANT, Mitgliedschaft in einer Rolle, Mitgliedschaft in einer Windows-Gruppe. Die folgende Hierarchie entscheidet:

  1. DENY auf Benutzerebene – hat immer Vorrang, egal was Rollen oder Gruppen sagen.
  2. DENY auf Rollenebene – blockiert auch, wenn der Benutzer über andere Rollen Rechte hätte.
  3. GRANT auf Benutzerebene – erlaubt Zugriff, sofern kein DENY vorliegt.
  4. GRANT über Rollen oder Gruppen – gilt, wenn keine höhere Verweigerung existiert.
  5. Keine Berechtigung (implizit) – Zugriff verweigert.
-- Beispielkonflikt 
-- User ist Mitglied der Rolle SalesReader (hat SELECT auf Orders) 
GRANT SELECT ON dbo.Orders TO SalesReader; 
-- Aber der User selbst bekommt ein DENY 
DENY SELECT ON dbo.Orders TO JohnDoe; 
-- Ergebnis: JohnDoe kann nicht auf Orders zugreifen (DENY auf Benutzerebene gewinnt).
💡 Praxis-Tipp: Vermeiden Sie DENY auf Benutzerebene, wenn möglich. Nutzen Sie stattdessen die Abwesenheit von Rechten oder legen Sie den Benutzer in eine restriktive Rolle.

6. Beispiele aus der Praxis – typische Szenarien

Szenario 1: Anwendungsleser

Eine App benötigt nur Leserechte auf einige Tabellen, aber keine Schreibrechte.

CREATE USER AppReader FOR LOGIN AppLogin; 
GRANT SELECT ON dbo.Products TO AppReader; 
GRANT SELECT ON dbo.Categories TO AppReader; 
-- Keine INSERT/UPDATE/DELETE Rechte → sicher

Szenario 2: Temporäre Sperrung eines Mitarbeiters

Ein Mitarbeiter wechselt die Abteilung und soll während der Übergangszeit keinen Zugriff auf die alte Tabelle haben, aber seine Rolle behalten.

DENY SELECT, INSERT, UPDATE, DELETE ON dbo.OldDepartmentData TO [DOMAIN\JohnDoe]; 
-- Nach der Übergangszeit das DENY wieder aufheben 
REVOKE SELECT, INSERT, UPDATE, DELETE ON dbo.OldDepartmentData TO [DOMAIN\JohnDoe];

Szenario 3: Nur bestimmte Spalten sichtbar machen

-- Berechtigung auf zwei Spalten einer Tabelle erteilen (SQL Server 2012+) 
GRANT SELECT ON dbo.Employees (Name, Department) TO TeamLead; 
-- Alle anderen Spalten (z. B. Gehalt) sind für TeamLead nicht sichtbar.

7. Überprüfen vorhandener Berechtigungen

Mit folgenden Abfragen behalten Sie den Überblick, wer welche Rechte hat.

-- Serverweite Berechtigungen eines Logins 
SELECT class_desc, permission_name, state_desc 
FROM sys.server_permissions 
WHERE grantee_principal_id = DATABASE_PRINCIPAL_ID('MyLogin'); 
 
-- Datenbankweite Berechtigungen eines Benutzers 
SELECT class_desc, object_name(major_id) AS ObjectName, 
permission_name, state_desc 
FROM sys.database_permissions 
WHERE grantee_principal_id = DATABASE_PRINCIPAL_ID('MyUser'); 
 
-- Mitgliedschaften in Datenbankrollen 
SELECT r.name AS RoleName 
FROM sys.database_role_members rm 
JOIN sys.database_principals r ON rm.role_principal_id = r.principal_id 
WHERE rm.member_principal_id = DATABASE_PRINCIPAL_ID('MyUser');

8. Tipps für den Alltag – häufige Fehler vermeiden

  • Niemals DENY für öffentliche RollenDENY auf die Public-Rolle wirkt für alle Benutzer und kann unerwartete Sperren erzeugen.
  • Verwenden Sie Objekteigentümerschaften – Der Eigentümer (z. B. dbo) kann immer alles, auch ohne explizites GRANT.
  • Beachten Sie die Vererbung über WITH GRANT OPTION – Wer eine Berechtigung mit GRANT ... WITH GRANT OPTION erhält, darf sie an andere weitergeben. Verwenden Sie dies nur bewusst.
  • Testen Sie Berechtigungen mit EXECUTE AS USER – So simulieren Sie die Rechte eines anderen Benutzers, ohne sich aus- und wieder einloggen zu müssen.
EXECUTE AS USER = 'JohnDoe'; 
SELECT * FROM dbo.Orders; -- Test mit Johns Rechten 
REVERT;

9. Zusammenfassung und Merkregeln

  • GRANT = erlaubt etwas.
  • DENY = verbietet etwas (stärker als alle GRANT).
  • REVOKE = neutralisiert eine frühere GRANT oder DENY.
  • Verwenden Sie DENY nur für Ausnahmen, nicht als Standard.
  • Nutzen Sie Rollen, um Rechte zu bündeln und Benutzer zuzuordnen.
  • Überprüfen Sie regelmäßig mit den Systemansichten, wer welche Rechte hat.
💡 Abschließend: Ein gut durchdachtes Berechtigungskonzept spart langfristig Zeit und schützt vor Datenpannen. Fangen Sie klein an, dokumentieren Sie Ihre Rollen und erweitern Sie schrittweise. Mit den drei zentralen Anweisungen GRANT, DENY und REVOKE haben Sie alle Werkzeuge in der Hand.

powered by dtcSoftware