Geçmişi izlemek için CDC ne zaman kullanılır?


26

SQL Server Veri Değişimi Yakalama, SQL Server işlem kayıtlarından geçmiş verileri okuyan ve bunları özel bir tabloda depolayan bir özelliktir.

Özel tablo değeri işlevlerinin (TVF) kullanılması sayesinde, kullanıcının bu verileri sorgulamasını sağlar, böylece belirli bir tablodaki tüm değişiklikleri veya yalnızca belirli bir süre içindeki değişikliklerden kaynaklanan net değişiklikleri elde etmeyi mümkün kılar.

CDC'nin bazı avantajları var

  • Yalnızca belirli tabloları veya sütunları izlemek için yapılandırılabilir.
  • Model değişikliklerini belli bir dereceye kadar idare edebiliyor.
  • İşlem günlükleriyle çalıştığı için performansı tetikleyiciler kadar yoğun şekilde etkilemez.
  • Kolayca etkinleştirilir / devre dışı bırakılır ve izlenmesi gereken masada ek sütunlar gerektirmez.

Aynı zamanda bazı dezavantajlara sahiptir:

CDC hakkında epeyce okudum ve şimdi nasıl kullanılacağını bilmeme rağmen, bunun benim için doğru araç olup olmadığından hala emin değilim.

  1. Hangi görevler / senaryolar için CDC doğru araç? (örn. Kullanıcıların bir veri nesnesini belirli bir zamana geri yüklemelerine izin verme? Denetleme? Verilerin tarihinin tamamı gösteriliyor mu?)
  2. Ne zaman CDC'yi kullanmamayı tercih edersiniz, ancak özel bir tetikleyici tabanlı çözüme başvurmalısınız?
  3. CDC'yi operasyonel bir veritabanında kullanmak ve CDC verilerini operasyonel bir uygulamada kullanmak uygun mudur? (örneğin, bunu son kullanıcıya gösterme) Ya da bu açıkça bu özelliği yanlış mı kullanıyor?

Genelde CDC'nin bir denetim aracı olduğunu duyuyorum ama bu ne SQL Server Denetimi değil ne için olduğu değil mi? Her ikisi de aynı görev için farklı araçlar mı? Veya CDC başka şeyler için kullanılabilir mi?

Mevcut senaryom, gelecekteki çoklu uygulamaların temeli olması beklenen güvenilir bir veri çerçevesi oluşturmam isteniyor. Kesin gereksinimler bulanık, ancak bunlardan biri veri geçmişini izleyebilmesi ve daha eski girdileri diğer tüm tablolardaki ilgili verilerle birlikte geri yükleyebilmesidir. Şu anda CDC'yi bir seçenek olarak değerlendiriyorum, ancak böyle bir yol olup olmadığından emin değilim çünkü önerilen kullanım durumlarını gerçekten bulamıyorum.

Özel senaryom için tavsiyelerimi takdir etsem de, cevaplar Veri Toplama Değişikliğini ne zaman veya ne zaman kullanmama konusunda genel tavsiye vermelidir.


1
İdeal olarak, bir "çerçeve" bu tür bir karar vermez; bireysel projelere bırakılacaktı. Ancak bunu yapmanız istendiğinden, en azından bu gereksinimleri size kimin verdiğine bu noktaya değinirim: Bunu başarmanın farklı yolları vardır ve en iyi seçenek büyük oranda kesin kullanım ve ihtiyaçlara bağlıdır. Karar vermenize yardımcı olabilecek herhangi bir açıklama yapıp yapamayacaklarını sorun (örneğin performans veya esnekliğin daha önemli olup olmadığı gibi). Dikkate alınması gereken bir başka seçenek de, her iki seçeneği de "çerçevenin" bir parçası olarak geliştirmek ve gerçek projelerin hangisinin yapılacağını seçmesine izin vermektir.
jpmc26

@ jpmc26, bu tür bir soruyu kararlaştırmak için her bir proje harcamasını durdurmak için çerçeveye ihtiyaç duyulabilir.
Ian Ringrose

@IanRingrose Amacım, bu kararı bir projenin özel ihtiyaçlarını göz önünde bulundurmadan yapmaya çalışmak, uzun vadede çözdüğünden daha fazla soruna yol açacak (ve dolayısıyla aslında o zaman harcamaktan daha pahalı olacak). Bu, genel bir durumda etkin bir şekilde alınamayan bir karardır . Projenin özelliklerini gerekir düşünülebilir. Bir battaniye kararı kullanarak, seçilen çözüm kullanılarak ve sadece uygun bir çözüm olmadığı keşfedildiğinde ihlal edilecek varsayımlar için varsayımlar yaparak zaman harcanacaktır. Sonra sistemin yeniden tasarlanması gerekecek.
jpmc26

