删除大对象的权限

Dan*_*ité 6 postgresql

从 PostgreSQL 9.0 开始,每个大对象都有自己的访问权限,这些权限被授予:

GRANT { { SELECT | UPDATE } [, ...] | ALL [ PRIVILEGES ] }
  ON LARGE OBJECT loid [, ...]
  TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ]
Run Code Online (Sandbox Code Playgroud)

SELECT 权限允许以只读模式打开对象,对于 UPDATE,文档说:

 For large objects, this privilege allows writing or truncating the object.
Run Code Online (Sandbox Code Playgroud)

但是如果一个大对象属于user1,我找不到如何授予user2删除(lo_unlink)这个对象的权限。如果 user1 说GRANT UPDATE on LARGE OBJECT xyz TO user2;并且 user2 运行SELECT lo_unlink(xyz);,则会被拒绝:

 ERROR:  must be owner of large object xyz
Run Code Online (Sandbox Code Playgroud)

真的只有所有者才能删除大对象吗,或者我遗漏了什么?

我的用例是一个 db,它存储在不同 db 用户之间共享的邮箱。所有带有邮件内容的表和带有邮件附件的大对象都归一个“主”用户所有,其他用户可能会或可能不会删除消息,这取决于他们的数据库角色。

删除消息意味着删除与其相关的所有内容,包括存储在大对象中的附件。因此,非所有者应该能够删除大对象是有道理的,就像如果他已被授予对这些表的 DELETE 权限,他可以从其他表中删除一样。

Cra*_*ger 1

这与其他对象是一致的,DROP除了所有者之外,其他对象不能被 ped。不过,对于大型物体来说,这似乎有点痛苦;也许是 bug 黑客?

我会通过使用oid引用而不是 来解决这个问题lo,然后在vaccumlo删除对它们的引用后使用删除它们。