{"id":130,"date":"2010-03-16T22:49:38","date_gmt":"2010-03-16T21:49:38","guid":{"rendered":"http:\/\/csopro.de\/biblog\/2010\/03\/verhalten-von-views-bei-strukturaenderungen-der-zugrundeliegenden-tabellen\/"},"modified":"2010-03-16T22:49:38","modified_gmt":"2010-03-16T21:49:38","slug":"verhalten-von-views-bei-strukturaenderungen-der-zugrundeliegenden-tabellen","status":"publish","type":"post","link":"https:\/\/www.csopro.de\/biblog\/2010\/03\/verhalten-von-views-bei-strukturaenderungen-der-zugrundeliegenden-tabellen\/","title":{"rendered":"Verhalten von Views bei Struktur\u00e4nderungen der zugrundeliegenden Tabellen"},"content":{"rendered":"<p>Ein View, der mittels * alle Spalten einer verwendeten Tabelle zur\u00fcckgibt, wie z.B.<\/p>\n<blockquote>\n<p>CREATE VIEW dbo.testView<br \/>\nAS<br \/>\nSELECT u.*, k.name as Kunden_Name, k.AnzahlKinder<br \/>\nFROM umsatz u<br \/>\nINNER JOIN kunde k<br \/>\nON k.kunde_id = u.kunde_id<\/p>\n<\/blockquote>\n<p>verh\u00e4lt sich \u00fcberaschend, wenn sich die Tabellenstruktur der zugrunde liegenden Tabellen \u00e4ndert. Die Metainformationen aktualisieren sich n\u00e4mlich nicht automatisch, was sogar zu Datentypsverletzungen f\u00fchren kann.<\/p>\n<p>Nehmen wir an, die Tabelle umsatz aus obigen Beispiel habe folgenden Inhalt:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" alt=\"Inhalt der Tabelle Umsatz\" src=\"https:\/\/www.csopro.de\/biblog\/wp-content\/uploads\/2010\/03\/tabelleumsatz.jpg\" width=\"422\" height=\"73\" \/><\/p>\n<p>Damit liefert die Abfrage des Views<\/p>\n<blockquote>\n<p>SELECT * FROM testView<\/p>\n<\/blockquote>\n<p>folgende Daten:<\/p>\n<p><a href=\"https:\/\/www.csopro.de\/biblog\/wp-content\/uploads\/2010\/03\/tabelletestview.jpg\"><img loading=\"lazy\" decoding=\"async\" alt=\"Inhalt des TestView original\" src=\"https:\/\/www.csopro.de\/biblog\/wp-content\/uploads\/2010\/03\/tabelletestview-small.jpg\" width=\"450\" height=\"57\" \/><\/a><\/p>\n<p>Wird nun in der Tabelle umsatz eine Spalte Rabatt hinzugef\u00fcgt (und mit Werten gef\u00fcllt), liefert das SELECT \u00fcberaschender Weise:<\/p>\n<p><a href=\"https:\/\/www.csopro.de\/biblog\/wp-content\/uploads\/2010\/03\/inhalttestviewnachaenderung.jpg\"><img loading=\"lazy\" decoding=\"async\" alt=\"nach Hinzunahme der Spalte Inhalt des Views\" src=\"https:\/\/www.csopro.de\/biblog\/wp-content\/uploads\/2010\/03\/inhalttestviewnachaenderung-small.jpg\" width=\"450\" height=\"56\" \/><\/a><\/p>\n<p>Dabei f\u00e4llt auf, dass die Spaltentitel die urspr\u00fcnglichen Inhalte haben, d.h. Rabatt ist nirgends zu sehen, die Werte der Spalten sind aber falsch: In der Spalte Kundenname steht nun der Rabatt und im Feld AnzahlKinder (Datentyp ist eigentlich int!) steht nun der Kundenname.<\/p>\n<p>Das Aktualisieren der Views geht einfach: Nach<\/p>\n<blockquote>\n<p>exec sp_refreshview &#39;testview&#39;<\/p>\n<\/blockquote>\n<p>sieht wieder alles richtig aus.<\/p>\n<p>Hat man mehrere Views, in einer Datenbank, kann man \u00fcber<\/p>\n<blockquote>\n<p>select &#39;exec sp_refreshview &#39;&#39;&#39; + name + &#39;&#39;&#39;&#39; from sysobjects<br \/>\nwhere xtype = &#39;V&#39;<\/p>\n<\/blockquote\n\n\n<p>sich die notwendigen SQL-Statements automatisch generieren lassen, die man dann einfach ausf\u00fchrt.<\/p>\n<p>Einige Hinweise:<\/p>\n<ul dir=\"ltr\">\n<li>\n<div>Views k\u00f6nnen nat\u00fcrlich verschachtelt sein, d.h. ein View greift auf einen anderen View zu. Dann m\u00fcssen die Refresh-View-Statements in der richtigen Reihenfolge oder einfach mehrfach ausgef\u00fchrt werden.<\/div>\n<\/li>\n<li>\n<div>Clustered \/ Indexed Views k\u00f6nnen nicht refresht werden &#8211; das Statement liefert einen Fehler und muss aus der Liste der auszuf\u00fchrenden Statements gel\u00f6scht werden. Das Aktualisieren eines indizierten Views ist aber auch unn\u00f6tig, da die zugrunde liegenden Tabellen nicht ge\u00e4ndert werden k\u00f6nnen (da der View mit Schema Binding angelegt wurde)<\/div>\n<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Ein View, der mittels * alle Spalten einer verwendeten Tabelle zur\u00fcckgibt, wie z.B. CREATE VIEW dbo.testView AS SELECT u.*, k.name as Kunden_Name, k.AnzahlKinder FROM umsatz u INNER JOIN kunde k ON k.kunde_id = u.kunde_id verh\u00e4lt sich \u00fcberaschend, wenn sich die Tabellenstruktur der zugrunde liegenden Tabellen \u00e4ndert. Die Metainformationen aktualisieren sich n\u00e4mlich nicht automatisch, was sogar &hellip; <a href=\"https:\/\/www.csopro.de\/biblog\/2010\/03\/verhalten-von-views-bei-strukturaenderungen-der-zugrundeliegenden-tabellen\/\" class=\"more-link\"><span class=\"screen-reader-text\">Verhalten von Views bei Struktur\u00e4nderungen der zugrundeliegenden Tabellen<\/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":[],"class_list":["post-130","post","type-post","status-publish","format-standard","hentry","category-sqlserver"],"_links":{"self":[{"href":"https:\/\/www.csopro.de\/biblog\/wp-json\/wp\/v2\/posts\/130","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=130"}],"version-history":[{"count":0,"href":"https:\/\/www.csopro.de\/biblog\/wp-json\/wp\/v2\/posts\/130\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.csopro.de\/biblog\/wp-json\/wp\/v2\/media?parent=130"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.csopro.de\/biblog\/wp-json\/wp\/v2\/categories?post=130"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.csopro.de\/biblog\/wp-json\/wp\/v2\/tags?post=130"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}