1
@ jpmc26 Çekip çıkarmanın bir yolunu bulursam, gerçekten önerdiğiniz çözüme gidebilirim: Hem tetikleyici hem de CDC tabanlı tarih takibi, değiştirilebilir ve ortak bir arabirimin arkasında geliştirme. Uygulamalar daha sonra gereksinimlerine bağlı olarak birini veya diğerini seçebilir, ancak bunu kendileri uygulamak için endişelenmenize gerek yoktur. Tabii ki yukarıdaki soruma hala iyi bir cevap almak istiyorum, çünkü eğer CDC bu tür bir iş için zaten kesilmezse (örneğin, denetim için sadece herhangi bir yarar olduğu için), kendimden bir sorun çıkarabilir ve daima tetikleyiciler kullanabilirim. .
magnattic

"Ajan çalışmıyorsa veya çökerse, tarih izlenmiyor" - ancak yeniden başlatılsaydı, hiçbir değişiklik kaybolmaz, değil mi?
Andy Joiner,

Yanıtlar:


12

İlk olarak,

Veri değiştirme değişikliği, yalnızca SQL Server'ın Kurumsal, Geliştirici ve Değerlendirme sürümlerinde kullanılabilir.

Böylece, müşterilerinizden herhangi birinin işletme sürümlerine sahip olmayacağına veya işletme sürümlerini kullanacağınızı henüz bilmiyorsanız, bu karar verebilir. (Spesifikasyon "çoklu gelecek uygulamaları" içerdiğinden, bu sizin için gerçek bir sorun olabilir)

Tetikleyicilerin aksine, gerçek zamanlı değildir, bu hem avantaj hem de dezavantajdır. Tetikleyicileri kullanmak her zaman bir güncellemeyi yavaşlatır.

Tetikleyicileri kullandığımız zaman (CodeSmith tarafından oluşturulan) bir sistem üzerinde çalıştım ve kayıtlardaki tüm değişiklikleri takip ettikten sonra, değişiklikleri birlikte yapılandıran uygulamanın modülünü içeren bir “tarihçe” tablosuna bağladık. ve kullanıcı değişikliği kullanıcı tarafından kullanılan UI öğesi.

Bununla birlikte, bunu uygulama düzeyinde çözebilirsiniz, tüm güncellemeleri daha sonra herhangi bir zamanda bir veritabanı oluşturmak için tekrarlanan bir mesaj kuyruğuna yazarak , seçeneklerin iyi bir gözden geçirmesi için bkz . Martin Flowler blogundaki Geçici Desenler bölümüne bakınız .


Bağlantı çok ilginç bir okuma, bunun için teşekkürler. Yine de, bunu uygulama düzeyinde çözmek, benim durumumda bir seçenek değil. Yaptığım çerçevenin, temel alan uygulamalar için tarih takibi de dahil olmak üzere işin çoğunu yapması gerekiyor. Uygulamalar daha sonra verileri depolamak / almak için ortak bir arayüzle çalışıyor, böylece verilerin nasıl depolandığına dikkat etmeleri gerekmiyor. Bu görevin önemsiz olmaktan uzak olduğunun farkındayım.
magnattic

Ayrıca, şu an için Enterprise Edition’ı düşünmüyorum ya da bu durumda karar vermemiz gereken bir etmen değil. Bahsettiğim gelecekteki uygulamalar büyük olasılıkla bizim tarafımızdan inşa edilecek ve barındırılacak.
magnattic

@ atticae, Çerçevenizin veritabanı ile sınırlı olması gerekmez, veritabanı dışında çalışan kod içerebilir.
Ian Ringrose

Tabii ki veritabanı ile sınırlı değil. (Bu durumda buna çerçeve demem.) Şimdi "uygulama seviyesi" ile ne demek istediğinizi anlıyorum ve şu anda bağlantınızın bahsettiği Temporal Mülkiyet modelinin bir varyasyonunu kullanıyorum. Yaptığım çerçeve bu arayüzü, onu kullanan uygulamalara sunuyor. Yine de, bu arayüz tarafının bir parçasıdır ve bunların hiçbiri yukarıda belirtilen sorularıma cevap vermiyor.
magnattic

