pg_read_file()
是一个用于读取本地文件系统上文本文件内容的系统函数。
pg_read_file()
在 PostgreSQL 8.1 中添加。
用法
在 PostgreSQL 15 及更早版本中
pg_read_file (filename
text
[,offset
bigint
,length
bigint
[,missing_ok
boolean
]] )
→text
在 PostgreSQL 16 及更高版本中
pg_read_file (filename
text
[,offset
bigint
,length
bigint
][,missing_ok
boolean
] )
→text
pg_read_file()
可用于返回本地文件系统上 postgres
系统用户有权访问的任何文本文件的内容。
请注意,对于将结构化数据文件读取到表中,COPY
命令和 file_fdw
外部数据包装器将提供更方便和高效的接口。
权限
默认情况下,pg_read_file()
仅限超级用户使用,但可以授予其他用户执行此函数的 EXECUTE
权限。
源代码
pg_read_file()
在 src/backend/utils/adt/genfile.c 中实现。
更改历史
- PostgreSQL 16
- 可以调用为
pg_read_file (
(提交 283129e3)filename
text
,missing_ok
boolean
)
- 可以调用为
- 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 文档: 通用文件访问函数