2016-01-07 47 views
1

我会先介绍一下这个场景,因为我可能会让问题过于复杂,如果是的话,我会删除这个问题。如何在AWS 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; 

或者我应该CREATE TABLE前移到BEGIN;来?如果我理解正确,通过这样做,如果drop/rename中存在错误,即使create命令也会回滚,对吗?因为这不是必需的。

回答

2

您的推理是正确的。

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

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

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

+1

接受此答案和+1。我知道这很简单,但我必须小心。是的,我同意你的看法。但是,我几乎没有对企业如何要求其流程表现出任何意见。由于每天都有可能检查表格,我想这样做可以正常工作。然而,一个可预见的问题是,如果删除/重命名失败,并且临时表会持续到第二天,这肯定会在重新创建时导致错误。但是,针对'pg_table_def'的检查将避免这种情况。这是我必须承认的,我们所说的整个过程都是错综复杂的。 :) – Manhattan