从 PostgreSQL 9.0 开始,每个大对象都有自己的访问权限,这些权限被授予:
GRANT { { SELECT | UPDATE } [, ...] | ALL [ PRIVILEGES ] }
ON LARGE OBJECT loid [, ...]
TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ]
SELECT 权限允许以只读模式打开对象,对于 UPDATE,文档说:
For large objects, this privilege allows writing or truncating the object.
但是如果一个大对象属于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
真的只有大对象的所有者才能删除它,还是我遗漏了什么?
我的用例是一个数据库,它存储在不同数据库用户之间共享的邮箱。所有包含邮件内容的表和包含邮件附件的大对象都归“主”用户所有,其他用户可能会也可能不会删除邮件,具体取决于他们的数据库角色。
删除邮件意味着删除与其相关的所有内容,包括存储在大型对象中的附件。因此,非所有者应该能够删除大对象是有道理的,就像如果他被授予对这些表的 DELETE 特权,他可以从其他表中删除一样。
DROP
这与其他对象一致,除了所有者之外,这些对象不能被ped。不过,对于大型物体来说,这似乎有点痛苦。也许是错误黑客?我将通过使用
oid
引用而不是 来解决此问题lo
,然后vaccumlo
在删除对它们的引用后使用来删除它们。