pg_dump 版本 10.3 开始将模式名称显式添加到表名称中。那么以前是怎样的
INSERT INTO table (id) VALUES (1);
现在
INSERT INTO public.table (id) VALUES (1);
如何将其关闭?我的问题是,我将其转储到没有模式名称的 mariadb 中。
如果您像我一样只关心 INSERT 语句,那么我相信这是安全的,并且会从您的表中删除“公共”模式。
sed -i -e 's/^INSERT INTO public\./INSERT INTO /' <filename.sql>
它会就地修改文件,所以要小心。
我也搜索过这个切换器,但它不存在。 添加此行为的原因是 - https://wiki.postgresql.org/wiki/A_Guide_to_CVE-2018-1058:_Protect_Your_Search_Path
在我的工作中,我现在使用转储的新变体,并在事务中重命名模式。
通过对 pg_dump
源进行一些
修改,您可以恢复以前的行为,使得
INSERT
语句不包含架构名称。
要使用这些更改构建 Docker 映像,请创建一个包含以下内容的
Dockerfile
:
FROM alpine:latest
WORKDIR /usr/src/postgresql
RUN apk add --no-cache \
alpine-sdk \
perl \
readline-dev \
zlib-dev \
bison \
flex \
git \
coreutils \
linux-headers \
util-linux-dev
RUN git clone \
--depth 1 \
--branch feat/schema-less-pg-dump-11 \
https://github.com/tindzk/postgres.git .
RUN ./configure && make
RUN cp src/bin/pg_dump/pg_dump /usr/bin/ && \
cp ./src/interfaces/libpq/libpq.so* /usr/lib/
RUN apk del alpine-sdk \
&& rm -rf /var/cache/apk/* /usr/src/postgresql
CMD ["pg_dump"]
然后,按如下方式使用:
docker build -t pgdump-11 .
docker run \
-e PGPASSWORD=$db_password \
-v "$(pwd)":/data/ \
pgdump-11 \
pg_dump \
--verbose \
"postgres://$db_user@$db_host:$db_port/$db_name" \
--schema $db_schema \
--file /data/dump.sql
这种方法比模式匹配更稳健,并且避免了误报的风险。
当然这只是linux的决定(不是postgres),但我想它对你有帮助
sed -i 's/public.//g' your_dmp_file
P.s.我没有检查这个,也许你应该修复它
如果你安装了 Docker,你可以做一个技巧:
docker run -it postgres:10.2 pg_dump postgresql://user:pass@host/database
在 postgresql 控制台(连接到数据库)中执行此命令:
set search_path to public;