Gostaria de manter o histórico de uma tabela usando consultas SQL sem triggers. A maneira mais simples de fazer isso é disparar um SELECT
e INSERT
na tabela de histórico como abaixo:
INSERT INTO history (field1, field2)
SELECT
field1,
field2
FROM
current
WHERE
field1 = condition
No entanto, é possível fazer isso sem codificar o columns
ie um select *
equivalente?
Você pode - você precisa remover os aliases de coluna da lista INSERT conforme abaixo
DBFiddle
NOTA: As colunas de ambas as tabelas devem estar na mesma ordem e, se o esquema da tabela de origem for modificado, o esquema da tabela de destino também deverá ser alterado.
AVISO LEGAL: Usar SELECT * no código de produção é visto como um antipadrão - alterações na ordem das colunas ou na estrutura da tabela podem causar erros. Eu recomendaria NÃO usar este método.
Como já foi mencionado, você pode copiar uma linha para outra tabela como deseja fazer se elas tiverem a mesma disposição de colunas.
Você pode até criar a tabela de destino usando a tabela base como modelo usando algo como
SELECT * INTO NewTable FROM BaseTable
ou se quiser criar apenas a nova tabela e não preenchê-laSELECT TOP 0 * INTO NewTable FROM BaseTable
.Mas suspeito que você desejará mais na tabela de histórico do que na loja principal: pelo menos um carimbo de data e hora, caso contrário, tudo o que você tem para cada linha é um pacote de versões sem indicação de qual ordem elas existiam. Você também pode acabar com linhas idênticas se houver uma "atualização sem operação" ou uma alteração for revertida nos dados base. Ter linhas totalmente idênticas pode ser problemático - por exemplo: como você exclui uma delas?
Você também pode fazer isso com pequenas variações nos exemplos acima:
Como você está usando o SQL Server, pode haver uma opção interna que fará isso e muito mais para você, dependendo de quais versões do SQL Server você precisa oferecer suporte. Se você estiver usando o Azure SQL ou qualquer edição (incluindo Express) do SQL Server 2016 ou posterior, poderá usar tabelas temporais com versão do sistema .
Além de manter os dados para você sem etapas ou gatilhos extras, você também obtém um bom açúcar sintático para facilitar a consulta desses dados em vários cenários comuns (mostre-me todas as versões deste item do ano passado até agora, mostre-me como era este item na semana passada, mostre-me como era a mesa inteira na última quinta-feira às 02:34, ...).
Eles têm suas próprias pegadinhas, e você ainda precisa tomar alguns cuidados com a estrutura da tabela (embora para algumas mudanças isso também seja tratado automaticamente), mas pode ser exatamente o que você está procurando.