2012-06-25 3 views
14

Herhangi bir sütunun değiştirilip değiştirilmediğini kontrol etmek için bir SQL tablosunda md5sum bir satır var mı?bir SQL satırı var mı?

Belirli bir sütunun, bir metin dosyasında tuttuğum verilerin (C# içinde md5sum olacak) eski bir kopyasına göre değiştirilip değiştirilmediğini kontrol etmek istiyorum.

DÜZENLEME: Sadece md5sum-ing her satır

+1

Eğer tüm satır, ya da sadece metin dosyasını MD5ing musunuz? – MatBailie

+0

Sadece bütün satır – mezamorphic

+2

Bunun için en iyi yaklaşım, tablonuzda bir ['ROWVERSION 'sütunu] (http://msdn.microsoft.com/en-us/library/ms182776.aspx) kullanmak olacaktır. SQL Server, satırda herhangi bir değişiklik olursa otomatik olarak bu sütunu güncelleyecektir. –

cevap

11

CHECKSUM(*), BINARY_CHECKSUM(*) ve CHECKSUM_AGG vardır. CRC32'yi checkum gibi yaparlar, fakat bir satırdaki değişiklikleri saptamak için fazlasıyla yeterli olmalıdır (yanlış negatif bir çarpışma için 4 milyardan fazla şanstan bahsediyorsunuz).

HASHBYTES kullanarak bir şifreleme karması yapmak, 'satırı' temsil eden bir ifade oluşturmanızı gerektirir.

+4

Çevreye bağlı olarak, 4 milyarda 1, sonuç olarak meydana gelmesinin muhtemel olmasını bekleyecek kadar sık ​​olabilir. Ayrıca, bazı ortamlarda böyle bir olay felaket olabilir. OP'lerin ihtiyaçlarını bilmiyorum, ancak MS bile satır değişikliklerini belirlemek için * CHECKSUM() 'ın * kullanılmasını önermiyor mu? – MatBailie

+1

@Dems: OP gereksinimlerini bildiği için CHECKSUM'un yeterince iyi olup olmadığını söyleyemem. Ben sadece bunu reddetmek olmaz çünkü '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ı '' '' '' kolaylık '' ile uydurmak zor. Karma olmasını sağlamak için satırı temsil eden bir ifadeyle gelmek önemsiz değildir ve şema değişikliklerini düşündüğünüzde daha da fazladır. –

+3

@Dems: Ancak birçok durumda 4 milyarda 1'in çok yüksek olasılık olduğunu kabul ediyorum. Bildiğiniz gibi, bilinen bir satır ile bilinen bir satır, temel don PK ile karşılaştırdığınızdan, [ortada buluşma] yoktur (http://en.wikipedia.org/wiki/Meet-in). -the-middle_attack) sorunu. Eğer yanlış negatifler dünya çapında bir felaketle sonuçlanırsa, * tek * çözümü tam byte-byte karşılaştırması yapmaktır, * tüm * karmalar tanım gereği çarpışmaya neden olurlar. –

1

, tüm satır alın her sütunun md5 yapmak ve önceki verilerde muhabir sütunun md5 ile karşılaştırın.

8

SQL Server 2008 veya daha yeni şunu kullanabilirsiniz varsa:

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

veya

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

'a güvenmem. Geçerli satıra sınırlamak için bir where cümlesi kullandım – frostymarvelous