Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Rastreamento de campos alterados sem manter o histórico


Como usar um campo de bits no TSQL (para atualizações e leituras)

Defina o bitfield como padrão para 0 no início (ou seja, sem alterações), você deve usar o tipo int para até 32 bits de dados e bigint para até 64 bits de dados.

Para definir um bit em um campo de bits, use o | (operador OR de bit) na instrução de atualização, por exemplo
UPDATE table 
SET field1 = 'new value', bitfield = bitfield | 1

UPDATE table 
SET field2 = 'new value', bitfield = bitfield | 2

etc para cada campo use 2 elevado a N-1 para o valor após o |

Para ler um campo de bits, use & (operador de bit AND) e veja se é verdade, por exemplo
SELECT field1, field2,
       CASE WHEN (bitfield & 1) = 1 THEN 'field1 mod' ELSE 'field1 same' END,
       CASE WHEN (bitfield & 2) = 2 THEN 'field2 mod' ELSE 'field2 same' END
FROM table

note que eu provavelmente não usaria texto, pois isso será usado por um aplicativo, algo assim funcionará
SELECT field1, field2,
        CASE WHEN (bitfield & 1) = 1 THEN 1 ELSE 0 END AS [field1flag],
        CASE WHEN (bitfield & 2) = 2 THEN 1 ELSE 0 END AS [field2flag]
FROM table

ou você pode usar !=0 acima para simplificar como eu fiz no meu teste abaixo

Tem que realmente testar para não ter erros, clique para o script de teste

resposta original:

Se você tiver menos de 16 colunas em sua tabela, poderá armazenar os "sinalizadores" como um número inteiro e usar o método de sinalizador de bits para indicar as colunas que foram alteradas. Apenas ignore ou não se preocupe em marcar os que você não se importa.

Assim, se flagfield BOOLEAN AND 2^N for true, indica que o campo Nth mudou.

Ou um exemplo para max de N =2

0 - nada mudou (todos os bits 0)

1 - campo 1 alterado (primeiro bit 1)

2 - campo 2 alterado (segundo bit 1)

3 - campo 1+2 alterado (primeiro e segundo bit 1)

veja este link para uma definição melhor:http://en.wikipedia.org/wiki/Bit_field