pg_dump与用户不要superadmin和大对象

时间:2014-10-15 11:37:43

标签: postgresql

我已经开始了很长时间的出口数据库,用户不是超级拉丁语。但我发现问题是在postgresql的新版本中只有superadmins可以访问大对象。

ERROR: permission denied for large object 5141

无法做到这一点:

GRANT SELECT ON ALL LARGE OBJECTS TO role_name;

我想创建一个triger,当创建一个大对象(table pg_catalog.pg_largeobject)时,给我的用户权限。但是不允许在系统目录上触发。

我得出的结论是,如果您不是超级用户,则无法导出。这是对的吗?

1 个答案:

答案 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此数据库而不会出错。