私たちのサイトの1つに似たようなものがあり、たくさんのテーブルを追加しました:
users
sites
...など
次に、たくさんのシャドウテーブルがあります:
users-shadow
sites-shadow
...など
シャドウテーブルは、変更を加えたユーザーの行が追加されていることを除いて、実際のテーブルと同じ構造になっています。したがって、最初に、データベースアクションを承認する必要があるユーザーによって変更が送信されたときに、このクエリを使用します。
REPLACE INTO users-shadow (user_mod,id,username,password,salt...) VALUES (16,50,'bob','stuff','salt'...);
明らかに、これがインジェクションに対して開かれていないことを確認してください。プリペアドステートメント など
承認されると、shadow
の行 テーブルはshadow
から削除されるだけです テーブル、user_mod
値が削除され、変更(null以外の値)が実際のテーブルに挿入されます(またはid
の場合は更新されます REPLACE
を使用して指定されます 構文)。このロジックはperlで実行するため、残念ながらSQLが手元にありません。
SQL REPLACE
であることを忘れないでください DELETE
を実行します およびINSERT
UPDATE
ではなく 。この動作を可能にするには、トリガーを修正する必要があります。
注:「承認」フラグを使用しなかった理由は、既存のレコードを修正する機能が必要だったためです。もちろん、同じ主キーを持つ複数のレコードを持つことはできませんでした。