{"id":1498,"date":"2008-09-29T21:30:24","date_gmt":"2008-09-29T19:30:24","guid":{"rendered":"http:\/\/www.glorf.it\/blog\/?p=1498"},"modified":"2008-09-29T21:30:24","modified_gmt":"2008-09-29T19:30:24","slug":"benannte-constraints-auf-temporaeren-tabellen","status":"publish","type":"post","link":"http:\/\/www.glorf.it\/blog\/2008\/09\/29\/sql-talk\/benannte-constraints-auf-temporaeren-tabellen","title":{"rendered":"benannte Constraints auf tempor&#228;ren Tabellen"},"content":{"rendered":"<p>Es gibt Dinge, die tut man einfach nicht. Ja, wirklich, da gibt es weltweite ungeschrieben Gesetze. Zum Beispiel nimmt man keine Stifte von anderen Leuten mit und von Kollegen schon gleich gar nicht. Dennoch passiert sowas immer wieder.<\/p>\n<p>Genauso benutzt man in Prozeduren keine tempor&#228;ren Tabellen. Au&#223;er vielleicht in wenigen Ausnahmen, wo der Overhead kaum ins Gewicht f&#228;llt und sogar die Abl&#228;ufe etwas vereinfacht. Aber auf diese Tabellen legt man keine benannten Constraints an. Warum auch? Will man die separat wieder entfernen k&#246;nnen? Wenn &#252;berhaupt, dann also bitte nur &quot;inline&quot;. Wer anderer Meinung ist, der m&#246;ge weiter lesen&#8230;<\/p>\n<p>Der Name von benannte Constraints muss auch auf tempor&#228;ren Tabellen datenbank-weit eindeutig sein. Wenn die Prozedur also parallel ausgef&#252;hrt wird (daf&#252;r sind Prozeduren ja da), dann knallt es. Folgender Code in zwei Session gleichzeitig ausgef&#252;hrt, ist ungesund:<br \/>\n<code lang=\"sql\">IF object_id('tempdb..#bla') IS NOT NULL<br \/>\n\tDROP TABLE #bla<\/p>\n<p>CREATE TABLE #bla<br \/>\n(ID\t\tint)<\/p>\n<p>ALTER TABLE #bla<br \/>\n\tADD CONSTRAINT c_bla_check CHECK (ID > 0)<\/code><\/p>\n<p>In der zweiten Sitzung kommen dann diese netten Meldungen:<\/p>\n<p><code>Msg 2714, Level 16, State 4, Line 1<br \/>\nThere is already an object named &#x0027;c_bla_check&#x0027; in the database.<br \/>\nMsg 1750, Level 16, State 0, Line 1<br \/>\nCould not create constraint. See previous errors.<\/code><\/p>\n<p>Das passiert mit jedem benannten Constraint, auch mit Fremd- und Prim&#228;rschl&#252;sseln &#8211; bei Indexen hingegen nicht. Dabei spricht wenig gegen anst&#228;ndige &quot;inline&quot; definierte Constraints in tempor&#228;ren Tabellen (au&#223;er der Performance, die verbraten wird, nat&#252;rlich):<\/p>\n<p><code lang=\"sql\">IF object_id('tempdb..#bla') IS NOT NULL<br \/>\n\tDROP TABLE #bla<\/p>\n<p>CREATE TABLE #bla<br \/>\n(ID\t\tint<br \/>\n\tCHECK (ID > 0))<\/code><\/p>\n<p>Diesen Hinweis bekam ich &#252;brigens von meinem Kollegen Markus. Danke!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Es gibt Dinge, die tut man einfach nicht. Ja, wirklich, da gibt es weltweite ungeschrieben Gesetze. Zum Beispiel nimmt man keine Stifte von anderen Leuten mit und von Kollegen schon gleich gar nicht. Dennoch passiert sowas immer wieder. Genauso benutzt man in Prozeduren keine tempor&#228;ren Tabellen. Au&#223;er vielleicht in wenigen Ausnahmen, wo der Overhead kaum [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[3],"tags":[155,309],"_links":{"self":[{"href":"http:\/\/www.glorf.it\/blog\/wp-json\/wp\/v2\/posts\/1498"}],"collection":[{"href":"http:\/\/www.glorf.it\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.glorf.it\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.glorf.it\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.glorf.it\/blog\/wp-json\/wp\/v2\/comments?post=1498"}],"version-history":[{"count":3,"href":"http:\/\/www.glorf.it\/blog\/wp-json\/wp\/v2\/posts\/1498\/revisions"}],"predecessor-version":[{"id":1501,"href":"http:\/\/www.glorf.it\/blog\/wp-json\/wp\/v2\/posts\/1498\/revisions\/1501"}],"wp:attachment":[{"href":"http:\/\/www.glorf.it\/blog\/wp-json\/wp\/v2\/media?parent=1498"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.glorf.it\/blog\/wp-json\/wp\/v2\/categories?post=1498"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.glorf.it\/blog\/wp-json\/wp\/v2\/tags?post=1498"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}