0

我正在使用 shellscript 活动通过 AWS Datapipeline 连接到 postgressql DB。我必须删除 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 语句并复制。如果复制失败,那么我编写了回滚逻辑,否则提交并结束。这里有什么问题?

4

1 回答 1

1

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

我会使用“这里的文件”:

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

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

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

于 2020-12-23T05:36:36.370 回答