危険察知4 択難易度 応用

状況

本番 DB で、ユーザー id = 42 のメールアドレスを直す作業。作業者がエディタから DB クライアントに SQL を貼り付けた。

実行前に止めるべき点は?

-- id = 42 のメールアドレスを修正UPDATE usersSET email = 'new@example.com';WHERE id = 42;

正答

  1. SET の行末に ; があり、WHERE なしの UPDATE として全行が書き換わる
  2. email に UNIQUE 制約があると失敗するので、先に制約を確認すべき
  3. -- のコメントは MySQL では使えないので /* */ にすべき
  4. id は文字列なので '42' とクォートしないと一致しない

解説

3 行目の末尾の ; で UPDATE 文が終わるため、WHERE のない UPDATE users SET email = 'new@example.com' が実行され、全ユーザーのメールアドレスが同じ値になる。続く WHERE id = 42; は単独の文として構文エラーになるが、autocommit ならその時点で被害は確定している。UNIQUE 制約があれば偶然失敗して助かることもあるが、それに頼る話ではない。MySQL も -- の後に空白があればコメントとして扱う。

参考: www.sqlite.org

sqlupdatesemicolon

この問題を含む 危険察知 のテストを制限時間つきで解く

危険察知クイズへ