Tenemos algo similar en uno de nuestros sitios, hemos agregado un montón de tablas:
users
sites
... etc.
Entonces tenemos un montón de tablas de sombra:
users-shadow
sites-shadow
... etc.
Las tablas sombra tienen estructuras idénticas a las tablas reales excepto por una línea añadida para el usuario que realizó el cambio. Entonces, primero usamos esta consulta cuando un usuario envía un cambio que necesita que se aprueben sus acciones en la base de datos:
REPLACE INTO users-shadow (user_mod,id,username,password,salt...) VALUES (16,50,'bob','stuff','salt'...);
Obviamente, asegúrese de que esto no esté abierto a la inyección, use declaraciones preparadas etc.
Cuando se aprueba, una fila en la shadow
la tabla simplemente se elimina de la shadow
tabla, el user_mod
valor descartado y cambios (valores no nulos) insertados en la tabla real (o actualizados si un id
se especifica, usando REPLACE
sintaxis). Hacemos esta lógica en Perl, por lo que lamentablemente no tenemos ningún SQL a mano para ello.
Recuerde que SQL REPLACE
hace un DELETE
y un INSERT
en lugar de una UPDATE
. Deberá modificar los desencadenantes para permitir este comportamiento.
Nota:la razón por la que no usamos un indicador de 'aprobación' fue que necesitábamos la capacidad de modificar los registros existentes; por supuesto, no podíamos tener varios registros con la misma clave principal.