Mamy coś podobnego na jednej z naszych stron, dodaliśmy kilka tabel:
users
sites
... itd
Następnie mamy kilka tabel cieni:
users-shadow
sites-shadow
... itd
Tabele cieni mają identyczną strukturę jak tabele rzeczywiste, z wyjątkiem dodanej linii dla użytkownika, który dokonał zmiany. Więc najpierw używamy tego zapytania, gdy zmiana jest przesyłana przez użytkownika, który potrzebuje zatwierdzenia swoich działań w bazie danych:
REPLACE INTO users-shadow (user_mod,id,username,password,salt...) VALUES (16,50,'bob','stuff','salt'...);
Oczywiście, upewnij się, że nie jest otwarty na wstrzyknięcie, użyj przygotowane zestawienia itp.
Po zatwierdzeniu wiersz w shadow
tabela jest po prostu usuwana z shadow
tabela, user_mod
wartość porzucona i zmiany (wartości inne niż null) wstawione do rzeczywistej tabeli (lub zaktualizowane, jeśli id
jest określony, używając ZAMIEŃ
składnia). Wykonujemy tę logikę w perlu, więc niestety nie mamy do tego żadnego SQL-a.
Pamiętaj, że SQL REPLACE
wykonuje DELETE
i INSERT
zamiast UPDATE
. Będziesz musiał zmienić wszystkie wyzwalacze, aby umożliwić takie zachowanie.
Uwaga:powodem, dla którego nie użyliśmy flagi „zatwierdź”, było to, że potrzebowaliśmy możliwości zmiany istniejących rekordów. Oczywiście nie mogliśmy mieć wielu rekordów z tym samym kluczem podstawowym.