As funções de gatilho se comportam como outras funções no que diz respeito aos privilégios. Com uma pequena exceção:
Para criar um gatilho em uma tabela, o usuário deve ter o TRIGGER
privilégio na tabela. O usuário também deve ter EXECUTE
privilégio na função de disparo.
ATUALIZAÇÃO
Após o feedback nos comentários, fiz algumas pesquisas. Há um item TODO aberto no Postgres Wiki:
Aperte as verificações de permissão do acionador
Vinculado a esta discussão nos hackers do Postgres . Atualmente, os EXECUTE
privilégios em uma função de acionamento são verificados apenas no momento da criação do acionador , mas não no tempo de execução. Portanto, revogar EXECUTE na função de gatilho não tem efeito em um gatilho depois de criado. Sua observação parece estar correta.
Isso não concede privilégios adicionais para manipular objetos. Se a função de chamada não possuir privilégios necessários para executar (partes do) corpo da função, a exceção usual será gerada. Para pavimentar o caminho, você pode tornar um usuário privilegiado OWNER
da função e usar o
SECURITY DEFINER
, conforme documentado no manual aqui . Faz com que a função seja executada com as permissões do proprietário, em vez do invocador (padrão).
Se o proprietário é um superusuário, você precisa ter cuidado extra com quem você concede o EXECUTE
privilégio e o que a função pode fazer para evitar abusos. Você pode querer
REVOKE ALL ON FUNCTION foo() FROM public;
para começar e usar SET search_path
para a função.
Certifique-se de ler o capítulo Escrevendo SECURITY DEFINER
funções com segurança .
Encontre um exemplo de código nesta resposta relacionada no SO.
SECURITY DEFINER
, eu quero umSECURITY INVOKER
. Mas parece (para a função de disparo, não para a função regular) que, usando a opção padrão (SECURITY INVOKER
), ela não age dessa maneira.