postgresql pg_dump没有模式名

k4ymrczo  于 5个月前  发布在  PostgreSQL
关注(0)|答案(6)|浏览(78)

pg_dump 10.3版开始将模式名显式添加到表名中。

INSERT INTO table (id) VALUES (1);

字符串
现在

INSERT INTO public.table (id) VALUES (1);


我的问题是,我把它转储到一个没有模式名的mariadb中。

wqnecbli

wqnecbli1#

如果您只关心XML语句,就像我一样,那么我相信这是安全的,并将从表中删除“public”模式。

sed -i -e 's/^INSERT INTO public\./INSERT INTO /' <filename.sql>

字符串
它会修改文件的位置,所以要小心。

ipakzgxi

ipakzgxi2#

我也搜索了这个切换器,它不存在。这个行为是因为这个-https://wiki.postgresql.org/wiki/A_Guide_to_CVE-2018-1058:_Protect_Your_Search_Path而添加的
在我的工作中,我现在使用dump的新变体,在事务中重命名模式。

bt1cpqcv

bt1cpqcv3#

pg_dump源中添加几个modifications,您可以恢复以前的行为,使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


这种方法比模式匹配更鲁棒,并且避免了误报的风险。

gstyhher

gstyhher4#

当然这只是Linux决定(不是postgres),但我想这对你有帮助

sed -i 's/public.//g' your_dmp_file

字符串
P.S.我没有检查这个,也许你应该修复它

2w2cym1i

2w2cym1i5#

如果你已经安装了Docker,你可以做一个技巧:

docker run -it postgres:10.2 pg_dump postgresql://user:pass@host/database

字符串

hiz5n14c

hiz5n14c6#

在postgresql控制台(连接到数据库)中执行以下命令:

set search_path to public;

字符串

相关问题