2014-04-25 11 views
5
Create table Info 
(
Personid int, 
PersonNo int 
) 

insert into Info(Personid,PersonNo) values(3,4) 

Qui possiamo vedere il valore checksum della riga particolarepossiamo usare il checksum per verificare che la riga sia stata cambiata (server sql)?

Select CHECKSUM(Personid ,PersonNo) from Info 

Ora aggiorno il valore del PersonNo e controllare il checksum della riga particolare

valore di checksum è stato modificato

quindi per questo conto posso sapere che quella riga particolare è stata cambiata

quindi la mia domanda è che è questo sicuro o preciso?

+0

Ancora più semplice e utile: il tipo di dati ['ROWVERSION'] (http://technet.microsoft.com/en-us/library/ms182776.aspx). Se si dispone di una colonna di quel tipo, verrà aggiornata per ogni operazione e quindi può essere utilizzata per verificare se si è verificata una modifica da quando è stata letta la riga. –

risposta

2

Da CHECKSUM (Transact-SQL)

CHECKSUM soddisfa le proprietà di una funzione hash: CHECKSUM applicato su qualsiasi due elenchi di espressioni restituisce lo stesso valore se gli elementi corrispondenti delle due liste hanno lo stesso tipo e sono uguale se confrontato usando l'operatore di uguale (=). Per questa definizione di , i valori nulli di un tipo specificato vengono considerati come paragonabili a . Se uno dei valori nell'elenco delle espressioni cambia, anche il checksum dell'elenco cambia in generale.

si noti però che

Tuttavia, c'è una piccola possibilità che il checksum non cambierà. Per questo motivo, non è consigliabile utilizzare CHECKSUM per rilevare se i valori sono stati modificati, a meno che l'applicazione non tolleri occasionalmente la modifica di mancante. Potresti utilizzare invece HashBytes. Quando viene specificato un algoritmo hash MD5, la probabilità che HashBytes restituisca lo stesso risultato per due input diversi è molto inferiore a quella di CHECKSUM.

3

Non è sicuro, CHECKSUM potrebbe produrre duplicati per dati diversi.

In SQL Server, per verificare se la riga è stata modificata in mezzo, ROWVERSION (o è synonim TIMESTAMP) viene in genere utilizzato, ma è necessario aggiungerlo come colonna a una tabella. Questo non è realmente un timestamp, ma piuttosto un semplice contatore di database e viene mantenuto automaticamente per ogni riga aggiornata. Si noti che cambierà quando viene emessa un'istruzione UPDATE, il contenuto potrebbe effettivamente rimanere lo stesso, anziché il checksum.

Oppure puoi stampare il tuo timestamp reale - aggiungi una colonna datetime della precisione richiesta e aggiornala manualmente.

Problemi correlati