Vi har något liknande på en av våra sajter, vi har lagt till ett gäng tabeller:
users
sites
... osv
Sedan har vi ett gäng skuggbord:
users-shadow
sites-shadow
... osv
Skuggtabellerna har identiska strukturer som de riktiga tabellerna förutom en extra rad för användaren som gjorde ändringen. Så först använder vi den här frågan när en ändring skickas av en användare som behöver godkänna sina databasåtgärder:
REPLACE INTO users-shadow (user_mod,id,username,password,salt...) VALUES (16,50,'bob','stuff','salt'...);
Se till att detta inte är öppet för injektion, använd förberedda uttalanden etc.
När det är godkänt, en rad i shadow
tabellen tas helt enkelt bort från shadow
tabellen, user_mod
värde tappats och ändringar (icke-nullvärden) infogas i den verkliga tabellen (eller uppdateras om ett id
anges med REPLACE
syntax). Vi gör den här logiken i perl så tyvärr har vi ingen SQL till hands för det.
Kom ihåg att SQL REPLACE
gör en DELETE
och en INSERT
snarare än en UPDATE
. Du måste ändra alla utlösare för att tillåta detta beteende.
Obs! Anledningen till att vi inte använde en "godkänn"-flagga var att vi behövde möjligheten att ändra befintliga poster, naturligtvis kunde vi inte ha flera poster med samma primärnyckel.