SQL Server Change Data Capture to funkcja, która odczytuje dane historyczne z dzienników transakcji SQL Server i przechowuje je w specjalnej tabeli.
Dzięki zastosowaniu specjalnych funkcji wartości tabeli (TVF) umożliwia to użytkownikowi wysłanie zapytania do tych danych, co umożliwia albo uzyskanie wszystkich zmian w konkretnej tabeli, albo tylko zmian netto wynikających ze zmian w określonym czasie.
CDC ma pewne zalety
- Można go skonfigurować tak, aby śledził tylko niektóre tabele lub kolumny.
- Jest w stanie obsłużyć zmiany modelu do pewnego stopnia.
- Nie wpływa to na wydajność tak mocno, jak wyzwalacze, ponieważ działa z dziennikami transakcji.
- Można go łatwo włączyć / wyłączyć i nie wymaga dodatkowych kolumn w tabeli, które należy śledzić.
Ma również pewne wady:
- Ilość danych historycznych może szybko stać się ogromna.
- Nie możesz śledzić, kto dokonał zmian (przynajmniej nie w przypadku usuwania).
- Nadrobienie danych historycznych zajmuje trochę czasu, ponieważ opiera się na dziennikach transakcji.
- To zależy od agenta SQL Server. Jeśli agent nie działa lub ulega awarii, historia nie jest śledzona.
Dużo czytałem o CDC i chociaż wiem, jak go używać, wciąż nie jestem pewien, czy jest to właściwe narzędzie dla mnie.
- Do jakich zadań / scenariuszy CDC jest właściwym narzędziem? (np. Zezwalanie użytkownikom na przywrócenie obiektu danych do określonego momentu w czasie? Audyt? Wyświetlanie pełnej historii danych?)
- Kiedy raczej nie powinieneś używać CDC, ale skorzystać z niestandardowego rozwiązania opartego na wyzwalaczach?
- Czy można używać CDC w operacyjnej bazie danych i korzystać z danych CDC w działającej aplikacji? (np. pokazanie go użytkownikowi końcowemu) Czy to wyraźnie niewłaściwe użycie tej funkcji?
Często słyszę, że CDC to narzędzie do inspekcji, ale czy nie po to służy SQL Server Audit ? Czy oba są różnymi narzędziami do tego samego zadania? A może CDC może być używany do innych celów?
Mój obecny scenariusz jest taki, że poproszono mnie o zbudowanie niezawodnej struktury danych, która ma być podstawą wielu przyszłych aplikacji. Dokładne wymagania są rozmyte, ale jednym z nich jest to, że powinien móc śledzić historię danych i przywracać starsze wpisy wraz ze wszystkimi powiązanymi danymi z innych tabel. W tej chwili oceniam CDC jako opcję, ale nie jestem pewien, czy jest to właściwy sposób, ponieważ tak naprawdę nie mogę znaleźć zalecanych przypadków użycia.
Chociaż doceniam porady dotyczące mojego konkretnego scenariusza, odpowiedzi powinny zawierać ogólne porady dotyczące tego, kiedy i kiedy nie należy używać funkcji przechwytywania danych.
źródło
Odpowiedzi:
Po pierwsze,
To może zdecydować, czy któryś z twoich klientów nie będzie miał wersji Enterprise, czy jeszcze nie wiesz, że będziesz używać wersji Enterprise. (Ponieważ specyfikacja obejmuje „wiele przyszłych aplikacji”, może to być dla Ciebie poważny problem)
W przeciwieństwie do wyzwalaczy, nie jest to czas rzeczywisty, jest to zarówno zaleta, jak i wada. Używanie wyzwalaczy zawsze spowalnia aktualizację.
Pracowałem na jednym systemie, kiedy korzystaliśmy z wyzwalaczy (generowanych przez CodeSmith), a także śledząc wszystkie zmiany w rekordach, połączyliśmy również zmiany z tabelą „historii”, która zawiera moduł aplikacji, która dokonała zmiany, oraz element interfejsu użytkownika, którego użytkownik dokonał zmiany.
Jednak najlepiej rozwiązać to na poziomie aplikacji, pisząc całą aktualizację do kolejki wiadomości, która jest następnie odtwarzana w celu utworzenia bazy danych w dowolnym momencie, zobacz Wzorce czasowe na blogu Martina Flowlera, aby uzyskać dobry przegląd opcji.
źródło
Oto bardzo dobrze napisana 9-częściowa seria, która omawia różne sposoby kontrolowania zmian danych programu SQL Server. Części 3, 4 i 5 koncentrują się na CDC. Warto przeczytać wszystkie artykuły, ponieważ to odpowie na twoje pytania, takie jak różne scenariusze, w których funkcje byłyby odpowiednie i narzutowe. http://solutioncenter.apexsql.com/tag/methods-for-auditing-sql-server
źródło
Może to zależy.
Tak.
Tak.
Gdy dane w tabeli zmian nie spełniają twoich potrzeb.
Tak.
Nie, to nie jest niewłaściwe użycie tej funkcji.
Tak.
Nie.
CDC można wykorzystać do innych celów.
Istnieje śledzenie zmian i przechwytywanie zmian danych. Oba mają swoje korzenie w replikacji.
Śledzenie zmian zapewnia sposób na wprowadzenie zmian netto w tabeli. Przykładem może być ręczna synchronizacja urządzeń.
Z drugiej strony CDC śledzi każdą drobną zmianę, historię. Można użyć tej historii do aktualizacji hurtowni danych zamiast masowego kopiowania danych, lub można użyć tej historii jako samych danych i generować z nich raporty. Tabela zmian nie jest ukryta, nie ma też dziwnego schematu ani czegoś takiego. Możesz wykonać zapytanie i korzystać z danych w dowolny sposób. Pamiętaj tylko ... to nie jest czas rzeczywisty, jak powiedział Ian. Dane pochodzą z dziennika transakcji, więc zadbaj o to, jakbyś używał replikacji, kopii lustrzanej lub wysyłki dziennika. Zasadniczo będzie to szybsze niż wyzwalacze. Będziesz musiał użyć Snapshot Isolation, która ma narzut, i będziesz musiał pomyśleć o Disaster Recovery.
źródło
Punkt korekty. W pewnym momencie zmiana przechwytywania danych była dostępna tylko w wersjach wymienionych powyżej. Jednak przechwytywanie danych zmian stało się dostępne w wersji standardowej od SP1 2016. Dlatego wiele artykułów napisanych przed SP1 2016 brzmi, jakby CDC było poza zasięgiem tych z nas, którzy korzystają z edycji Standard. Tak już nie jest. Dokument Microsoft opisujący dostępne CDC znajduje się w linku poniżej.
https://docs.microsoft.com/en-us/sql/sql-server/editions-and-components-of-sql-server-2016?view=sql-server-2017#DW
źródło