sql >> Database teknologi >  >> RDS >> PostgreSQL

PostgreSQL 8.4 giver DML-privilegier på alle tabeller til en rolle

Jeg vil også gerne have, at denne bevilling fortsætter til oprettelse af nye bord også i fremtiden.[...] Jeg har mudret gennem dokumentationen, og jeg kan tilsyneladende ikke finde en passende løsning.

For før 9.0 er der ingen. Det eneste du kan få er at indstille tilladelserne for eksisterende tabeller. Du skal gøre én GRANT for hvert bord, for før 9.0 var der ingen "bulk"-tilstand. Se SQL-grammeren for 8.4 og 9.0:

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

og 9.0 her:

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 nye ALL TABLES IN SCHEMA del er den, du mangler.

Også:At indstille tilladelser på databaseniveau som i dit spørgsmål hjælper dig ikke:Du vil "kun" indstille tilladelserne på databasen, men ikke på nogen "indeholdt" ting som tabeller. Det relevante afsnit:

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

Hvilket betyder, at du kun kan indstille CREATE , CONNECT og TEMP tilladelser på selve databasen, men ingen SELECT , INSERT osv.

Så langt for de dårlige ting. Hvad du kan gøre er følgende ting:

  • Reducer antallet af tilladelsesadministrationer ved at give rettigheder ikke til brugere, men til roller. Tilføj derefter roller til individuelle brugere. Når en ny tabel oprettes, behøver du kun at justere en eller to roller, men ikke hundredvis af brugere.

  • Forespørg i systemkatalogerne og opret passende GRANT kommandoer. Gem dem i en fil, og kør den fil. Dette burde give dig en lettere opstart.

Sådan en forespørgsel kan se sådan ud:

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. Flyt systemdatabaser i SQL Server Failover Cluster

  2. Oracle PL/SQL:DBMS_SCHEDULER.CREATE_JOB Eksempel

  3. JSON_ARRAYAGG() – Opret et JSON-array fra rækkerne af en forespørgsel i MySQL

  4. Sådan returneres output fra lagret procedure til en variabel i sql-server