PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

postgresql 9.1 - acessar tabelas através de funções


Sim, isso é factível.

"superusuário" pode ser um superuser real , postgres por padrão. Eu renomeio a função para usuários simples para usr , porque user é uma palavra reservada - não a use como identificador.
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;

Ou você pode criar funções de daemon sem login para possuir as funções e manter os respectivos direitos na tabela. Isso seria ainda mais seguro.

Se você está indo por esse caminho, você vai amar ALTER DEFAULT PRIVILEGES (introduzido com o PostgreSQL 9.0). Mais detalhes nesta resposta relacionada .

Leia o capítulo Escrevendo SECURITY DEFINER Funciona com segurança no manual.