Eu sou um novato no PostgreSQL e estou configurando um novo banco de dados.
Escrevi várias funções para acesso indireto (leitura/gravação) aos dados e quero proibir todo acesso direto à tabela.
GRANT CONNECT ON DATABASE db1 TO role1;
GRANT USAGE ON SCHEMA schema1 TO role1;
REVOKE ALL ON table1 FROM role1;
GRANT ALL ON ALL FUNCTIONS IN SCHEMA schema1 TO role1;
Se eu não REVOGAR o privilégio da mesa, o acesso direto à mesa será permitido. Se eu REVOGAR o privilégio da tabela e conceder funções, os usuários acessam as funções, mas veem o erro de restrição de acesso à tabela.
psql:./test1.psql:6: ERROR: permission denied for relation table1
Como posso fazer com que o usuário role1
acesse os dados usando apenas funções, ao mesmo tempo em que não permite acesso direto à tabela? Acho que perdi alguma coisa, mas não consigo descobrir.
PS Estou usando o Postgres 9.2.x.
Você deseja criar suas funções
SECURITY DEFINER
e torná-las propriedade de um usuário que tenha os direitos necessários.Tenha muito cuidado ao codificar
SECURITY DEFINER
funções. Não os torne propriedade de um superusuário e leia o manual com atenção. Crie uma função que tenha apenas os direitos necessários e nada mais; dar-lhe a propriedade dasSECURITY DEFINER
funções. Quando apropriado, crie várias funções para diferentes níveis de acesso.Veja
CREATE FUNCTION
.