危険察知4 択難易度 標準

状況

ユーザー 1024 のアカウントだけをロックする。作業者がテンプレートの SQL を書き換えたが、値を入れ忘れている。

安全に直したものは?

UPDATE accounts SET locked = 1 WHERE user_id = user_id;

正答

  1. UPDATE accounts SET locked = 1 WHERE user_id = "user_id";
  2. UPDATE accounts SET locked = 1 WHERE user_id = 1024;
  3. UPDATE accounts SET locked = 1 WHERE user_id = user_id AND locked = 0;
  4. UPDATE accounts SET locked = 1 WHERE 'user_id' = 1024;

解説

user_id = user_id は NULL でない限りすべての行で真になり、全アカウントがロックされる。正しくは右辺に値 1024 を書く。"user_id" とダブルクォートで囲むと SQL では列名として扱われるので、元の誤りと同じく全行が対象になる。locked = 0 を足しても対象が「まだロックされていない全員」になるだけ。'user_id' = 1024 は文字列と数値の比較で常に偽になり、1 行も変わらない。

参考: www.sqlite.org

sqlupdatewhere

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

危険察知クイズへ