{"id":76,"date":"2011-04-04T19:59:17","date_gmt":"2011-04-04T19:59:17","guid":{"rendered":"http:\/\/www.flip-design.de\/?p=76"},"modified":"2011-04-06T20:04:10","modified_gmt":"2011-04-06T20:04:10","slug":"cdc-zeilen-versionierung","status":"publish","type":"post","link":"https:\/\/www.flip-design.de\/?p=76","title":{"rendered":"CDC &#8211; Zeilen Versionierung"},"content":{"rendered":"<p><a href=\"http:\/\/www.flip-design.de\/wp-content\/uploads\/2011\/04\/CDC.png\"><img decoding=\"async\" loading=\"lazy\" class=\"alignleft size-full wp-image-78\" title=\"CDC\" src=\"http:\/\/www.flip-design.de\/wp-content\/uploads\/2011\/04\/CDC.png\" alt=\"\" width=\"86\" height=\"86\" \/><\/a>In diesem Blog Eintrag geht es um Change Data Capture (CDC). Dieses Werkzeug im Microsoft SQL Server 2008 (verf\u00fcgbar (leider) ab der Enterprise Edition) dient nicht f\u00fcr das Autiting von Benutzern sondern um Daten zu versionieren und so Ver\u00e4nderungen oder Bewegungen auswerten oder wiederherstellen zu k\u00f6nnen. Das bedeutet, jede Tabelle in der CDC aktiviert ist, wird entsprecht mit protokolliert und die \u00c4nderungen werden in einer eigenen Systemtabelle pro Objekt gespeichert. Wie man zu erst vermuten m\u00f6chte, handelt es sich nicht um typische DML Trigger sondern um eine Technologie, die direkt vom Transaktionslog liest und somit sicher die Datenbewegungen registriert.<\/p>\n<p>Als Fallbeispiel wird eine Buchungstabelle &#8222;\u00fcberwacht&#8220;:<br \/>\n<code>CREATE TABLE dbo.buchungen (<br \/>\nuid uniqueidentifier default newid() not null primary key,<br \/>\nbuchungsid int not null,<br \/>\nbuchungswert money not null,<br \/>\nbuchungsdatum datetime not null);<br \/>\nGO<\/code><\/p>\n<p>\u00dcber folgenden Befehl wird CDC in der Datenbank aktiviert:<br \/>\n<code>EXEC sys.sp_cdc_enable_db<br \/>\nGO<\/code><\/p>\n<p>Nun wird CDC f\u00fcr die Tabelle aktiviert:<br \/>\n<code>EXEC sys.sp_cdc_enable_table<br \/>\n@source_schema = N'dbo',<br \/>\n@source_name\u00a0\u00a0 = N'buchungen',<br \/>\n@role_name\u00a0\u00a0\u00a0\u00a0 = NULL,<br \/>\n@supports_net_changes = 1<br \/>\nGO<\/code><\/p>\n<p>Nun f\u00fcgen wir einen Datensatz in die Buchungstabelle ein:<br \/>\n<code>INSERT INTO dbo.buchungen (buchungsid, buchungswert, buchungsdatum)<br \/>\nVALUES (1, 200, GETDATE());<br \/>\nGO<\/code><\/p>\n<p>Zuletzt ver\u00e4ndern wir diesen Datensatz nochmal:<br \/>\n<code>UPDATE dbo.buchungen SET buchungswert = 17300 WHERE buchungsid = 1<br \/>\nGO<\/code><\/p>\n<p>Mit folgender Abfrage kann die Datenver\u00e4nderung dargestellt werden mit den jeweiligen Statis:<br \/>\n<code>SELECT<br \/>\nCASE __$operation<br \/>\nWHEN 1 THEN 'DELETED'<br \/>\nWHEN 2 THEN 'INSERTED'<br \/>\nWHEN 3 THEN 'BEFORE UPDATED'<br \/>\nWHEN 4 THEN 'AFTER UPDATED'<br \/>\nEND 'Aktion', buchungsid, buchungswert, buchungsdatum FROM cdc.dbo_buchungen_CT<\/code><\/p>\n<p>Ergebnis:<br \/>\n<a href=\"http:\/\/www.flip-design.de\/wp-content\/uploads\/2011\/04\/CDC_Result.png\"><img decoding=\"async\" loading=\"lazy\" class=\"size-full wp-image-77 alignnone\" title=\"CDC_Result\" src=\"http:\/\/www.flip-design.de\/wp-content\/uploads\/2011\/04\/CDC_Result.png\" alt=\"\" width=\"433\" height=\"76\" srcset=\"https:\/\/www.flip-design.de\/wp-content\/uploads\/2011\/04\/CDC_Result.png 433w, https:\/\/www.flip-design.de\/wp-content\/uploads\/2011\/04\/CDC_Result-300x52.png 300w\" sizes=\"(max-width: 433px) 100vw, 433px\" \/><\/a><\/p>\n<p>Weitere Informationen zu den Statis gibt es hier:<br \/>\n<a href=\"http:\/\/technet.microsoft.com\/en-us\/library\/bb522511.aspx\" target=\"_blank\">http:\/\/technet.microsoft.com\/en-us\/library\/bb522511.aspx<\/a><\/p>\n<p>Sobald CDC aktiviert wird, werden folgende Tabellen erstellt:<\/p>\n<ul>\n<li>cdc.change_tables<br \/>\nEnth\u00e4lt alle CDC \u00fcberwachten Tabellen<\/li>\n<li>cdc.captured_columns<br \/>\nEnth\u00e4lt die Felder der CDC \u00fcberwachten Tabellen<\/li>\n<li>cdc.dbo_buchungen_CT<br \/>\nEine solche Tabelle wird f\u00fcr jedes CDC Objekt erstellt und speichert die Daten\u00e4nderungen<\/li>\n<li>cdc.ddl_history<br \/>\nSpeichert \u00c4nderungen an der CDC \u00fcberwachten Tabelle<\/li>\n<li>cdc.index_columns<br \/>\nEnth\u00e4lt die Index Felder der CDC Tabellen<\/li>\n<li>cdc.lsn_time_mapping<br \/>\n\u00dcber diese Tabelle kann nachvollzogen werden, wann welche \u00c4nderung durchgef\u00fchrt wurde. Dies kann anhand der LSN mit der Benutzertabelle verglichen werden.<\/li>\n<\/ul>\n<p>Weitere Informationen zu den Tabellen gibt es hier: <a title=\"http:\/\/technet.microsoft.com\/de-de\/library\/bb500353.aspx\" href=\"http:\/\/technet.microsoft.com\/de-de\/library\/bb500353.aspx\" target=\"_blank\">http:\/\/technet.microsoft.com\/de-de\/library\/bb500353.aspx<\/a><\/p>\n<p>Weiterhin erstellt CDC noch zwei SQL Agent Jobs:<\/p>\n<ol>\n<li>cdc.CDC_capture<br \/>\nDieser Job steuert CDC f\u00fcr die jeweiligen konfigurierten Objekte die f\u00fcr CDC aktiviert worden sind<\/li>\n<li>cdc.CDC_cleanup<br \/>\nEntfernt abgelaufene, bzw. deaktivierte CDC Objekte die sonst vom Capture Job ausgef\u00fchrt werden<\/li>\n<\/ol>\n<p>Hinweis:<br \/>\nDas Wiederherstellungsmodell f\u00fcr CDC ist nicht relavant. CDC liest lediglich aus dem Aktiven Teil des Transaktionslog und somit wir auch das Einfache Wiederherstellungsmodell unterst\u00fctzt.<\/p>\n<p>Fazit:<br \/>\nCDC eignet sich hervorragend f\u00fcr Auswertungszwecke um Datenver\u00e4nderungen zu speichern und darzustellen. Eine Speicherung von Benutzernamen etc. ist nicht vorgesehen und k\u00f6nnte max. selber durch DML Trigger hinzugef\u00fchrt werden.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In diesem Blog Eintrag geht es um Change Data Capture (CDC). Dieses Werkzeug im Microsoft SQL Server 2008 (verf\u00fcgbar (leider) ab der Enterprise Edition) dient nicht f\u00fcr das Autiting von Benutzern sondern um Daten zu versionieren und so Ver\u00e4nderungen oder &hellip; <a href=\"https:\/\/www.flip-design.de\/?p=76\">Continue reading <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0},"categories":[10,7,3],"tags":[],"_links":{"self":[{"href":"https:\/\/www.flip-design.de\/index.php?rest_route=\/wp\/v2\/posts\/76"}],"collection":[{"href":"https:\/\/www.flip-design.de\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.flip-design.de\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.flip-design.de\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.flip-design.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=76"}],"version-history":[{"count":6,"href":"https:\/\/www.flip-design.de\/index.php?rest_route=\/wp\/v2\/posts\/76\/revisions"}],"predecessor-version":[{"id":84,"href":"https:\/\/www.flip-design.de\/index.php?rest_route=\/wp\/v2\/posts\/76\/revisions\/84"}],"wp:attachment":[{"href":"https:\/\/www.flip-design.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=76"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.flip-design.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=76"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.flip-design.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=76"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}