2012-06-25 29 views
14

¿Hay alguna manera de md5sum una fila en una tabla SQL para verificar si alguna columna se ha modificado?hash una fila SQL?

Me gustaría comprobar si se ha cambiado alguna columna en particular en comparación con una copia anterior de los datos que tengo en un archivo de texto (que md5sum en C#).

EDIT: Sólo md5sum-ción cada fila

+1

¿Está MD5ing toda la fila, o simplemente el archivo de texto? – MatBailie

+0

Solo toda la fila – mezamorphic

+2

El mejor enfoque para esto sería usar una columna ['ROWVERSION'] (http://msdn.microsoft.com/en-us/library/ms182776.aspx) en su tabla. SQL Server actualizará automáticamente esta columna si se producen cambios en la fila. –

Respuesta

11

Hay CHECKSUM(*), BINARY_CHECKSUM(*) y CHECKSUM_AGG. Hacen CRC32 como Checkum, pero para detectar cambios en una fila debería ser más que suficiente (estás hablando de 1 en 4 mil millones de posibilidades de una colisión de falso negativo).

Hacer un hash criptográfico utilizando HASHBYTES requiere que construya una expresión que represente la 'fila'.

+4

Dependiendo del entorno, 1 de cada 4 mil millones puede ser lo suficientemente frecuente como para esperar que eventualmente ocurra. Además, en algunos entornos, tal evento podría ser catastrófico. No sé las necesidades de OP, pero ni siquiera MS recomienda * no * usar 'CHECKSUM()' para determinar los cambios de fila? – MatBailie

+1

@Dems: sin conocer las necesidades de OP, no puedo decir si CHECKSUM es lo suficientemente bueno. No lo descartaría simplemente porque la conveniencia de '*' es difícil de combinar haciendo 'HASHBYTES'. Proceder con una expresión que representa la fila para ser hash no es trivial, y más aún cuando se consideran los cambios de esquema. –

+3

@Dems: pero estoy de acuerdo en que 1 en 4 mil millones en muchos casos es una probabilidad demasiado alta. Sin embargo, ten en cuenta que ya que estás comparando una fila conocida con otra fila conocida, base don PK, no hay [meet-in-the-middle] (http://en.wikipedia.org/wiki/Meet-in -the-middle_attack) problema. Si los falsos negativos resultan en un desastre mundial, entonces la * única * solución es hacer una comparación completa byte por byte, * todos los hashes son propensos a colisiones por definición. –

1

Obtenga toda la fila, haga lo md5 de cada columna y compararlo con el md5 de la columna de corresponsal en los datos anteriores.

8

Si ha de SQL Server 2008 o posterior puede usar:

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

o

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

que funcionó para mí. utilicé una cláusula where para limitar a la fila actual – frostymarvelous

Cuestiones relacionadas