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

Udělte oprávnění pro konkrétní databázi v PostgreSQL

Základní koncept v Postgres

Role jsou globální objekty, které mohou přistupovat ke všem databázím v db clusteru – mají-li požadovaná oprávnění.

shluk obsahuje mnoho databází , které obsahují mnoho schémat . Schémata (i se stejným názvem) v různých DB spolu nesouvisí. Udělení oprávnění pro schéma se vztahuje pouze na toto konkrétní schéma v aktuální DB (aktuální DB v době udělení).

Každá databáze začíná schématem public ve výchozím stavu. To je konvence a mnoho nastavení tím začíná. Kromě toho schéma public je jen schéma jako každé jiné.

Pocházíme z MySQL a možná budete chtít začít s jediným schématem public , efektivně zcela ignoruje vrstvu schématu. Pravidelně používám desítky schémat na databázi.
Schéma jsou trochu (ale ne úplně) jako adresáře v systému souborů.

Jakmile použijete více schémat, ujistěte se, že rozumíte search_path nastavení:

  • Jak parametr search_path ovlivňuje rozlišení identifikátoru a "aktuální schéma"

Výchozí oprávnění

Podle dokumentace na GRANT :

PostgreSQL uděluje výchozí oprávnění k některým typům objektů PUBLIC . PUBLIC nejsou udělena žádná oprávnění ve výchozím nastavení na tabulky, sloupce, schémata nebo tabulkové prostory. U ostatních typů jsou výchozí privilegia udělena PUBLIC jsou následující:CONNECT a CREATE TEMP TABLE pro databáze; EXECUTE oprávnění k funkcím; a USAGE privilegium pro jazyky.

Všechny tyto výchozí hodnoty lze změnit pomocí ALTER DEFAULT PRIVILEGES :

  • Udělte vše na konkrétním schématu v databázi skupinové roli v PostgreSQL

Skupinová role

Jak poznamenal @Craig, nejlepší je GRANT oprávnění ke skupinové roli a poté učinit konkrétního uživatele členem této role (GRANT skupinová role na uživatelskou roli). Tímto způsobem je jednodušší rozdělit a zrušit svazky oprávnění potřebných pro určité úkoly.

Skupinová role je jen další role bez přihlášení. Přidejte přihlašovací jméno a převeďte jej na uživatelskou roli. Více:

  • Proč PostgreSQL sloučil uživatele a skupiny do rolí?

Předdefinované role

Aktualizace: Postgres 14 nebo novější přidává nové předdefinované role (formálně „výchozí role“) pg_read_all_data a pg_write_all_data pro zjednodušení některých níže uvedených. Viz:

  • Udělte přístup ke všem tabulkám databáze

Recept

Řekněme, že máme novou databázi mydb , skupina mygrp a uživatel myusr ...

Při připojení k dané databázi jako superuživatel (postgres například):

REVOKE ALL ON DATABASE mydb FROM public;  -- shut out the general public
GRANT CONNECT ON DATABASE mydb TO mygrp;  -- since we revoked from public

GRANT USAGE ON SCHEMA public TO mygrp;

Chcete-li přiřadit „uživateli všechna oprávnění ke všem tabulkám“ jak jsi napsal (možná bych byl restriktivnější):

GRANT ALL ON ALL TABLES IN SCHEMA public TO mygrp;
GRANT ALL ON ALL SEQUENCES IN SCHEMA public TO mygrp; -- don't forget those

Chcete-li nastavit výchozí oprávnění pro budoucí objekty, spusťte pro každou roli který vytváří objekty v tomto schématu:

ALTER DEFAULT PRIVILEGES FOR ROLE myusr IN SCHEMA public
GRANT ALL ON TABLES TO mygrp;

ALTER DEFAULT PRIVILEGES FOR ROLE myusr IN SCHEMA public
GRANT ALL ON SEQUENCES TO mygrp;

-- more roles?

Nyní udělte skupinu uživateli:

GRANT mygrp TO myusr;

Související odpověď:

  • PostgreSQL – uživatel DB by měl mít povoleno pouze volat funkce

Alternativní (nestandardní) nastavení

Pochází z MySQL a protože chcete ponechat oprávnění k databázím oddělená, mohlo by se vám líbit toto nestandardní nastavení db_user_namespace . Podle dokumentace:

Tento parametr povoluje uživatelská jména pro jednotlivé databáze. Ve výchozím nastavení je vypnuto.

Přečtěte si pozorně návod. Toto nastavení nepoužívám. Výše uvedené neruší.



  1. Jak znovu vytvořit nekonzistentní MySQL Slave?

  2. Jak vytvořit databázi na serveru SQL

  3. Používání tabulek JavaFX k organizaci dat

  4. Během instalace PostgreSQL se nezdařilo načíst moduly SQL do clusteru databáze