Cevabınız için tekrar teşekkürler. Bu muhtemelen çoğu insan için belirleyici faktördür, bu yüzden bence bunun iyi bir cevap olduğunu ve muhtemelen gelecekteki ziyaretçilerin CDC kullanmamaya karar vermelerine yardımcı olduğunu düşünüyorum. Ancak, sorularımın çoğuna gerçekten cevap vermediğini hissediyorum, bu yüzden sahip olduğum tüm soruları cevaplamaya çalışan tek kişi olan stacylaray'e ödül vermek zorunda kalacağım. (Her ne kadar biraz daha ayrıntılı bir cevap almayı umuyordum.)
Magnattic

12

İşte SQL Server veri değişikliklerini denetlemenin farklı yollarını gözden geçiren çok iyi yazılmış bir 9 bölüm serisi. 3, 4 ve 5. bölümler CDC'ye odaklanmıştır. Tüm makaleleri okumaya değer çünkü bu özelliklerin uygun ve ek yüke sahip olacağı farklı senaryolar gibi sorularınızı cevaplayacaktır. http://solutioncenter.apexsql.com/tag/methods-for-auditing-sql-server


1
Makaleyi gözden geçirdikten sonra hala daha akıllı değilim. Çoğu makalede CDC'nin nasıl kullanılacağı ve Takibi Değiştirme ile nasıl karşılaştırılacağı ayrıntılı olarak ele alınmaktadır. Bu benim yukarıdaki sorularıma cevap vermiyor ama.
magnattic

9

Hangi görevler / senaryolar için CDC doğru araç? (örneğin, kullanıcıların bir veri nesnesini zaman içindeki belirli bir noktaya geri getirmesine izin vermek?

Belki de değişir.

Denetim?

Evet.

Veri geçmişinin tamamı gösteriliyor mu?)

Evet.

Ne zaman CDC'yi kullanmamayı tercih edersiniz, ancak özel bir tetikleyici tabanlı çözüme başvurmalısınız?

Değişim tablosundaki veriler ihtiyaçlarınızı karşılamadığında.

CDC'yi operasyonel bir veritabanında kullanmak ve CDC verilerini operasyonel bir uygulamada kullanmak uygun mudur? (örneğin, son kullanıcıya gösterme)

Evet.

Yoksa bu açıkça bu özelliğin kötüye kullanılması mı?

Hayır, bu özelliğin kötüye kullanılması değildir.

Genelde CDC'nin bir denetim aracı olduğunu duyuyorum, ancak SQL Server Audit bunun için değil mi?

Evet.

Her ikisi de aynı görev için farklı araçlar mı?

Yok hayır.

Veya CDC başka şeyler için kullanılabilir mi?

CDC başka şeyler için kullanılabilir.

Değişiklik Takibi ve Veri Yakalama Değişikliği var. Her ikisinde de kökleri çoğaltmada bulunur.

Değişikliği İzleme, tablodaki net değişiklikleri sağlamanın bir yolunu sağlar. Kullanım örneği, elde tutulan bir cihaz senkronizasyonu olabilir.

Öte yandan CDC, her küçük değişikliğin kaydını tutar. Biri, veriye toplu kopyalama yerine bir veri ambarını güncellemek için bu geçmişi kullanabilir veya biri bu geçmişi veri olarak kullanabilir ve raporlarını oluşturabilir. Değişim tablosu gizlenmemiş ya da garip bir şema ya da bir şey var. Sorgulayabilir ve verileri istediğiniz şekilde kullanabilirsiniz. Sadece aklında tut ... Ian'ın dediği gibi gerçek zaman değil. Veriler işlem günlüğünden gelir, bu nedenle çoğaltma, yansıtma veya günlük gönderiminde yaptığınız gibi dikkat edin. Genel olarak, tetikleyicilerden daha hızlı olacaktır. Ek yükü olan Anlık Görüntü İzolasyonunu kullanmanız ve Afet Kurtarması hakkında düşünmeniz gerekecektir.


2

Bir düzeltme noktası. Bir zamanlar, değişiklik verileri yakalama yalnızca yukarıda listelenen sürümlerde mevcuttu. Ancak, değişiklik verisi yakalama, 2016 SP1'den itibaren standart sürümde sağlanmıştır. Bu nedenle, 2016 SP1'den önce yazılmış birçok makale, CDC'yi Standard baskısını kullananlar için ulaşılmazmış gibi ses çıkarır. Bu artık böyle değil. CDC'nin mevcut olduğunu gösteren Microsoft doc aşağıdaki bağlantıdadır.

https://docs.microsoft.com/en-us/sql/sql-server/editions-and-components-of-sql-server-2016?view=sql-server-2017#DW

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.