Berechtigungen auf Spaltenebene
Sensible Spalten ausblenden
Berechtigungen auf Spaltenebene ist eine kostenlose SQL Academy-Lektion auf CoddyKit. Dies ist Lektion 3 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des SQL Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der SQL Academy-Kurs umfasst insgesamt 4 Lektionen.
Warum Berechtigungen auf Spaltenebene wichtig sind
Nicht jeder Benutzer sollte jede Spalte einer Tabelle sehen können. Eine salary-Spalte, ein password_hash oder eine credit_card_number kann in derselben Tabelle wie vollkommen öffentliche Daten wie ein Benutzername oder eine E-Mail-Adresse liegen.
Berechtigungen auf Spaltenebene ermöglichen es Ihnen, den Zugriff auf bestimmte Spalten statt auf die gesamte Tabelle zu gewähren. Dadurch bleiben sensible Daten vor Benutzern verborgen, die keinen berechtigten Grund haben, sie zu sehen.
GRANT für eine ganze Tabelle
Standardmäßig gibt GRANT SELECT ON table einer Rolle die Möglichkeit, alle Spalten zu lesen. Das ist für öffentliche Daten unproblematisch, wird aber schwierig, wenn eine Tabelle sensible und nicht sensible Spalten enthält.
Die folgende Abfrage gewährt der Rolle analyst vollständigen Lesezugriff auf die Tabelle employees — einschließlich salary und SSN.
GRANT SELECT ON employees TO analyst;GRANT-Syntax auf Spaltenebene
PostgreSQL (und der SQL-Standard) erlaubt es Ihnen, bestimmte Spaltennamen innerhalb einer GRANT-Anweisung aufzulisten. Die Syntax lautet:
GRANT privilege (col1, col2) ON table TO role;
Das folgende Beispiel gewährt der Rolle analyst die Berechtigung, nur id, name und department zu lesen — aber NICHT salary oder ssn.
GRANT SELECT (id, name, department) ON employees TO analyst;Berechtigungen auf Spaltenebene überprüfen
Sie können Berechtigungen auf Spaltenebene in PostgreSQL überprüfen, indem Sie die Sicht information_schema.column_privileges abfragen. Sie zeigt, welcher Grantee welche Berechtigung für welche Spalte besitzt.
SELECT grantee, table_name, column_name, privilege_type
FROM information_schema.column_privileges
WHERE table_name = 'employees'
ORDER BY grantee, column_name;Was ohne die richtigen Spalten passiert
Wenn eine Rolle versucht, eine Spalte zu lesen, für die ihr kein Zugriff gewährt wurde, gibt die Datenbank einen Fehler Zugriff verweigert zurück. Nur Verweise auf erlaubte Spalten sind erfolgreich.
Angenommen, analyst wurden nur id, name und department gewährt: Die erste Abfrage unten schlägt fehl, die zweite ist erfolgreich.
-- This will fail for analyst (no permission on salary):
-- SELECT id, name, salary FROM employees;
-- This succeeds:
SELECT id, name, department FROM employees;UPDATE-Berechtigung auf Spaltenebene
Beschränkungen auf Spaltenebene gelten auch für UPDATE. Sie können einer Rolle erlauben, nur bestimmte Spalten zu aktualisieren — beispielsweise einer Helpdesk-Rolle ermöglichen, den status eines Benutzers zu ändern, ohne dessen email oder password_hash ändern zu können.
GRANT UPDATE (status) ON users TO helpdesk;
-- helpdesk can now run:
UPDATE users SET status = 'suspended' WHERE id = 42;Spalten mit Views ausblenden
Ein weiterer verbreiteter Ansatz besteht darin, eine View zu erstellen, die nur die sicheren Spalten bereitstellt, und anschließend Zugriff auf die View statt auf die Basistabelle zu gewähren. Das funktioniert in allen Datenbanken, nicht nur in solchen, die GRANT auf Spaltenebene unterstützen.
CREATE VIEW public_employees AS
SELECT id, name, department, hire_date
FROM employees;
GRANT SELECT ON public_employees TO analyst;Berechtigungen auf Spaltenebene entziehen
Wie bei GRANT können Sie REVOKE mit einer Spaltenliste verwenden, um den Zugriff auf bestimmte Spalten zu entfernen. Wenn eine Rolle weitreichenden Zugriff auf Tabellenebene hatte, müssen Sie diesen möglicherweise vollständig entziehen, bevor Sie einen eingeschränkten Zugriff auf Spaltenebene gewähren.
-- Remove all SELECT on the table first
REVOKE SELECT ON employees FROM analyst;
-- Then grant only safe columns
GRANT SELECT (id, name, department) ON employees TO analyst;Spaltenberechtigungen und Row-Level Security zusammen
Berechtigungen auf Spaltenebene und Row-Level Security (RLS) ergänzen einander. RLS steuert, welche Zeilen ein Benutzer sehen kann; Berechtigungen auf Spaltenebene steuern, welche Spalten dieser Zeilen sichtbar sind.
Zusammen bilden sie eine leistungsfähige zweidimensionale Zugriffskontrolle: Beschränken Sie die Zeilenmenge UND blenden Sie sensible Felder innerhalb jeder Zeile aus.
-- RLS policy: employees can see only their own row
CREATE POLICY own_row ON employees
FOR SELECT
USING (user_id = current_user_id());
-- Column grant: hide salary even for own row
GRANT SELECT (id, name, department) ON employees TO employee_role;SECURITY-DEFINER-Funktionen verwenden
Wenn Sie eine differenziertere Logik benötigen, die über einfache Spaltenlisten hinausgeht, kann eine SECURITY DEFINER-Funktion als Brücke dienen. Die Funktion läuft mit den Berechtigungen ihres Besitzers (der vollständigen Zugriff auf alle Spalten hat) und gibt unabhängig vom Aufrufer nur die Daten zurück, die sie offenlegen soll.
CREATE OR REPLACE FUNCTION get_employee_summary(emp_id INT)
RETURNS TABLE(id INT, name TEXT, department TEXT)
SECURITY DEFINER
LANGUAGE sql AS
$$
SELECT id, name, department
FROM employees
WHERE id = emp_id;
$$;
GRANT EXECUTE ON FUNCTION get_employee_summary(INT) TO analyst;Praxisentwurf: Mehrschichtige Spaltensicherheit
Ein solides Produktionsmuster kombiniert drei Ebenen:
- Besitz der Tabelle — nur das Dienstkonto der Anwendung ist Besitzer der Basistabelle.
- Views oder GRANTs auf Spaltenebene — Leseberechtigte erhalten nur Zugriff auf nicht sensible Spalten.
- Audit-Spalten — protokollieren Sie über Trigger, welcher Benutzer wann auf sensible Daten zugegriffen hat.
Dadurch ist sichergestellt, dass die anderen Ebenen die Daten weiterhin schützen, selbst wenn eine Rolle auf einer Ebene versehentlich zu weitreichende Berechtigungen erhält.
-- Layer 1: revoke public access
REVOKE ALL ON employees FROM PUBLIC;
-- Layer 2: expose safe columns via view
CREATE VIEW employee_public AS
SELECT id, name, department, hire_date FROM employees;
GRANT SELECT ON employee_public TO reporting_role;
-- Layer 3: audit trigger logs sensitive field reads (pseudocode)
-- CREATE TRIGGER audit_salary AFTER SELECT ON employees ...Schnellcheck
Welche SQL-Anweisung gewährt der Rolle hr_viewer korrekt die Möglichkeit, nur die Spalten name und department der Tabelle employees zu lesen?
Zusammenfassung: Berechtigungen auf Spaltenebene
Berechtigungen auf Spaltenebene ermöglichen es Ihnen, den Zugriff auf einzelne Felder statt auf ganze Tabellen zu beschränken. Dadurch bleiben sensible Daten wie Gehälter, SSNs und Passwort-Hashes vor Rollen ohne entsprechende Berechtigungen verborgen.
Die wichtigsten Punkte:
- Verwenden Sie
GRANT SELECT (col1, col2) ON table TO role, um lesbare Spalten zu beschränken. - Verwenden Sie
REVOKEmit einer Spaltenliste, um den Zugriff auf bestimmte Spalten zu entfernen. - Views sind eine portable Alternative, die in allen Datenbanken funktioniert.
- Kombinieren Sie Berechtigungen auf Spaltenebene mit RLS für eine zweidimensionale Zugriffskontrolle.
- SECURITY-DEFINER-Funktionen ermöglichen eine programmgesteuerte Filterung auf Spaltenebene mit zusätzlicher Logik.
Konsequent angewendet ist die Sicherheit auf Spaltenebene eine der einfachsten und wirksamsten Methoden, um das Prinzip der geringsten Berechtigung auf Datenebene durchzusetzen.
Häufig gestellte Fragen
Ist die Lektion „Berechtigungen auf Spaltenebene“ kostenlos?
Ja — der vollständige Text von „Berechtigungen auf Spaltenebene“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des SQL Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der SQL Academy-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „Berechtigungen auf Spaltenebene“?
Sensible Spalten ausblenden Du übst SQL Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um SQL Academy zu starten?
Keine Vorkenntnisse erforderlich. SQL Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 3 von 4.
Wie lange dauert die Lektion „Berechtigungen auf Spaltenebene“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser SQL Academy-Lektion Code schreiben und ausführen?
Ja. Jede SQL Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- Rollen und Berechtigungen
- Richtlinien für Sicherheit auf Zeilenebene
- Berechtigungen auf Spaltenebene
- Zugriffe prüfen