Ano, je to proveditelné.
"superuser" může být skutečný superuser
, postgres
ve výchozím nastavení. Přejmenuji roli pro běžné uživatele na usr
, protože user
je vyhrazené slovo – nepoužívejte jej jako identifikátor.
CREATE ROLE usr;
CREATE ROLE poweruser;
GRANT usr TO poweruser; -- poweruser can do everything usr can.
CREATE ROLE bob PASSWORD <password>;
GRANT poweruser TO bob;
CREATE ROLE alice PASSWORD <password>;
GRANT usr TO alice;
REVOKE ALL ON SCHEMA x FROM public;
GRANT USAGE ON SCHEMA x TO usr;
REVOKE ALL ON TABLE x FROM public;
REVOKE ALL ON TABLE y FROM public;
CREATE FUNCTION
...
SECURITY DEFINER;
REVOKE ALL ON FUNCTION ... FROM public;
GRANT EXECUTE ON FUNCTION a TO usr;
GRANT EXECUTE ON FUNCTION b TO poweruser;
Nebo můžete vytvořit role démona bez přihlášení, abyste vlastnili funkce a měli příslušná práva na stole. To by bylo ještě bezpečnější.
Pokud se vydáte touto cestou, budete milovat ALTER DEFAULT PRIVILEGES
(představeno s PostgreSQL 9.0). Další podrobnosti v této související odpovědi
.
Přečtěte si kapitolu Psaní SECURITY DEFINER
Funguje bezpečně
v návodu.