sql >> Base de Datos >  >> RDS >> PostgreSQL

postgresql 9.1 - tablas de acceso a través de funciones

Sí, esto es factible.

"superusuario" podría ser un superuser real , postgres por defecto. Cambio el nombre del rol para usuarios simples a usr , porque user es una palabra reservada, no la 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;

O puede crear roles de daemon sin inicio de sesión para poseer las funciones y mantener los derechos respectivos en la tabla. Eso sería aún más seguro.

Si vas por este camino, te amarás ALTER DEFAULT PRIVILEGES (introducido con PostgreSQL 9.0). Más detalles en esta respuesta relacionada .

Lee el capítulo Escribiendo SECURITY DEFINER Funciones seguras en el manual.