http://www.postgresql-support.de

Rechte auf Tabellen

Im folgenden Beispiel legen wir als Benutzer 'hs' die Tabelle 't_author' an:

test=# CREATE TABLE t_author (id int4, name text);
CREATE TABLE
test=# REVOKE ALL ON t_author FROM autor;
REVOKE

Mit REVOKE ALL entziehen wir dem Nutzer alle Rechte auf eine Tabelle. Das führt dazu, dass dieser Benutzer nicht mehr in der Lage ist, Daten aus der Tabelle abzufragen:

test=> SELECT current_user;
 current_user
--------------
 autor
(1 row)

test=> SELECT * FROM t_author;
ERROR:  permission denied for relation t_author

REVOKE ALL entzieht dem Benutzer alle Rechte - es kann jedoch sein, dass man etwas selektiver vorgehen will. PostgreSQL unterstützt sieben verschiedene Rechte:

Im Vergleich zu Oracle ist die Rechteliste von PostgreSQL geradezu lächerlich. Diese Schlichtheit hat aber auch gigantische Vorteile: Die Konfiguration einer 'sicheren' Datenbank geht sehr schnell von der Hand. Der Benutzer muss dabei nicht auf sinnvolle Features verzichten - erspart sich aber auch die Notwendigkeit, sich in der Vielzahl der Konfigurationsmöglichkeiten zu verirren.

Wollen wir dem Benutzer die Rechte wieder zurückgeben, können wir GRANT verwenden:

test=# \h GRANT
Command:     GRANT
Description: define access privileges
Syntax:
GRANT { { SELECT | INSERT | UPDATE | DELETE | RULE | REFERENCES | TRIGGER }
    [,...] | ALL [ PRIVILEGES ] }
    ON [ TABLE ] tablename [, ...]
    TO { username | GROUP groupname | PUBLIC } [, ...] [ WITH GRANT OPTION ]

GRANT { { CREATE | TEMPORARY | TEMP } [,...] | ALL [ PRIVILEGES ] }
    ON DATABASE dbname [, ...]
    TO { username | GROUP groupname | PUBLIC } [, ...] [ WITH GRANT OPTION ]

GRANT { EXECUTE | ALL [ PRIVILEGES ] }
    ON FUNCTION funcname ([type, ...]) [, ...]
    TO { username | GROUP groupname | PUBLIC } [, ...] [ WITH GRANT OPTION ]

GRANT { USAGE | ALL [ PRIVILEGES ] }
    ON LANGUAGE langname [, ...]
    TO { username | GROUP groupname | PUBLIC } [, ...] [ WITH GRANT OPTION ]

GRANT { { CREATE | USAGE } [,...] | ALL [ PRIVILEGES ] }
    ON SCHEMA schemaname [, ...]
    TO { username | GROUP groupname | PUBLIC } [, ...] [ WITH GRANT OPTION ]

GRANT { CREATE | ALL [ PRIVILEGES ] }
    ON TABLESPACE tablespacename [, ...]
    TO { username | GROUP groupname | PUBLIC } [, ...] [ WITH GRANT OPTION ]

Wenn wir also dem Benutzer 'autor' das Recht 'SELECT' zurückgeben wollen, führen wir als User 'hs' das folgende Statement durch:

test=# GRANT SELECT ON t_author TO autor;
GRANT

Obwohl die Tabelle leer ist, wird PostgreSQL einen Fehler werfen:

test=> UPDATE t_author SET id = id + 1;
ERROR:  permission denied for relation t_author

Wir haben dem Benutzer zwar das Recht 'SELECT' zugewiesen - auf das Recht 'UPDATE' haben wir allerdings verzichtet.

http://www.postgresql.at