2012-06-25 15 views
14

Czy istnieje sposób do md5sum wiersz w tabeli SQL, aby sprawdzić, czy kolumna została zmodyfikowana?haszować wiersz SQL?

Chciałbym sprawdzić, czy jakakolwiek konkretna kolumna została zmieniona w stosunku do starej kopii danych, które trzymam w pliku tekstowym (który będę md5sum w C#).

EDIT: Just md5sum-ing każdy wiersz

+1

Czy MD5ing cały wiersz lub tylko plik tekstowy? – MatBailie

+0

Tylko cały wiersz – mezamorphic

+2

Najlepszym rozwiązaniem byłoby użycie w tabeli kolumny "' ROWVERSION' (http://msdn.microsoft.com/en-us/library/ms182776.aspx). Program SQL Server automatycznie zaktualizuje tę kolumnę, jeśli jakiekolwiek zmiany nastąpią w tym wierszu. –

Odpowiedz

11

Istnieją CHECKSUM(*), BINARY_CHECKSUM(*) i CHECKSUM_AGG. Robią CRC32 jak checkum, ale do wykrywania zmian w rzędzie powinno być więcej niż wystarczające (mówimy o 1 na 4 miliardach szans na kolizję fałszywie ujemną).

Wykonywanie hasza kryptograficznego za pomocą HASHBYTES wymaga skonstruowania wyrażenia reprezentującego "wiersz".

+4

W zależności od środowiska, 1 na 4 miliardy może nadal być na tyle częstym, aby oczekiwać, że w końcu dojdzie. Ponadto w niektórych środowiskach takie wydarzenie może być katastrofalne. Nie znam potrzeb PO, ale czy nawet MS nie zaleca * nie * używania 'CHECKSUM()' do określenia zmian wierszy? – MatBailie

+1

@Dems: W/o znając potrzeby PO Nie mogę powiedzieć, czy CHECKSUM jest wystarczająco dobre. Nie odrzucałbym tego po prostu dlatego, że wygoda '*' jest trudna do dopasowania do 'HASHBYTES'. Wyrażenie, które reprezentuje wiersz, aby było mieszane, nie jest trywialne, a tym bardziej, gdy rozważa się zmiany schematu. –

+3

@Dems: ale zgadzam się, że 1 na 4 miliardy w wielu przypadkach jest zbyt wysokie prawdopodobieństwo. Pamiętaj jednak, że skoro porównujesz znany rząd z innym znanym rzędem, bazą don PK, nie ma [spotkać w środku] (http://en.wikipedia.org/wiki/Meet-in) -the-middle_attack). Jeśli fałszywe negatywy powodują katastrofę na poziomie światowym, rozwiązaniem * only * jest wykonanie pełnego porównania bajt po bajcie, * wszystkie * hashe są podatne na kolizję z definicji. –

1

uzyskać wszystkie wiersz, wykonaj MD5 każdej kolumnie i porównać ją z md5 kolumny korespondenta w poprzednich danych.

8

Jeśli SQL Server 2008 lub nowszy można użyć:

SELECT HASHBYTES('SHA1', (SELECT TOP 1 * FROM dbo.Table FOR XML RAW)) 

lub

SELECT 
    HASHBYTES('SHA1',(
     SELECT * 
     FROM dbo.myTable as tableToHash 
     where tableToHash.myUniqueKey=myTable.myUniqueKey 
     FOR XML RAW 
    ))            as rowSHA1 
from dbo.myTable; 
+0

, który pracował dla mnie. Użyłem klauzuli where, aby ograniczyć do bieżącego wiersza – frostymarvelous

Powiązane problemy