状況
本番 DB で、ユーザー id = 42 のメールアドレスを直す作業。作業者がエディタから DB クライアントに SQL を貼り付けた。
実行前に止めるべき点は?
-- id = 42 のメールアドレスを修正UPDATE usersSET email = 'new@example.com';WHERE id = 42;正答
- SET の行末に ; があり、WHERE なしの UPDATE として全行が書き換わる
- email に UNIQUE 制約があると失敗するので、先に制約を確認すべき
- -- のコメントは MySQL では使えないので /* */ にすべき
- id は文字列なので '42' とクォートしないと一致しない
解説
3 行目の末尾の ; で UPDATE 文が終わるため、WHERE のない UPDATE users SET email = 'new@example.com' が実行され、全ユーザーのメールアドレスが同じ値になる。続く WHERE id = 42; は単独の文として構文エラーになるが、autocommit ならその時点で被害は確定している。UNIQUE 制約があれば偶然失敗して助かることもあるが、それに頼る話ではない。MySQL も -- の後に空白があればコメントとして扱う。
参考: www.sqlite.org
この問題を含む 危険察知 のテストを制限時間つきで解く
危険察知クイズへ