Něco podobného máme na jednom z našich stránek, přidali jsme hromadu tabulek:
users
sites
... atd
Pak tu máme spoustu tabulek stínů:
users-shadow
sites-shadow
... atd
Stínové tabulky mají identickou strukturu jako skutečné tabulky s výjimkou přidaného řádku pro uživatele, který provedl změnu. Nejprve tedy použijeme tento dotaz, když změnu odešle uživatel, který potřebuje schválit své akce v databázi:
REPLACE INTO users-shadow (user_mod,id,username,password,salt...) VALUES (16,50,'bob','stuff','salt'...);
Samozřejmě se ujistěte, že to není otevřené pro injekci, použijte připravená prohlášení atd.
Po schválení řádek ve shadow
tabulka je jednoduše odstraněna ze shadow
tabulka user_mod
hodnota zrušena a změny (hodnoty jiné než null) vloženy do skutečné tabulky (nebo aktualizovány, pokud id
je zadáno pomocí REPLACE
syntax). Tuto logiku děláme v perlu, takže pro ni bohužel nemáme po ruce žádné SQL.
Pamatujte, že SQL REPLACE
provede DELETE
a INSERT
spíše než UPDATE
. Budete muset upravit všechny spouštěče, abyste toto chování umožnili.
Poznámka:Důvod, proč jsme nepoužili příznak 'schválit', byl ten, že jsme potřebovali možnost upravit existující záznamy, samozřejmě jsme nemohli mít více záznamů se stejným primárním klíčem.