Desde o PostgreSQL 9.0, cada objeto grande tem seus próprios direitos de acesso que são concedidos com:
GRANT { { SELECT | UPDATE } [, ...] | ALL [ PRIVILEGES ] }
ON LARGE OBJECT loid [, ...]
TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ]
A permissão SELECT permite abrir o objeto em modo somente leitura, e para UPDATE, o doc diz:
For large objects, this privilege allows writing or truncating the object.
Mas se um objeto grande pertence a user1
, não consigo encontrar como conceder a permissão user2
para deletar ( lo_unlink
) este objeto. Se user1 diz GRANT UPDATE on LARGE OBJECT xyz TO user2;
e user2 executa SELECT lo_unlink(xyz);
, é negado com:
ERROR: must be owner of large object xyz
É realmente o caso de apenas o proprietário de um objeto grande poder excluí-lo ou estou perdendo alguma coisa?
Meu caso de uso é um banco de dados que armazena caixas de correio compartilhadas entre diferentes usuários do banco de dados. Todas as tabelas com conteúdo de correio e objetos grandes com anexos de correio pertencem a um usuário "mestre" e outros usuários podem ou não excluir mensagens, dependendo de sua função no banco de dados.
Excluir uma mensagem significa excluir tudo relacionado a ela, incluindo anexos armazenados em objetos grandes. Portanto, faria sentido que um não proprietário pudesse excluir objetos grandes, assim como ele pode excluir de outras tabelas se tiver o privilégio DELETE nessas tabelas.
Isso é consistente com outros objetos, que não podem ser
DROP
pedais, exceto pelo proprietário. Parece meio doloroso para objetos grandes; talvez bug-hackers?Eu contornaria isso usando
oid
referências em vez delo
e, em seguida, usandovaccumlo
para removê-las assim que as referências a elas forem removidas.