我已经开始了很长时间的出口数据库,用户不是超级拉丁语。但我发现问题是在postgresql的新版本中只有superadmins可以访问大对象。
ERROR: permission denied for large object 5141
无法做到这一点:
GRANT SELECT ON ALL LARGE OBJECTS TO role_name;
我想创建一个triger,当创建一个大对象(table pg_catalog.pg_largeobject)时,给我的用户权限。但是不允许在系统目录上触发。
我得出的结论是,如果您不是超级用户,则无法导出。这是对的吗?
答案 0 :(得分:9)
lo_compat_privileges
的文档解释了这种情况:
lo_compat_privileges (布尔值)
在9.0之前的PostgreSQL版本中,大对象没有访问权限,因此始终可读写 所有用户。将此变量设置为on将禁用新权限 检查,以便与先前版本兼容。默认为关闭。 只有超级用户才能更改此设置。
设置此变量不会禁用与大对象相关的所有安全检查 - 仅限于默认行为所具有的安全检查 在PostgreSQL 9.0中更改。例如,lo_import()和lo_export() 无论此设置如何,都需要超级用户权限。
请注意,可以使用以下命令为每个数据库设置:
ALTER DATABASE dbname SET lo_compat_privileges=on;
当lo_compat_privileges
设置为默认OFF
时,访问权限不仅限于超级用户,而是受控制的。每个大型对象都有一个所有者,该所有者拥有完整权限。可以一次(由所有者或超级用户)为每个大对象提供读取权限:
GRANT SELECT ON LARGE OBJECT loid TO rolename;
其中rolename
也可能PUBLIC
表示“所有人”,有关详细信息,请参阅GRANT。
另一方面,我不认为可以使用单个命令设置数据库的所有大型对象的权限,或者事先对尚未存在的内容设置权限,因为ALTER DEFAULT PRIVILEGES
不支持大型对象,如你所知,触发器不是一个选项。
对数据库的所有大对象具有SELECT权限的非超级用户可以pg_dump此数据库而不会出错。