Temos algo semelhante em um de nossos sites, adicionamos várias tabelas:
users sites ... etc Então temos um monte de tabelas de sombra:
users-shadow sites-shadow ... etc As tabelas de sombra têm estruturas idênticas às tabelas reais, exceto por uma linha adicionada para o usuário que fez a alteração. Então, primeiro usamos essa consulta quando uma alteração é enviada por um usuário que precisa ter suas ações de banco de dados aprovadas:
REPLACE INTO users-shadow (user_mod,id,username,password,salt...) VALUES (16,50,'bob','stuff','salt'...);
Obviamente, certifique-se de que não esteja aberto para injeção, use declarações preparadas etc.
Quando aprovado, uma linha na
shadow A tabela é simplesmente removida da shadow tabela, o user_mod valor descartado e alterações (valores não nulos) inseridas na tabela real (ou atualizadas se um id é especificado, usando REPLACE
sintaxe). Nós fazemos essa lógica em perl, então infelizmente não temos nenhum SQL disponível para isso. Lembre-se que SQL
REPLACE faz um DELETE e um INSERT em vez de um UPDATE . Você precisará alterar quaisquer gatilhos para permitir esse comportamento. Observação:o motivo pelo qual não usamos um sinalizador "aprovar" foi que precisávamos da capacidade de alterar os registros existentes. É claro que não poderíamos ter vários registros com a mesma chave primária.