Имаме нещо подобно на един от нашите сайтове, добавихме куп таблици:
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
стойността е отпаднала и промените (ненулеви стойности) са вмъкнати в реалната таблица (или актуализирани, ако id
е посочен, като се използва ЗАМЕНЯНЕ
синтаксис). Ние правим тази логика в perl, така че за съжаление нямаме под ръка SQL за нея.
Запомнете този SQL REPLACE
прави DELETE
и INSERT
вместо UPDATE
. Ще трябва да промените всички тригери, за да позволите това поведение.
Забележка:Причината, поради която не използвахме флаг за „одобрение“, беше, че се нуждаехме от възможността да променяме съществуващи записи, разбира се, не можехме да имаме множество записи с един и същи първичен ключ.