Bir SQL Server tablosuna değişiklikler için kontrol edin?

oy
122

Nasıl tetikleyicileri kullanarak veya herhangi bir şekilde veritabanı yapısını değiştirmeden bir tabloya değişiklikleri için bir SQL Server veritabanı izleyebilirim? Benim tercih programlama ortamıdır NET ve C #.

Ben herhangi bir destek edebilmek istiyorum SQL Server 2000 SP4 veya daha yeni. Benim uygulama başka bir şirketin ürün için cıvatalı veri görselleştirme olduğunu. Müşteri tabanı bin, yani her tesiste üçüncü taraf satıcının tabloyu değiştirmek gereklerini koymak zorunda kalmak istemiyoruz.

By bir tabloya değişiklikleri Ben tablo verileri, tablo yapısına değil değişiklileri demek.

Sonuçta, bunun yerine bir aralıkta değişiklikleri kontrol zorunda kalmadan, benim uygulamasında bir olayı tetiklemek için değişiklik istiyorum.


En iyi hareket, benim gereksinimleri (tetik yok veya şema değişikliği, SQL Server 2000 ve 2005) kullanmak gibi görünüyor verilen BINARY_CHECKSUMfonksiyonu T-SQL . Ben uygulamak için plan yolu şudur:

Her X saniyede aşağıdaki sorguyu çalıştırın:

SELECT CHECKSUM_AGG(BINARY_CHECKSUM(*))
FROM sample_table
WITH (NOLOCK);

Ve saklanan değere karşı karşılaştırın. değeri değişmişse, sorgu kullanarak aralıksız tarafından tablo satırına geçer:

SELECT row_id, BINARY_CHECKSUM(*)
FROM sample_table
WITH (NOLOCK);

Ve saklanan değerlerin karşı dönen toplamlarını karşılaştırın.

Oluştur 01/08/2008 saat 13:35
kaynak kullanıcı
Diğer dillerde...                            


8 cevaplar

oy
90

SAĞLAMA komutu bir göz atın:

SELECT CHECKSUM_AGG(BINARY_CHECKSUM(*)) FROM sample_table WITH (NOLOCK);

Aynı numara o kadar uzun bir masa içeriği değişmemiştir olarak yayınlandığında her zaman dönecektir. Daha fazla bilgi için bu benim yazı Bkz:

SAĞLAMA

İşte tablolar değişti zaman önbellek bağımlılıkları yeniden üretmek için kullanılan nasıl:
(tetikleyiciler olmadan) ASP.NET 1.1 veritabanı önbellek bağımlılık

Cevap 02/08/2008 saat 06:20
kaynak kullanıcı

oy
30

Maalesef SAĞLAMA değişiklikleri tespit etmek için her zaman düzgün çalışmıyor . Sadece bir ilkel sağlama ve hiçbir CRC hesaplama olduğunu. Bu nedenle tüm değişiklikleri tespit etmek için kullanamazsınız, örneğin simetrik değişiklikler aynı CHECKSUM sonuçlanır!

Örneğin. ile çözüm CHECKSUM_AGG(BINARY_CHECKSUM(*))farklı içeriğe sahip tüm 3 tablolar için her zaman 0 sunar!


SELECT CHECKSUM_AGG(BINARY_CHECKSUM(*)) FROM 
(
  SELECT 1 as numA, 1 as numB
  UNION ALL
  SELECT 1 as numA, 1 as numB
)  q
-- delivers 0!

SELECT CHECKSUM_AGG(BINARY_CHECKSUM(*)) FROM ( SELECT 1 as numA, 2 as numB UNION ALL SELECT 1 as numA, 2 as numB ) q -- delivers 0!

SELECT CHECKSUM_AGG(BINARY_CHECKSUM(*)) FROM ( SELECT 0 as numA, 0 as numB UNION ALL SELECT 0 as numA, 0 as numB ) q -- delivers 0!

Cevap 30/03/2011 saat 13:07
kaynak kullanıcı

oy
25

Neden tetikleyicileri kullanmak istemiyor musunuz? Bunları doğru bir şekilde kullanırsanız Onlar iyi bir şey vardır. bilgi tutarlılığını zorlamak için bir yol olarak onları kullanırsanız onlar iyiden kötüye doğru giderken olmasıdır. Eğer izleme için bunları kullanmak etmişse, o zaman gerçekten tabu olarak kabul edilmez.

