PostgreSQL将文件或图片写入数据库(lo_import、lo_export)

本文介绍了如何为lo_import和lo_export函数授权,并详细说明了创建包含大型对象的表、插入或修改数据以及导出数据的过程。同时强调了授权后的安全注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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;
$$;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kmblack1

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值