Abbiamo qualcosa di simile su uno dei nostri siti, abbiamo aggiunto un sacco di tabelle:
users
sites
... ecc
Quindi abbiamo un sacco di tabelle ombra:
users-shadow
sites-shadow
... ecc
Le tabelle shadow hanno strutture identiche alle tabelle reali ad eccezione di una riga aggiunta per l'utente che ha apportato la modifica. Quindi per prima cosa utilizziamo questa query quando una modifica viene inviata da un utente che ha bisogno dell'approvazione delle sue azioni sul database:
REPLACE INTO users-shadow (user_mod,id,username,password,salt...) VALUES (16,50,'bob','stuff','salt'...);
Ovviamente, assicurati che questo non sia aperto all'iniezione, usa dichiarazioni preparate ecc.
Una volta approvato, una riga in shadow
la tabella viene semplicemente rimossa da shadow
tabella, il user_mod
valore eliminato e modifiche (valori non nulli) inserite nella tabella reale (o aggiornate se un id
è specificato, utilizzando REPLACE
sintassi). Facciamo questa logica in Perl, quindi purtroppo non abbiamo alcun SQL a portata di mano per questo.
Ricorda che SQL REPLACE
esegue un DELETE
e un INSERT
piuttosto che un UPDATE
. Dovrai modificare tutti i trigger per consentire questo comportamento.
Nota:il motivo per cui non abbiamo utilizzato un flag "approva" era che avevamo bisogno della possibilità di modificare i record esistenti, ovviamente non potevamo avere più record con la stessa chiave primaria.