Cevap 01/08/2008 saat 14:07
kaynak kullanıcı

oy
19

Ne kadar sıklıkla değişiklikler ve ne kadar büyük (satır büyüklüğü açısından) veritabanında tablolar şunlardır kontrol etmek gerekiyor? Eğer kullanırsanız CHECKSUM_AGG(BINARY_CHECKSUM(*))John tarafından önerilen yöntem, belirtilen tablonun her satırı tarar. NOLOCKIpucu yardımcı olur, ancak büyük bir veritabanı üzerinde, yine her satır isabet. Ayrıca tek değiştiğini söylemek böylece her satır için sağlama saklamak gerekir.

Eğer farklı bir açıdan bu gidiyor düşündünüz mü? Eğer tetikleyicileri eklemek için şema, değiştirmek istemiyorsanız veritabanını yaratıyor uygulama satıcı ile çalışan düşündünüz var, (bir mantıklı, bu veritabanı değil)?

Bunlar veri değişti aksesuar uygulamaları bildiren bir mekanizma sağlar bir API uygulamak. Bu modifiye ne masa ve hangi satırın listeleyen bir bildirim tabloya yazmak kadar basit olabilir. Yani tetikleyiciler veya uygulama kodu ile uygulanabilir. senin taraftan, ti tek endişe periyodik olarak bildirim tablosunu tarayarak olacağını, fark etmez. veritabanı üzerinde vurmak performans değişiklikleri için her satır tarayarak çok daha az olacaktır.

Zor kısmı bu özelliği uygulamak için uygulama satıcısına ikna olurdu. Bu tetikleyicileriyle SQL aracılığıyla tamamen kolları olabileceği için, uygulama satıcıya kodu getiren sonra yazma ve tetikleyicileri test ve kendileri için işin toplu yapabilirdi. satıcı destekleyeceğini tetikler sahip olarak, o senin satıcı tarafından sağlanan bir tetikleyici yerini yanlışlıkla tetiği ekleyerek durumu önlemek.

Cevap 03/08/2008 saat 14:59
kaynak kullanıcı

oy
18

Bir DTS işi (veya bir windows hizmeti tarafından başlatılan bir işi) belirli bir aralıkta çalışır mı. Çalıştırıldığı her defasında, o sistem kullanılarak verilen tabloda hakkında bilgi alır ınformatıon_schema tabloları ve veri deposu bu verileri kaydeder. Veri önceki zaman döndürülen veri tablosunun yapısı ile ilgili iade karşılaştırın. Eğer farklıysa, o zaman yapısı değişmiş olduğunu biliyoruz.

Örnek sorgu tablosu ABC tüm sütunları ile ilgili bilgi döndürmek için (ideal kullanmak yerine, istediğiniz ınformatıon_schema tablodan sadece sütunları dışarı listeleme * Burada yaptığım gibi ** seçin):

select * from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME = 'ABC'

Sen "bir tabloya değişiklikler" define nasıl tam bağlı olarak farklı sütun ve ınformatıon_schema görüşlerini izleyecek.

Cevap 01/08/2008 saat 15:06
kaynak kullanıcı

oy
17

Ne yazık ki, SQL2000 bunun için temiz bir yolu olduğunu düşünmüyorum. SQL Server 2005 (ve sonrası) için gereksinimleri daraltmak, o zaman iş başında. Sen kullanabilirsiniz SQLDependencysınıfı System.Data.SqlClient. Bkz SQL Server (ADO.NET) Sorgu Bildirimler .

Cevap 06/08/2008 saat 02:54
kaynak kullanıcı

oy
13

Burada Yabani tahmin: Eğer üçüncü tarafın tabloları değiştirmek istemiyorsanız, Bir görünüm oluşturmak ve daha sonra söz konusu görünüm üzerinde bir tetikleyici koyabilir miyim?

Cevap 05/08/2008 saat 02:12
kaynak kullanıcı

oy
7

son tamamlama tarihini kontrol edin. Her veritabanı her yapıldığında taahhüt zaman bir geçmişe sahiptir. Ben onun ASİT uyum standart inanıyoruz.

Cevap 24/07/2014 saat 05:58
kaynak kullanıcı

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more