状況
ユーザー 1024 のアカウントだけをロックする。作業者がテンプレートの SQL を書き換えたが、値を入れ忘れている。
安全に直したものは?
UPDATE accounts SET locked = 1 WHERE user_id = user_id;正答
- UPDATE accounts SET locked = 1 WHERE user_id = "user_id";
- UPDATE accounts SET locked = 1 WHERE user_id = 1024;
- UPDATE accounts SET locked = 1 WHERE user_id = user_id AND locked = 0;
- 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
この問題を含む 危険察知 のテストを制限時間つきで解く
危険察知クイズへ