1 授权
运行lo_import和lo_export函数需要超级用户权限,但是为了安全性超级用户只允许在本机访问,因此需要给lo_import和lo_export函数授权给非超级用户.
lo_import和lo_export函数授权后需要仔细地考虑安全因素。有这类特权的恶意用户可以很容易地利用它们成为超级用户(例如通过重写服务器配置文件),或者攻击该服务器文件系统的其他部分而无需获得数据库超级用户特权.因此对具有这类特权的角色访问必须受到和超级用户角色一样的仔细保护.尽管如此,如果某些例行任务需要使用服务器端的lo_import或者lo_export,使用具有这类特权的角色比使用具有完整超级用户特权的角色更加安全,因为那样会减小意外错误造成的损伤风险.
将执行lo_import和lo_export的权限授予用户test
psql -h localhost -U postgres
执行
grant execute on function lo_import(text) to test;
grant execute on function lo_export(oid,text) to test;
2 创建表
psql -h localhost -U test -d test
create table big(
objectid bigserial not null,
data bytea,
constraint pk_big_objectid primary key(objectid) with (fillfactor=80)
)with (fillfactor=80,
autovacuum_enabled=true,toast.autovacuum_enabled=true,
autovacuum_vacuum_threshold=100,autovacuum_analyze_threshold=200,
toast.autovacuum_vacuum_threshold=100);
3 插入或修改数据
确保lo_import中的目录有读取权限
psql -h localhost -U test -d test
do $$
declare
v_oid oid;
begin
select lo_import('/home/xxx/001.jpg') into v_oid;
insert into big(objectid,data) values(1,lo_get(v_oid));
--update big set data=lo_get(v_oid) where objectid=1;
PERFORM lo_unlink(v_oid);
end;
$$;
4 导出数据
确保lo_export中的目录有写入权限
psql -h localhost -U test -d test
do $$
declare
v_oid oid;
begin
select lo_from_bytea(0,(select data from big where objectid=1)) into v_oid;
PERFORM lo_export(v_oid,'/home/xxx/001_export.jpg');
PERFORM lo_unlink(v_oid);
end;
$$;