如何在 AWS Redshift 中为这种情况编写事务?

How do I write a transaction for this case in AWS Redshift?

我将首先描述场景,因为我可能会使问题过于复杂,如果是这样,我将删除问题。

我是运行一个每天重新创建table一次的脚本。由于创建的性质,必须删除现有的 table,然后创建新的 table。过程基本是这样的:

然而,部分要求是,如果在删除或重命名时出现错误,我应该能够回滚删除并仍然保留新创建的 "temporary" table。显然,我必须要有一笔交易。

不过,如何编写完整的脚本?我在想……

CREATE TABLE target_temp AS SELECT * FROM src;
BEGIN;
DROP TABLE IF EXISTS target;
ALTER TABLE target_temp RENAME TO target
COMMIT;

或者我应该将 BEGIN; 移到 CREATE TABLE 之前吗?如果我理解正确的话,这样做,如果 drop/rename 中有错误,即使创建命令也会回滚,对吗?因为这不是必需的。

你的推理是正确的。

由于 Redshift 支持事务性 DDL 语句,因此它将按预期工作。我的意思是失败事务中的所有内容都将回滚。

老实说...提出的要求似乎没有任何意义。保留临时 table 的原因可能是什么?

对我来说,正确的做法是将 CREATE TABLE 部分作为交易的一部分。