transactions - 如何在 AWS Redshift 中编写此案例的事务?

标签 transactions amazon-redshift

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

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

  • 执行CREATE TABLE AS查询并为表指定一个占位符名称。
  • DROP TABLE IF EXISTS 现有表。
  • ALTER TABLE RENAME 新创建的表。

但是,部分要求是,如果删除或重命名时出现错误,我应该能够回滚删除并仍然保留新创建的“临时”表。显然,我必须进行交易。

但是我该如何编写完整的脚本呢?我在想类似的事情......

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之前?如果我理解正确的话,通过这样做,如果删除/重命名中出现错误,即使创建命令也会回滚,对吗?因为这不是所需要的。

最佳答案

你的推理是正确的。

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

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

对我来说,正确的方法是将CREATE TABLE作为事务的一部分。

关于transactions - 如何在 AWS Redshift 中编写此案例的事务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34649001/

相关文章:

java - 关于Spring事务传播的问题

java - Spring hibernate 锁是否适用于不同机器上的其他线程?

duplicates - 如何对从AWS Kinesis Firehose到Redshift的记录进行重复数据删除?

ruby - 如何使用 ruby​​ 将单个记录写入 Redshift 数据库?

amazon-web-services - 如何使用 AWS CLI 在 Redshift 数据库上运行查询

sql - 需要mysql死锁解释

java - 与 Spring 和 Mybatis 的事务

c# - Microsoft Dynamics CRM 2013 (CRM-Webservice) 支持的交易

mysql - 使用 Pentaho 数据集成的 Amazon Redshift 到 Mysql

sql - 在 Redshift 中将数字日期时间转换为 AM PM 时间