Como conceder privilégios de drop table / function a uma função no PostgreSQL?

10

Desejo conceder dropprivilégios em todas as tabelas e funções (não apenas aquelas pertencentes ao usuário) em determinado esquema de um banco de dados específico para uma função específica. No entanto, GRANT ALL PRIVILEGESnão é suficiente e não achei como fazer sem tornar a função um superusuário - o superusuário tem direitos sobre outros bancos de dados no mesmo servidor, o que não é o que eu quero. Eu não me importaria de privilégios de superusuário limitados a um banco de dados específico, mas não sei como fazê-lo.

Meu código:

CREATE USER _administrator PASSWORD 'pwd12345';
CREATE ROLE administrator NOLOGIN ADMIN _administrator;

GRANT ALL PRIVILEGES ON DATABASE "myDB" TO administrator;
GRANT ALL PRIVILEGES ON SCHEMA public TO administrator;
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO administrator;
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO administrator;
GRANT ALL PRIVILEGES ON ALL FUNCTIONS IN SCHEMA public TO administrator;

administratoré o grupo de myDBadministradores de banco de dados, _administratoré a função mais poderosa que meu aplicativo cliente poderá fazer logon como.

O que eu perdi ou fiz de errado?

Pavel V.
fonte

Respostas:

11

Somente o proprietário (e os superusuários) podem soltar objetos. Por documentação:

O direito de descartar um objeto ou alterar sua definição de qualquer forma não é tratado como um privilégio concedido; é inerente ao proprietário e não pode ser concedido ou revogado. (No entanto, um efeito semelhante pode ser obtido concedendo ou revogando a participação na função que possui o objeto; veja abaixo.) O proprietário implicitamente também possui todas as opções de concessão para o objeto.

Então, faça administrator próprias tais objetos que os usuários devem ser capazes de cair.

ALTER FUNCTION foo() OWNER TO administrator;
ALTER TABLE foo      OWNER TO administrator;

E você se lembrou de realmente conceder a participação no grupo, certo?

GRANT administrator TO _administrator;
Erwin Brandstetter
fonte