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

PostgreSQL:Udělte veškerá oprávnění uživateli v databázi PostgreSQL

Všechny příkazy musí být provedeny při připojení ke správnému databázovému clusteru. Ujistěte se.

Role jsou objekty databázového klastru . Všechny databáze stejného clusteru sdílejí sadu definovaných rolí. Oprávnění se udělují / odvolávají pro každou databázi / schéma / tabulku atd.

Role potřebuje přístup k databázi , očividně. To je uděleno PUBLIC ve výchozím stavu. Jinak:

GRANT CONNECT ON DATABASE my_db TO my_user;

Základní oprávnění pro Postgres 14 nebo novější

Postgres 14 přidává předdefinované role bez přihlášení pg_read_all_data / pg_write_all_data .
Mají SELECT / INSERT , UPDATE , DELETE oprávnění pro všechny tabulky, pohledy a sekvence. Plus USAGE na schématech. Můžeme GRANT členství v těchto rolích:

GRANT pg_read_all_data TO my_user;
GRANT pg_write_all_data TO my_user;

To pokrývá všechny základní příkazy DML (ale ne DDL a ne některé speciální příkazy jako TRUNCATE nebo EXECUTE oprávnění k funkcím!). Manuál:

pg_read_all_data

Čtěte všechna data (tabulky, pohledy, sekvence), jako byste měli SELECT práva k těmto objektům a USAGE práva na všechna schémata, i když je nemají výslovně. Tato role nemá atribut roleBYPASSRLS soubor. Pokud se používá RLS, správce může chtít nastavit BYPASSRLS u rolí, u kterých je tato role GRANT ed to.

pg_write_all_data

Zapište všechna data (tabulky, pohledy, sekvence), jako byste měli INSERT ,UPDATE a DELETE práva na tyto objekty a USAGE práva na všechna schémata, a to i bez toho, že by je měli výslovně. Tato role nemá atribut role BYPASSRLS soubor. Pokud se používá RLS, správce může chtít nastavit BYPASSRLS na rolích, pro které je tato roleGRANT ed to.

Všechna oprávnění bez použití předdefinovaných rolí (jakákoli verze Postgres)

Příkazy je nutné provádět při připojení ke správné databázi. Ujistěte se.

Role potřebuje (alespoň) USAGE oprávnění na schéma . Znovu, pokud je to uděleno PUBLIC , jste kryti. Jinak:

GRANT USAGE ON SCHEMA public TO my_user;

Nebo udělte USAGE na všech vlastní schémata:

DO
$$
BEGIN
   -- RAISE NOTICE '%', (  -- use instead of EXECUTE to see generated commands
   EXECUTE (
   SELECT string_agg(format('GRANT USAGE ON SCHEMA %I TO my_user', nspname), '; ')
   FROM   pg_namespace
   WHERE  nspname <> 'information_schema' -- exclude information schema and ...
   AND    nspname NOT LIKE 'pg\_%'        -- ... system schemas
   );
END
$$;

Poté všechna oprávnění pro všechny tabulky (vyžaduje Postgres 9.0 nebo později).
A nezapomeňte na sekvence (pokud existuje):

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO my_user;
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO my_user;

Alternativně můžete pro práci s GUI použít "Grant Wizard" z pgAdmin 4.

Existují některé další objekty, manuál pro GRANT má kompletní seznam. Od Postgres 12:

oprávnění k databázovému objektu (tabulka, sloupec, pohled, cizí tabulka, sekvence, databáze, obal cizích dat, cizí server, funkce, procedura, procedurální jazyk, schéma nebo tabulkový prostor)

Zbytek je ale potřeba jen zřídka. Další podrobnosti:

  • Jak spravovat VÝCHOZÍ PRIVILEGIE pro UŽIVATELE v DATABÁZI vs. SCHÉMA?
  • Udělte oprávnění pro konkrétní databázi v PostgreSQL
  • Jak udělit všechna oprávnění k zobrazení libovolnému uživateli

Zvažte upgrade na aktuální verzi.



  1. Jak najít optimální jedinečný identifikátor v tabulce na serveru SQL Server:sp_special_columns

  2. Získat všechny názvy tabulek konkrétní databáze pomocí SQL dotazu?

  3. Optimalizace dotazu Postgres (vynucení skenování indexu)

  4. Jak LAST_DAY() funguje v MariaDB