お世話になっております。
postgresqlやAmazon Redshiftを対象に、データ出力ツールによるバルクロード後のPost-SQLが意図通りに動作しません。
知見をお持ちの方がいらっしゃいましたら、アドバイス頂けますと幸いです。
背景:
データ出力ツールでは次のような処理を行っております。
(1) Pre-SQL: truncate table tb1;
(2) バルクロード: tb1テーブルに対して、データをバルクロード。
(3) Post-SQL: tb1テーブルを使用してtb2のデータをdelete from し、tb2テーブルにtb1データを加工しながらinsert into。(トランザクション処理)
上記の(3)では以下のようなことを行っております。
start transaction;
delete from tb2 where exists ( select 1 fom tb1 where <条件> );
insert into tb2 select <加工処理> from tb1;
commit;
詳細:
(3)にbegin transaction; ~ commit; を記載しておりますが、
Alteryx DesignerのPost-SQLで実行すると、start transaction; が認識されていないのか、後続処理の「insert into tb2 select <加工処理> from tb1;」で変換エラーが発生した場合、ロールバックされない状況です。
※Amazon Redshift、Postgresqlともに同様の挙動を示しています。
またDbeaverなどSQLクライアントより、(3)のSQLステートメントを実行すると意図通りに動くことを確認しています。
Alteryx DesignerのPost-SQLから、start transaction; ~ commit;で記載したSQLステートメントを
SQLエラー発生時でも正しく実行するために何か特別な設定が必要なのかと思いご相談させて頂きました。
よろしくお願いいたします。
<添付図>
Amazon Redshiftのクエリ履歴(stl_query)を確認すると、
Alteryx Designerから実行した場合は、Redshiftでは同一プロセスIDで処理されていますが、異なるトランザクションIDとなっております。
Amazon Redshiftに対して、(3)について挙動確認SQL文を投げた結果になります。
3~5行目はSQLクライアントから手動実行した結果で、同一トランザクションID(XID)になっております。
8~10行目は、Alteryx Designer - PostSQLから実行した結果で、XIDが異なる値になっております。
-- 検証用の簡易SQLステートメント
start transaction;
insert into tb1 values (値); ※成功
insert into tb1 values (値); ※成功
insert into tb1 values (値); ※成功
insert into tb1 values (値); ※エラー
commit;
<その他>
Amazon Redshiftのみで動作確認しておりますが
上記(3)の処理を、ストアドプロシージャ化(NONATOMIC)して
Alteryx Designer PostSQLからプロシージャーをcallする形を取れば、意図通りの結果を得ることができております。