通过从远程客户端连接的 psql 使用多个 sql 查询

问题描述

我使用 shellscript 活动通过 AWS Datapipeline 连接到 postgressql 数据库。我必须删除60个表的数据并将数据从文件复制到表中。当复制作业失败时,我想将表回滚到以前的状态,以便表不会为空。我正在尝试使用如下多个 psql 语句执行此操作,但回滚未按预期工作。当其中一个文件出现错误且复制语句失败时,该表将被删除且为空。但是,我想把它回滚到以前的状态。

'psql -h $2 -d $3 -U $4 -p $7 -c "BEGIN;"
psql -h $2 -d $3 -U $4 -p $7 -c "Delete  from  $var1;"

psql -h $2 -d $3 -U $4 -p $7 -c "\copY $var1 FROM '$f' csv header;"
VAR3=$?
    echo "$VAR3"
if [ $VAR3 -gt 0 ];
then 
psql -h $2 -d $3 -U $4 -p $7 -c "ROLLBACK;"
else
psql -h $2 -d $3 -U $4 -p $7 -c "COMMIT;"
fi
psql -h $2 -d $3 -U $4 -p $7 -c "END;"'

这是复制命令返回错误时的标准输出日志。

开始 删除 560 1 回滚 提交

我用Begin开始事务,然后是Delete语句并复制。如果复制失败,那么我编写了回滚其他提交和结束的逻辑。这里有什么问题?

解决方法

每个 psql 调用都会创建自己的数据库连接。但是数据库事务始终是单个数据库连接的一部分,因此您不能在一个 psql 调用中启动事务并在另一个调用中结束它。一个。

我会使用“此处的文档”:

psql <<EOF
BEGIN;
...
COMMIT;
EOF

对于条件处理,您可以使用最近 \if 版本的 psql 功能。

确保此处文档中没有制表符,它们可能会导致令人惊讶的行为。