sql >> Databáze >  >> RDS >> PostgreSQL

PostgreSQL 8.4 uděluje roli oprávnění DML na všech tabulkách

Byl bych také rád, aby tento grant vydržel pro vytváření nových tabulek i v budoucnu.[...] Prohrabal jsem se dokumentací a nemohu najít vhodné řešení.

Protože před 9.0 žádná není. Jediné, co můžete získat, je nastavit oprávnění pro existující tabulky. Musíte udělat jeden GRANT pro každou tabulku, protože před 9.0 neexistoval žádný "hromadný" režim. Podívejte se na gramatiku SQL pro 8.4 a 9.0:

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

a 9.0 zde:

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 ]

Nové ALL TABLES IN SCHEMA část je ta, která vám chybí.

Také:Nastavení oprávnění na úrovni databáze, jak je uvedeno ve vaší otázce, vám nepomůže:Oprávnění nastavíte "pouze" pro databázi, ale ne pro "obsažené" věci, jako jsou tabulky. Příslušná sekce:

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

To znamená, že můžete nastavit pouze CREATE , CONNECT a TEMP oprávnění k databázi samotné, ale žádné SELECT , INSERT atd.

Zatím k těm špatným věcem. Co můžete jsou následující věci:

  • Snižte počet správ oprávnění udělením práv nikoli uživatelům, ale rolím. Poté přidejte role jednotlivým uživatelům. Když je vytvořena nová tabulka, stačí upravit pouze jednu nebo dvě role, ale ne stovky uživatelů.

  • Vyhledejte systémové katalogy a vytvořte vhodný GRANT příkazy. Uložte je do souboru a spusťte tento soubor. To by vám mělo usnadnit spuštění.

Takový dotaz může vypadat takto:

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. Tipy pro správu zálohování pro TimescaleDB

  2. Změňte formát data pro aktuální relaci na serveru SQL Server

  3. Nastavení MySQL InnoDB Cluster s MySQL Shell (plus MySQL Router)

  4. Shell skript pro provádění příkazů pgsql v souborech