We hebben iets soortgelijks op een van onze sites, we hebben een aantal tabellen toegevoegd:
users
sites
... enz
Dan hebben we een aantal schaduwtafels:
users-shadow
sites-shadow
... enz
De schaduwtabellen hebben dezelfde structuur als de echte tabellen, behalve een toegevoegde regel voor de gebruiker die de wijziging heeft aangebracht. Dus eerst gebruiken we deze query wanneer een wijziging wordt ingediend door een gebruiker die zijn/haar databaseacties moet laten goedkeuren:
REPLACE INTO users-shadow (user_mod,id,username,password,salt...) VALUES (16,50,'bob','stuff','salt'...);
Zorg er natuurlijk voor dat dit niet openstaat voor injectie, gebruik voorbereide verklaringen enz.
Na goedkeuring een rij in de shadow
tabel wordt eenvoudig verwijderd uit de shadow
tabel, de user_mod
waarde verwijderd en wijzigingen (niet-null-waarden) ingevoegd in de echte tabel (of bijgewerkt als een id
is opgegeven, met behulp van REPLACE
syntaxis). We doen deze logica in perl, dus helaas hebben we er geen SQL voor bij de hand.
Onthoud dat SQL REPLACE
doet een DELETE
en een INSERT
in plaats van een UPDATE
. U moet eventuele triggers aanpassen om dit gedrag toe te staan.
Opmerking:de reden dat we geen 'goedkeuren'-vlag gebruikten, was dat we de mogelijkheid nodig hadden om bestaande records te wijzigen, natuurlijk konden we niet meerdere records met dezelfde primaire sleutel hebben.