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

Jak vytvoříte uživatele pouze pro čtení v PostgreSQL?

Přidělení použití/výběru jedné tabulce

Pokud udělíte CONNECT pouze databázi, uživatel se může připojit, ale nemá žádná další oprávnění. Musíte udělit USAGE pro jmenné prostory (schémata) a SELECT pro tabulky a pohledy jednotlivě takto:

GRANT CONNECT ON DATABASE mydb TO xxx;
-- This assumes you're actually connected to mydb..
GRANT USAGE ON SCHEMA public TO xxx;
GRANT SELECT ON mytable TO xxx;

Více tabulek/pohledů (PostgreSQL 9.0+)

V nejnovějších verzích PostgreSQL můžete udělit oprávnění ke všem tabulkám/pohledům/atd. ve schématu pomocí jediného příkazu, místo abyste je museli zadávat jeden po druhém:

GRANT SELECT ON ALL TABLES IN SCHEMA public TO xxx;

To se týká pouze tabulek, které již byly vytvořeny. Ještě výkonnější je, že v budoucnu můžete novým objektům automaticky přiřadit výchozí role:

ALTER DEFAULT PRIVILEGES IN SCHEMA public
   GRANT SELECT ON TABLES TO xxx;

Všimněte si, že ve výchozím nastavení to ovlivní pouze objekty (tabulky) vytvořené uživatelem, který zadal tento příkaz:ačkoli to lze nastavit také na jakoukoli roli, které je vystavující uživatel členem. Při vytváření nových objektů však nezískáváte výchozí privilegia pro všechny role, kterých jste členem... takže je tu stále nějaké omílání. Pokud přijmete přístup, že databáze má vlastnící roli a změny schématu se provádějí jako tato vlastnící role, měli byste této vlastnící roli přiřadit výchozí oprávnění. IMHO je to všechno trochu matoucí a možná budete muset experimentovat, abyste přišli s funkčním pracovním postupem.

Více tabulek/pohledů (verze PostgreSQL starší než 9.0)

Abyste se vyhnuli chybám při zdlouhavých změnách ve více tabulkách, doporučuje se použít následující „automatický“ proces k vygenerování požadovaného GRANT SELECT ke každé tabulce/pohledu:

SELECT 'GRANT SELECT ON ' || relname || ' TO xxx;'
FROM pg_class JOIN pg_namespace ON pg_namespace.oid = pg_class.relnamespace
WHERE nspname = 'public' AND relkind IN ('r', 'v', 'S');

To by mělo vygenerovat příslušné příkazy GRANT do GRANT SELECT na všech tabulkách, pohledech a sekvencích na veřejnosti, pro kopírování a vkládání. Přirozeně to bude aplikováno pouze na tabulky, které již byly vytvořeny.



  1. Jak nahrávat a stahovat soubory PHP a MySQL

  2. Zobrazení MySQL

  3. Jak zabránit tomu, aby PDO interpretovalo otazník jako zástupný symbol?

  4. Snažím se zkopírovat soubor, ale zobrazuje se chybová zpráva