Důvodem je, že pro přístup k pohledu nebo tabulce potřebujete další oprávnění. Oprávnění v databázi nepokrývají přístup ke všem objektům v ní.
U funkcí je to jiné:EXECUTE oprávnění je uděleno public ve výchozím stavu. Ale funkce se provádí s oprávněními aktuálního uživatele. Možná vás bude zajímat SECURITY DEFINER modifikátor pro CREATE FUNCTION . Normálně ale stačí udělit SELECT na příslušných stolech.
Podle dokumentace o výchozích oprávněních:
V závislosti na typu objektu mohou výchozí výchozí oprávnění zahrnovat udělení některých oprávnění
PUBLIC. Výchozí hodnota je zákaz veřejného přístupu pro tabulky, sloupce, schémata a tabulkové prostory;CONNECToprávnění aTEMPoprávnění k vytváření tabulek pro databáze;EXECUTEoprávnění k funkcím; aUSAGEprivilegium pro jazyky.
Možná vás bude zajímat tento příkaz DDL (vyžaduje Postgres 9.0 nebo později):
GRANT SELECT ON ALL TABLES IN SCHEMA public TO myuser;
Samozřejmě při připojení k dané databázi (viz komentář @marcel níže) a jako uživatel s dostatečnými oprávněními. Také by vás mohlo zajímat nastavení DEFAULT PRIVILEGES :
- Udělte vše na konkrétním schématu v databázi skupinové roli v PostgreSQL
Podrobnější odpověď, jak spravovat oprávnění:
- Jak spravovat VÝCHOZÍ PRIVILEGIE pro UŽIVATELE v DATABÁZI vs. SCHÉMA?
pgAdmin má funkci pro sofistikovanější hromadné operace:

Nebo můžete zadat dotaz do systémových katalogů a vytvořit příkazy DDL pro hromadné udělení / zrušení ...