sql >> Databasteknik >  >> RDS >> PostgreSQL

PostgreSQL 8.4 ger DML-privilegier på alla tabeller till en roll

Jag skulle också vilja att det här anslaget ska bestå för att skapa nya tabeller i framtiden.[...] Jag har muddrat igenom dokumentationen och jag verkar inte hitta en lämplig lösning.

För före 9.0 finns det ingen. Allt du kan få är att ställa in behörigheterna för befintlig tabeller. Du måste göra en GRANT för varje bord, för före 9.0 fanns det inget "bulk"-läge. Se SQL-grammeraren för 8.4 och 9.0:

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

och 9.0 här:

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 ]

Den nya ALL TABLES IN SCHEMA del är den du saknar.

Dessutom:Att ställa in behörigheter på databasnivå som i din fråga hjälper dig inte:Du kommer "bara" att ställa in behörigheterna på databasen, men inte på några "innehållna" saker som tabeller. Relevant avsnitt:

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

Vilket betyder att du bara kan ställa in CREATE , CONNECT och TEMP behörigheter på själva databasen men ingen SELECT , INSERT etc.

Så långt för de dåliga grejerna. Vad du kan göra är följande saker:

  • Minska antalet behörighetshantering genom att ge rättigheter inte till användare utan till roller. Lägg sedan till roller till enskilda användare. När en ny tabell skapas behöver du bara justera en eller två roller, men inte hundratals användare.

  • Fråga i systemkatalogerna och skapa lämplig GRANT kommandon. Spara dem i en fil och kör den filen. Detta borde ge dig en enklare start.

En sådan fråga kan se ut så här:

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');


  1. (engelska) Hur man använder Oracle Database 19c Pre-Built Developer VM

  2. Topp 30 mest användbara Concurrent Manager-frågor

  3. Star Trek 3D schackdatamodell

  4. Gruppera rader med hjälp av grupp efter klausul i MySQL