{"id":238,"date":"2013-10-05T11:31:35","date_gmt":"2013-10-05T10:31:35","guid":{"rendered":"http:\/\/csopro.de\/biblog\/2013\/10\/sichere-logging-tabellen-wegen-identity\/"},"modified":"2014-12-31T18:26:12","modified_gmt":"2014-12-31T17:26:12","slug":"sichere-logging-tabellen-wegen-identity","status":"publish","type":"post","link":"https:\/\/www.csopro.de\/biblog\/2013\/10\/sichere-logging-tabellen-wegen-identity\/","title":{"rendered":"Sichere Logging-Tabellen trotz @@identity"},"content":{"rendered":"<p>In meinem letzten Blog-Eintrag hatte ich geschrieben, man solle m\u00f6glichst scope_identity() statt @@identity verwenden.<\/p>\n<p>Ich hatte bei einem Kunden genau den Fall, dass wir nachtr\u00e4glich in einer bestehenden Datenbank-Applikation \u00fcber Trigger Protokollierungen erstellen wollten, um genauere Informationen \u00fcber ein Fehlverhalten zu bekommen. <\/p>\n<p>Deshalb legten wir eine Logging-Tabelle an, die die entsprechenden Informationen aufnehmen sollte und einen Trigger auf bestimmte Tabellen, um diese Informationen zu sammeln und wegzuschreiben.<\/p>\n<p>Leider hatte der damalige Entwickler @@identity und nicht scope_identity() verwendet, so dass eine Identity-Column in unserer Logging-Tabelle zu Fehlern f\u00fchrte: Beim INSERT erh\u00e4lt das aufrufende Programm eine falsche ID. Hoffentlich ist das Programm sonst sauber programmiert, dann wird man dies wahrscheinlich \u00fcber krachende Foreign Key-Beziehungen erfahren.<\/p>\n<p>Wir kann man so ein Problem aber l\u00f6sen, wenn man nichts von dem zugrunde liegenden Programm wei\u00df?<\/p>\n<p>Man&#160; k\u00f6nnte die Identity-Column in der Logging-Tabelle entfernen und stattdessen Unique Identifiers verwenden. Ich hatte ja schon einiges \u00fcber die Nachteile von Unique Identifiers geschrieben. <\/p>\n<p>In diesem Fall scheint es mir aber gerechtfertigt. Nat\u00fcrlich muss man die Spalte mit newSequentialId() initialisieren, also etwa so:<\/p>\n<blockquote>\n<p>CREATE TABLE [dbo].[Logging](     <br \/>&#160;&#160;&#160; [LogID] [uniqueidentifier]&#160; NOT NULL default(newSequentialId()),      <br \/>&#160;&#160;&#160; [Timestamp] [datetime] NOT NULL default(getdate()),      <br \/>&#160;&#160;&#160; [Logtext] [nvarchar](max) NULL,      <br \/> CONSTRAINT [PK_Logging] PRIMARY KEY CLUSTERED       <br \/>(      <br \/>&#160;&#160;&#160; [LogID] ASC      <br \/>)      <br \/>)      <\/p>\n<\/blockquote>\n<p>Dann ist die \u00c4nderung unsch\u00e4dlich f\u00fcr den uns unbekannten Code, der m\u00f6glicherweise @@identity verwendet.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In meinem letzten Blog-Eintrag hatte ich geschrieben, man solle m\u00f6glichst scope_identity() statt @@identity verwenden. Ich hatte bei einem Kunden genau den Fall, dass wir nachtr\u00e4glich in einer bestehenden Datenbank-Applikation \u00fcber Trigger Protokollierungen erstellen wollten, um genauere Informationen \u00fcber ein Fehlverhalten zu bekommen. Deshalb legten wir eine Logging-Tabelle an, die die entsprechenden Informationen aufnehmen sollte und &hellip; <a href=\"https:\/\/www.csopro.de\/biblog\/2013\/10\/sichere-logging-tabellen-wegen-identity\/\" class=\"more-link\"><span class=\"screen-reader-text\">Sichere Logging-Tabellen trotz @@identity<\/span> weiterlesen <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[12],"tags":[21,20],"class_list":["post-238","post","type-post","status-publish","format-standard","hentry","category-sqlserver","tag-guid","tag-identity"],"_links":{"self":[{"href":"https:\/\/www.csopro.de\/biblog\/wp-json\/wp\/v2\/posts\/238","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.csopro.de\/biblog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.csopro.de\/biblog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.csopro.de\/biblog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.csopro.de\/biblog\/wp-json\/wp\/v2\/comments?post=238"}],"version-history":[{"count":1,"href":"https:\/\/www.csopro.de\/biblog\/wp-json\/wp\/v2\/posts\/238\/revisions"}],"predecessor-version":[{"id":265,"href":"https:\/\/www.csopro.de\/biblog\/wp-json\/wp\/v2\/posts\/238\/revisions\/265"}],"wp:attachment":[{"href":"https:\/\/www.csopro.de\/biblog\/wp-json\/wp\/v2\/media?parent=238"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.csopro.de\/biblog\/wp-json\/wp\/v2\/categories?post=238"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.csopro.de\/biblog\/wp-json\/wp\/v2\/tags?post=238"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}