pg_read_file() 是一个用于读取本地文件系统上文本文件内容的系统函数。
pg_read_file() 在 PostgreSQL 8.1 中添加。
用法
在 PostgreSQL 15 及更早版本
pg_read_file (filenametext[,offsetbigint,lengthbigint[,missing_okboolean]] )
→text
在 PostgreSQL 16 及更高版本
pg_read_file (filenametext[,offsetbigint,lengthbigint][,missing_okboolean] )
→text
pg_read_file() 可用于返回本地文件系统中 postgres 系统用户有权访问的任何文本文件的内容。
请注意,要将结构化数据文件读入表,COPY 命令和 file_fdw 外部数据包装器将提供更方便高效的接口。
权限
默认情况下,pg_read_file() 仅限于超级用户使用,但其他用户可以被授予 EXECUTE 权限来运行此函数。
Source
pg_read_file() 实现在 src/backend/utils/adt/genfile.c。
变更历史
- PostgreSQL 16
- 可以按以下方式调用
pg_read_file ((提交 283129e3)filenametext,missing_okboolean)
- 可以按以下方式调用
- PostgreSQL 9.1
- 能够读取整个文件,而不是指定的部分(提交 03db44ea)
- PostgreSQL 8.1
- 添加(提交 b609695b)
示例
读取 PostgreSQL 实例的 postmaster.pid 文件
postgres=# SELECT pg_read_file(current_setting('data_directory') || '/postmaster.pid');
pg_read_file
---------------------
3568221 +
/var/lib/pgsql/data+
1608776039 +
5432 +
/tmp +
* +
113475654 37224658+
ready +
(1 row)
尝试读取一个不存在的文件
postgres=# SELECT pg_read_file('/foo/bar.txt');
ERROR: could not open file "/foo/bar.txt" for reading: No such file or directory
尝试读取一个权限不可用的文件
postgres=# SELECT pg_read_file('/root/password.txt');
ERROR: could not open file "/root/password.txt" for reading: Permission denied
尝试读取二进制文件可能会导致某种编码错误
postgres=# SELECT pg_read_file(current_setting('data_directory') || '/global/pg_control');
ERROR: invalid byte sequence for encoding "UTF8": 0xb9
参考资料
- PostgreSQL 文档: 通用文件访问函数
