Bir SQL Server tablosuna değişiklikler için kontrol edin?
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:
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:
Ve saklanan değerlerin karşı dönen toplamlarını karşılaştırın.
Oluştur 01/08/2008 saat 13:35 2008-08-01 13:35
kaynak kullanıcı TimM
SAĞLAMA komutu bir göz atın:
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:
İş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 2008-08-02 06:20 share
kaynak kullanıcı Jon Galloway
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!
Cevap 30/03/2011 saat 13:07 2011-03-30 13:07 share
kaynak kullanıcı BitLauncher
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 2008-08-01 14:07 share
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.
kaynak kullanıcı Chris Miller
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):
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 2008-08-01 15:06 share
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 2008-08-06 02:54 share
kaynak kullanıcı caryden
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 2008-08-05 02:12 share
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 2014-07-24 05:58 share
bir sunucudan diğerine veritabanı yapısı değişiklikleri birleştirme
SQL Sorgu Filtreleme HAVING kullanmadan COUNT
OutOfMemoryException SQL FileStream kullanarak
SQL istisna LINQ bir veritabanı tablosunda yeni bir giriş sokulmak istendiğinde
tarafından gruba sorgu / alt sorgu gösterilen dönüştürme?
# 1054 - 'Maddesine' de bilinmeyen kolon
Nasıl çeyrek bitiş tarihlerini kullanarak matematik yapacağız?
ikili ODBC Kanonik tarih dönüştürme veya ODBC Kanonik fonksiyonu kullanılarak
Bir kimlik aynı olduğunda sorgu tüm verileri alır
alt sorgu olmadan maksimum değeri bulmak için nasıl