el hash de un SQL fila?

Hay una forma de suma de control md5 de una fila en una tabla de SQL para comprobar si la columna se ha modificado?

Me gustaría comprobar si una determinada columna ha cambiado frente a una vieja copia de los datos que tengo en un archivo de texto (de la que hablaré md5sum en C#).

EDIT: Acabo de md5sum-ción de cada fila

Estás MD5ing toda la fila, o simplemente el archivo de texto?
Sólo la fila completa
El mejor enfoque para esto sería el uso de un ROWVERSION columna en su mesa. SQL Server actualizará automáticamente esta columna si los cambios se suceden a la fila.
la tabla no se modifica, el archivo de texto. Tenía la esperanza de que yo sólo podía md5sum la fila y luego compararlo con el archivo de la fila. No te preocupes, me limitaré a extraer de cada fila y la suma de control md5 de la base de datos de las filas manualmente
Esta es la forma en que se puede hacer a través de una instrucción select: SELECT Pk1 ,ROW_NUMBER() OVER ( ORDER BY Pk1 ) 'RowNum' ,(SELECT hashbytes('md5', ( SELECT Pk1, Col2, Col3 FOR XML raw ))) 'HashCkSum' FROM [MySchema].[MyTable]; donde Pk1 es la Clave Principal de la tabla y ColX son las columnas que desea monitorear los cambios. Esto debería ser válido para MS SQL Svr 2008/2012.

OriginalEl autor mezamorphic | 2012-06-25

4 respuestas

  1. 16

    Hay suma de verificación(*), BINARY_CHECKSUM(*) y CHECKSUM_AGG. Que hacer CRC32 como checkum, pero para la detección de cambios en una fila debe ser más que suficiente (se está hablando de alrededor de 1 en 4 mil millones de posibilidades para un falso negativo de la colisión).

    Hacer un hash criptográfico utilizando HASHBYTES requiere de usted para construir una expresión que representa la ‘fila’.

    Dependiendo del entorno, de 1 en 4 mil millones todavía puede ser bastante frecuente para esperar es probable que llegar a suceder. También, en algunos entornos, tales eventos pueden ser catastróficas. No sé la OPs necesidades, pero no MS recomendar a no uso CHECKSUM() para determinar cambios de fila?
    W/o conociendo la OP necesidades no puedo decir si la suma de comprobación es lo suficientemente bueno. Yo no descartar simplemente porque la conveniencia de * es difícil de igualar haciendo HASHBYTES. Viene 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.
    pero estoy de acuerdo en que 1 de cada 4 mil millones de dólares en muchos casos es demasiado alta probabilidad. Tenga en mente que ya estás comparando un conocido fila con otro conocido de la fila, en base a PK, no hay meet-in-the-middle el tema. Si falsos negativos resultado en el mundo de fin de desastre, de la solo solución es hacer un byte por byte de comparación, todo hash se colisión propensos por definición.
    Esas funciones no son tan buenas como parece en MSDN. Es fácil obtener una suma de comprobación de colisión si la entrada es similar. Echa un vistazo aquí: enlace Además, si usted está utilizando CHECKSUM_AGG hay que tener cuidado – utiliza XOR bajo el capó, por lo que es bastante fácil de conseguir colisiones. Usted puede leer sobre él aquí: enlace yo no confiaría en esas funciones solo

    OriginalEl autor Remus Rusanu

  2. 10

    Si tiene SQL Server 2008 o más reciente puede utilizar:

    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;
    que trabajó para mí. he utilizado una cláusula where para limitar a la fila actual

    OriginalEl autor Muflix

  3. 1

    Obtener todas las filas, hacer el md5 de cada columna y compararlo con el md5 de la corresponsal de la columna en los datos anteriores.

    OriginalEl autor aF.

  4. 0

    Tuve que desarrollar una solución para comparar las estructuras de las tablas y ejecutar un procedimiento para importar la diferencia entre las tablas.

    He utilizado a continuación el código para seleccionar los datos

    –> estructuras de tabla
    crear la tabla #tabla1 (
    campo de tipo varchar(10)
    ,campo1 tipo varchar(10)
    )

    create table #table2 (
    campo varchar(10)
    ,campo1 varchar(10)
    )

    –> Insertar valores

    insert into #table1 values ('bruno',1)
    insert into #table1 values ('bruno',2)
    insert into #table2 values ('bruno',1)
    insert into #table2 values ('bruna',2)

    –> Crear un hash de la columna para comparar

    select *,HASHBYTES('SHA1', (select z.* FOR XML RAW)) as hash
        into #compare1
     from #table1 z 
    
    select *,HASHBYTES('SHA1', (select k.* FOR XML RAW)) as hash
        into #compare2
     from #table2 k 

    –> verificación de las líneas que tiene cualquier diferencia

    select * from  #compare1 a
    full outer join #compare2 b on a.hash = b.hash
    where ( a.hash is null or b.hash is null )

    Tal vez esto es útil para alguien que necesita lo mismo

    OriginalEl autor Bruno Dantas

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *