PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

PostgreSQL 8.4 gewährt einer Rolle DML-Berechtigungen für alle Tabellen

Ich möchte auch, dass diese Bewilligung auch in Zukunft für die Erstellung neuer Tabellen gilt.[...] Ich habe die Dokumentation durchforstet und kann anscheinend keine passende Lösung finden.

Denn vor 9.0 gibt es keine. Alles, was Sie bekommen können, ist, die Berechtigungen für vorhandene festzulegen Tische. Sie müssen einen GRANT machen für jede Tabelle, denn vor 9.0 gab es keinen "Bulk"-Modus. Siehe die SQL-Grammatik für 8.4 und 9.0:

GRANT { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | TRIGGER }
    [,...] | ALL [ PRIVILEGES ] }
    ON [ TABLE ] tablename [, ...]
    TO { [ GROUP ] rolename | PUBLIC } [, ...] [ WITH GRANT OPTION ]

und 9.0 hier:

GRANT { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | TRIGGER }
    [,...] | ALL [ PRIVILEGES ] }
    ON { [ TABLE ] table_name [, ...]
         | ALL TABLES IN SCHEMA schema_name [, ...] }
    TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ]

Das neue ALL TABLES IN SCHEMA Teil ist der, den Sie vermissen.

Außerdem:Das Festlegen von Berechtigungen auf Datenbankebene wie in Ihrer Frage wird Ihnen nicht helfen:Sie werden "nur" die Berechtigungen für die Datenbank festlegen, aber nicht für "enthaltene" Dinge wie Tabellen. Der relevante Abschnitt:

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

Das heißt, Sie können nur CREATE setzen , CONNECT und TEMP Berechtigungen für die Datenbank selbst, aber kein SELECT , INSERT usw.

So weit zu den schlechten Sachen. Was Sie tun können sind die folgenden Dinge:

  • Reduzieren Sie die Anzahl der Berechtigungsverwaltungen, indem Sie Rechte nicht an Benutzer, sondern an Rollen vergeben. Fügen Sie dann einzelnen Benutzern Rollen hinzu. Wenn eine neue Tabelle erstellt wird, müssen Sie nur eine oder zwei Rollen anpassen, aber nicht Hunderte von Benutzern.

  • Fragen Sie die Systemkataloge ab und erstellen Sie den entsprechenden GRANT Befehle. Speichern Sie sie in einer Datei und führen Sie diese Datei aus. Dies sollte Ihnen den Start erleichtern.

Eine solche Abfrage könnte wie folgt aussehen:

select 'GRANT ALL ON ' || table_schema || '.' || table_name ||' to my_group;' 
from information_schema.tables 
where 
    table_type = 'BASE TABLE' and 
    table_schema not in ('pg_catalog', 'information_schema');