CakePHP3のsave()は、主キーが一致する既存のレコードがあるか調べて
あればUPDETE、なければINSERTという動きになりますが、
INSERTするつもりで既存のレコードを上書きしてしまう事故を防ぐために
save()をINSERTに固定したいです。
システムとしてはデータの更新も必要ですのでUPDATEを禁止するわけではなく、
データを挿入する場面では「明示的にINSERTを指定したい」という感じです。
「アップデート処理時のバリデートを常にfalseを返すようにしてみる」
https://qiita.com/ikenji/items/63404023740aa1183306
検索して上記のページを見つけましたが、常にUPDATE禁止になってしまいますし
バリデートで実現というのもしっくりきません。
何か良い方法があったら教えてください。
よろしくお願いします。
追記です(11/14)
- レアケースなのでなるべくわざわざロックはしたくないです。
(主キーかぶりのときはエラー画面になれば十分。データの破壊だけは避けたい。)
- システムとしてはデータの更新も必要ですので対象のTableクラスでUPDATEは禁止したくないです。
(「UPDATE禁止のTableクラス」「UPDATE禁止じゃないTableクラス」の2つ作るってのも
微妙ですよねぇ…)
- 「INSERTするつもりで既存のレコードを上書きしてしまう事故」は
次の2パターンを想定しています。
- 新しいレコードの主キーを発行する仕組みにバグがあり
重複した主キーが発行されてしまった場合、既存データが破壊されてしまう。
0. 新しいレコードの主キーを「既存の最大ID+1」で発行する場合において、
アクセスが集中し2つのリクエストで同一主キーが発行されると
先にINSERTされたレコードが上書きされてしまう。
回答5件
あなたの回答
tips
プレビュー