{"id":65,"date":"2011-03-24T16:57:35","date_gmt":"2011-03-24T16:57:35","guid":{"rendered":"http:\/\/www.flip-design.de\/?p=65"},"modified":"2011-04-06T20:06:12","modified_gmt":"2011-04-06T20:06:12","slug":"datenbank-trigger-loggen-von-datenbank-anderungen","status":"publish","type":"post","link":"https:\/\/www.flip-design.de\/?p=65","title":{"rendered":"Datenbank Trigger: Loggen von Datenbank \u00c4nderungen"},"content":{"rendered":"<p><a href=\"http:\/\/www.flip-design.de\/wp-content\/uploads\/2011\/04\/dbtrigger_scheme.png\"><img decoding=\"async\" loading=\"lazy\" class=\"alignleft size-full wp-image-66\" title=\"dbtrigger_scheme\" src=\"http:\/\/www.flip-design.de\/wp-content\/uploads\/2011\/04\/dbtrigger_scheme.png\" alt=\"\" width=\"129\" height=\"157\" \/><\/a>In diesem Blog Eintrag geht es wie im vorherigen Eintrag &#8222;Loggen von Berechtigungen&#8220; um das Protokollieren von  \u00c4nderungen. Hier werden daf\u00fcr aber jegliche Struktur \u00c4nderungen an der Datenbank  protokolliert. So kann ein Datenbank Administrator pr\u00fcfen, welche \u00c4nderungen an  der Datenbank durchgef\u00fchrt wurden.<br \/>\nIn diesem Beispiel soll zus\u00e4tzlich eine  Pr\u00fcfung implementiert werden, die erm\u00f6glicht eine Checksumme zu erstellen die  bspw. Software Herstellern erlaubt zu pr\u00fcfen, ob jegliche Anpassungen in einem  \u00c4nderungsscript erfolgreich durchgef\u00fchrt wurden.<\/p>\n<p>In der folgenden  Tabelle wird dann jegliches XML erfasst, was der DDL Trigger erfassen soll.  Zus\u00e4tzlich wird hier auch die Checksumme gespeichert: <code><br \/>\nCREATE TABLE  dbo.logDbTracking (<br \/>\nuid uniqueidentifier default newid() not null primary  key,<br \/>\nxmltext XML NULL,<br \/>\nchecksumme INT NULL,<br \/>\ndatum DATETIME  DEFAULT GETDATE() NOT NULL,<br \/>\n);<\/code><br \/>\nNun wird der Trigger erstellt. Dieser  Trigger erfasst mehrere <a href=\"http:\/\/msdn.microsoft.com\/de-de\/library\/bb510452.aspx\" target=\"_blank\">DDL  Ereignisgruppen<\/a>:<\/p>\n<ul>\n<li>DDL_TABLE_EVENTS<br \/>\nCREATE, ALTER, DROP TABLE<\/li>\n<li>DDL_VIEW_EVENTS<br \/>\nCREATE, ALTER, DROP VIEW<\/li>\n<li>DDL_INDEX_EVENTS<br \/>\nCREATE, ALTER, DROP INDEX, beinhaltet auch Volltext  Indizes<\/li>\n<li>DDL_FUNCTION_EVENTS<br \/>\nCREATE, ALTER, DROP FUNCTION<\/li>\n<li>DDL_PROCEDURE_EVENTS<br \/>\nCREATE, ALTER, DROP PROCEDURE<\/li>\n<li>DDL_TRIGGER_EVENTS<br \/>\nCREATE, ALTER, DROP TRIGGER<\/li>\n<\/ul>\n<p>Der Trigger  schreibt in die Tabelle f\u00fc alle erfassten Events das XML wie auch aus dem XML  eine erstelle Checksumme. <code><br \/>\nCREATE TRIGGER TR_DBChangeTracking<br \/>\nON  DATABASE<br \/>\nFOR<br \/>\nDDL_TABLE_EVENTS, DDL_VIEW_EVENTS,<br \/>\nDDL_INDEX_EVENTS, DDL_FUNCTION_EVENTS,<br \/>\nDDL_PROCEDURE_EVENTS,  DDL_TRIGGER_EVENTS<br \/>\nAS<br \/>\nSET NOCOUNT ON<br \/>\nSET QUOTED_IDENTIFIER  ON<\/code><\/p>\n<p><code>DECLARE @xmlData XML<br \/>\nSELECT @xmlData =  EVENTDATA()<br \/>\nDECLARE @cmdText NVARCHAR(MAX)<br \/>\nSET @cmdText =  EVENTDATA().value('(\/EVENT_INSTANCE\/TSQLCommand\/CommandText)[1]',  'nvarchar(MAX)')<\/code><\/p>\n<p><code>INSERT INTO dbo.logDbTracking<br \/>\n(xmltext,  checksumme)<br \/>\nVALUES (<br \/>\n@xmlData,<br \/>\nCHECKSUM(@cmdText)<br \/>\n);<br \/>\nSET QUOTED_IDENTIFIER OFF<br \/>\nSET NOCOUNT  OFF<\/code><\/p>\n<p>Nun werden jegliche strukturellen \u00c4nderungen an der Datenbank  entsprechend protokolliert. Aus jedem protokollierten TSQL Statement wird in der  Tabelle eine Checksumme gebildet. So erh\u00e4lt man die M\u00f6glichkeit einen Abgleich  \u00fcber die Vollst\u00e4ndigkeit durchzuf\u00fchren.<\/p>\n<p>Hinweis: Oben stehendes Script  funktioniert sowohl auf einem Microsoft SQL Server 2005 wie auch unter 2008  (R2).<\/p>\n<p><strong>Download:<\/strong><\/p>\n<ul>\n<li><a href=\"download\/SQLServer_DDL_Schema.pdf\" target=\"_blank\">Download  Script<\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>In diesem Blog Eintrag geht es wie im vorherigen Eintrag &#8222;Loggen von Berechtigungen&#8220; um das Protokollieren von \u00c4nderungen. Hier werden daf\u00fcr aber jegliche Struktur \u00c4nderungen an der Datenbank protokolliert. So kann ein Datenbank Administrator pr\u00fcfen, welche \u00c4nderungen an der Datenbank &hellip; <a href=\"https:\/\/www.flip-design.de\/?p=65\">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\/65"}],"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=65"}],"version-history":[{"count":6,"href":"https:\/\/www.flip-design.de\/index.php?rest_route=\/wp\/v2\/posts\/65\/revisions"}],"predecessor-version":[{"id":87,"href":"https:\/\/www.flip-design.de\/index.php?rest_route=\/wp\/v2\/posts\/65\/revisions\/87"}],"wp:attachment":[{"href":"https:\/\/www.flip-design.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=65"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.flip-design.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=65"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.flip-design.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=65"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}