状況
本番の料金マスタを 1 件直す作業。psql(既定は autocommit)で行う手順書を読み合わせている。
ダブルチェッカーとして最初に止めるべき点は?
1. psql -h db-prd-01 -U ops app_prod で接続する2. UPDATE plans SET price = 1200 WHERE id = 3;3. SELECT id, price FROM plans WHERE id = 3; で値を確認する4. 問題なければ COMMIT; 問題があれば ROLLBACK;正答
- 3 の確認は COMMIT の後に行わないと、変更後の値が見えない
- price は文字列として '1200' と書かないと型エラーになる
- BEGIN がないので 2 の時点で確定し、4 の ROLLBACK では戻せない
- ops ユーザーでは UPDATE できないので postgres で接続すべき
解説
psql は既定で autocommit なので、BEGIN を実行しないと各文がその場で確定する。この手順では 2 の UPDATE が即座に確定し、3 で誤りに気づいても 4 の ROLLBACK は「進行中のトランザクションがない」という警告を出すだけで何も戻らない。手順書が「戻せるつもり」で書かれているのが一番危ない。自分の接続では COMMIT 前でも変更後の値が見えるので 1 番目は誤り。数値列に数値リテラルを書くのは正しい。
この問題を含む 危険察知 のテストを制限時間つきで解く
危険察知クイズへ