MySQL では、alter table/create table/etc などの ddl ステートメントが暗黙的なトランザクション コミットを引き起こすことを知っています。
PostgreSQL に移行しているため、複数の DDL ステートメントをトランザクションでラップすることは可能ですか?
これにより、移行スクリプトがより堅牢になり、DDL の変更に失敗すると、すべてがロールバックされます。
MySQL では、alter table/create table/etc などの ddl ステートメントが暗黙的なトランザクション コミットを引き起こすことを知っています。
PostgreSQL に移行しているため、複数の DDL ステートメントをトランザクションでラップすることは可能ですか?
これにより、移行スクリプトがより堅牢になり、DDL の変更に失敗すると、すべてがロールバックされます。
DDL ステートメントは、トランザクションによってカバーされます。公式ドキュメントに関連するセクションが見つかりませんが、それをカバーする wiki へのリンクを提供しています。
トランザクションは postgresql では自動的に開かれないことに注意してください。BEGIN
またはで開始する必要がありますSTART TRANSACTION
。
すべての Postgres DDL ステートメントをトランザクションでラップできるわけではありません。DROP DATABASE
/などのステートメントDROP TABLESPACE
や、その他のファイル システム関連のステートメントはロールバックできません。
また:
ALTER TYPE ... ADD VALUE (列挙型に新しい値を追加するフォーム) は、トランザクション ブロック内では実行できません。
TRUNCATE
また、 「MVCC 保存ではない」などのステートメントもあります。その種のステートメントによって行われた変更は、ロールバックされたとしても、他のクエリに影響を与える可能性があります。
そのため、お使いのバージョンの postgres の公式マニュアルを読んで、DDL がトランザクション セーフかどうかを確認してください。