SQLServ2005.book Seite 221 Mittwoch, 2. August 2006 3:24 15 221 K A P I T E L 7 Sichten Eine Sicht ist einfach eine SELECT-Anweisung, die einen Namen trägt und in Microsoft SQL Server gespeichert wird. Sichten dienen als virtuelle Tabellen und bieten mehrere Vorteile. Eine Sicht bietet Entwicklern einen standardisierten Weg, um Abfragen auszuführen. Entwickler werden in die Lage versetzt, bestimmte allgemeine Abfragen einmal als Sicht zu schreiben und die Sichten anschließend in den Anwendungscode einzuschließen, sodass alle Anwendungen dieselbe Version einer Abfrage verwenden. Auch kann eine Sicht eine Sicherheitsschicht bilden, da die Benutzer nur auf eine Teilmenge der in den Basistabellen der Sicht enthaltenen Daten zugreifen können. Außerdem kann eine Sicht eine benutzerfreundlichere, logischere Ansicht der Daten in einer Datenbank bieten. Zudem kann eine Sicht, für die Indizes erstellt wurden, insbesondere für bestimmte Arten komplexer Abfragen drastische Leistungsverbesserungen bieten. Die meisten Sichten gestatten nur Lesevorgänge für die zugrunde liegenden Daten. Sie können aber auch aktualisierbare Sichten erstellen, in denen die Benutzer Daten ändern dürfen. Dieses Kapitel zeigt Ihnen, wie die Leistung und Flexibilität von regulären, aktualisierbaren und indizierten Sichten genutzt werden kann. Prüfungsziele in diesem Kapitel Sichten Erstellen einer indizierten Sicht Erstellen einer aktualisierbaren Sicht Zuweisen von Berechtigungen zu einer Rolle oder einem Schema für eine Sicht Die Lektionen in diesem Kapitel Lektion 1: Erstellen von Sichten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 224 Lektion 2: Bearbeiten von Daten mithilfe von Sichten. . . . . . . . . . . . . . . . . . . . . . . . 229 Lektion 3: Erstellen von indizierten Sichten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 232 Solid Quality Learning: Implementieren und Warten von Microsoft SQL Server 2005 - Original Microsoft Training für Examen 70-431. Microsoft Press 2006 (ISBN 978-3-86645-900-7) SQLServ2005.book Seite 222 Mittwoch, 2. August 2006 3:24 15 222 Kapitel 7 Sichten Bevor Sie beginnen Damit Sie die Lektionen in diesem Kapitel bearbeiten können, müssen folgende Voraussetzungen erfüllt sein: SQL Server 2005 muss installiert sein. Eine Kopie der Beispieldatenbank AdventureWorks muss in der Instanz installiert sein. Aus der Praxis Michael Hotek Vor einigen Jahren hatte ich ein zweiwöchiges Projekt bei einem Kunden, der Leistungsprobleme zu beklagen hatte. Als ich begann, einen Blick in die Datenbank zu werfen, wusste ich, dass ich einer großen Herausforderung gegenüberstand. Aufgeteilt auf fast 2.000 gespeicherte Prozeduren, Funktionen und Trigger gab es Zehntausende von Codezeilen sowie über 350 Tabellen. Was auf den ersten Blick wirklich hervorstach, waren die mehr als 800 Sichten in der Datenbank. Eine große Anzahl von Sichten in einer Datenbank ist nicht unbedingt ein Problem. Aber die Tatsache, dass es mehr als doppelt so viele Sichten wie Tabellen gab, sagte mir, dass entweder die Tabellen schlecht entworfen waren oder die Sichten nicht richtig genutzt wurden. Leider traf in diesem Fall beides zu – aber dies ist eine andere Geschichte. Bei meinen Untersuchungen entdeckte ich Sichten, deren einzige Aufgabe darin bestand, mithilfe einer einfachen WHERE-Klausel eine Hand voll Spalten aus einer einzigen Tabelle auszuwählen. Nachdem ich ungefähr die fünfzigste Sicht betrachtet hatte, stellte ich fest, dass etwas nicht stimmt. Auf die Sichten zurückblickend, die ich bereits betrachtet hatte, fand ich ein Duplikat. Dann fand ich ein weiteres und ein weiteres und ein weiteres. In einem Fall fand ich 23 Sichten, die alle dasselbe taten. Es stellte sich heraus, dass die Entwickler in Eile Anwendungen schrieben und neue Features bereitstellten. An einem bestimmten Punkt schrieb einer der Datenbankadministratoren vor, dass der gesamte Datenzugriff durch Sichten erfolgen muss. Er dachte fälschlicherweise, dass eine Sicht zu Leistungsverbesserungen führt. Mehrere Jahre später hatte das Unternehmen Hunderte von Sichten in die Anwendungen eingebettet. Die Suche gestaltete sich so schwierig, dass die Entwickler immer dann, wenn sie etwas benötigten, einfach neue Sichten erstellten. Eine schlechte Situation wurde dadurch noch schlimmer. Glücklicherweise griffen die Anwendungen nicht direkt auf Tabellen oder Sichten zu. Der Datenzugriff erfolgte über gespeicherte Prozeduren. Der erste Schritt in dem Prozess bestand darin, den Code für gespeicherte Prozeduren, Funktionen und Trigger durchzuackern, um nach Verweisen auf doppelte Sichten zu suchen. Durch das Entfernen aller Duplikate konnten wir mehr als 400 Sichten löschen. ` Solid Quality Learning: Implementieren und Warten von Microsoft SQL Server 2005 - Original Microsoft Training für Examen 70-431. Microsoft Press 2006 (ISBN 978-3-86645-900-7) SQLServ2005.book Seite 223 Mittwoch, 2. August 2006 3:24 15 Kapitel 7 Sichten 223 Dann unternahmen wir den zweiten Schritt und entfernten all das, was niemals eine Sicht hätte werden dürfen. Als unnötig grenzten wir solche Sichten ab, die durch eine einfache WHERE-Klausel nur auf eine Tabelle zugriffen, solche die Dinge implementierten, die nicht in eine Sicht gehörten – zum Beispiel hartcodierte Zustandslisten –, und solche, die eine einfache Logik enthielten, die jeder Entwickler verstehen sollte. Als Endergebnis erhielten wir eine Datenbank, die nur 34 Sichten enthielt. Die einzigen Sichten, die übrig blieben, enthielten komplexe Berechnungen oder komplexe Verknüpfungen, die gekapselt werden mussten, um entweder die Konsistenz sicherzustellen oder um in der Zukunft einen beträchtlichen Aufwand zum Erstellen der korrekten Abfrage zu vermeiden. Die Entwickler lernten durch diese Lektion, dass SQL Server zahlreiche Werkzeuge bereitstellt, um eine Aufgabe auszuführen. Nur weil Sie etwas tun können, bedeutet das jedoch nicht notwendigerweise, dass Sie es tun sollten. Ehe Sie ein Objekt in einer Datenbank erstellen, müssen Sie verstehen, wie es die Anwendung verbessert, und das Erstellen des Objekts die beste Methode rechtfertigen können. Solid Quality Learning: Implementieren und Warten von Microsoft SQL Server 2005 - Original Microsoft Training für Examen 70-431. Microsoft Press 2006 (ISBN 978-3-86645-900-7) SQLServ2005.book Seite 224 Mittwoch, 2. August 2006 3:24 15 224 Kapitel 7 Sichten Lektion 1: Erstellen von Sichten Bestimmte Objekte von SQL Server sind notwendig oder allgemein empfehlenswert. Sie benötigen beispielsweise Datenbanktabellen, um Daten zu speichern, und Sie sollten bestimmte Indizes für Ihre Tabellen erstellen, um die Leistung zu verbessern. Sichten sollten Sie jedoch nur dann anlegen, wenn sie einen eindeutigen Vorteil mit sich bringen. Sichten, die keinen deutlichen Nutzen aufweisen, verschlingen einfach nur Platz. Nehmen Sie an, dass Sie den Namen eines Kunden zurückgeben müssen, der einen Kreditrahmen von über 10.000 Euro hat. Eine Sicht würde in diesem Fall keinen Vorteil bieten, da die SELECT-Anweisung zum Generieren diese Ergebnisses einfach und unkompliziert ist. Wenn Sie jedoch den Namen eines Kunden mit der Hauptadresse und der jüngsten Zahlung zurückgeben möchten, während die Ausgabe aller Kunden, die keine Zahlung geleistet haben, beibehalten werden soll, ist eine Sicht vielleicht nützlich, da dieses Ergebnisses eine Kombination von inneren und äußeren Verknüpfungen für mindestens fünf verschiedene Tabellen erfordert. In dieser Lektion sehen Sie, wie eine Sicht über eine oder mehrere Tabellen definiert wird. Auch lernen Sie, warum es wichtig ist, für die Sicht und alle zugrunde liegenden Tabellen, auf denen sie basiert, passende Berechtigungen zuzuweisen. Am Ende dieser Lektion werden Sie in der Lage sein, die folgenden Aufgaben auszuführen: Erstellen einer Sicht Hinzufügen von Berechtigungen für eine Sicht zu einer Rolle oder einem Schema Veranschlagte Zeit für die Lektion: 20 Minuten Erstellen einer Sicht Sie verwenden den Transact-SQL-Befehl CREATE VIEW, um eine Sicht über eine oder mehrere Tabellen zu erstellen. Die Syntax für den Befehl lautet wie folgt: CREATE VIEW [ Schemaname . ] Sichtname [ (Spalte [ ,...n ] ) ] [ WITH <Sichtattribut> [ ,...n ] ] AS Select-Anweisung [ ; ] [ WITH CHECK OPTION ] <Sichtattribut> ::= { [ ENCRYPTION ] [ SCHEMABINDING ] [ VIEW_METADATA ] } Sie beginnen, indem Sie Ihre Sicht benennen. Wie bei allen Objekten muss eine Sicht einen Namen haben, der den Regeln für Objektbezeichner entspricht. Die erste WITH-Klausel des Befehls ermöglicht es Ihnen, drei verschiedene Optionen für die Sicht anzuwenden: ENCRYPTION, SCHEMABINDING und VIEW_METADATA. Solid Quality Learning: Implementieren und Warten von Microsoft SQL Server 2005 - Original Microsoft Training für Examen 70-431. Microsoft Press 2006 (ISBN 978-3-86645-900-7) SQLServ2005.book Seite 225 Mittwoch, 2. August 2006 3:24 15 Lektion 1: Erstellen von Sichten 225 ENCRYPTION gibt an, dass SQL Server die Definition der Sicht verschlüsseln sollte, wenn diese in der Datenbank gespeichert wird. Die Definition einer verschlüsselten Sicht ist für niemanden sichtbar, auch nicht für ein Mitglied der festen Serverrolle sysadmin. Wenn Sie eine Sicht verschlüsseln, müssen Sie daher sicherstellen, dass Sie irgendwo den ursprünglichen Quellcode aufbewahren, da Sie die Definition nicht entschlüsseln können. Wenn Sie die Option SCHEMABINDING angeben, können Sie Tabellen, Sichten oder Funktionen, auf die von der Sicht verwiesen wird, nicht löschen, ohne als Erstes die Sicht zu löschen. Empfohlene Vorgehensweise: Der Trick mit der Schemabindung Ein alter Trick, den viele Datenbankadministratoren in einer Produktivumgebung nutzen, besteht darin, für jede Tabelle eine Sicht zu erstellen, die alle Spalten in der Tabelle auswählt und die Option SCHEMABINDING verwendet. Diese Sichten werden niemals von einer Anwendung oder von einem Benutzer verwendet. Ihr einziger Zweck besteht darin, einen Datenbankadministrator davon abzuhalten, versehentlich eine Tabelle oder eine Spalte innerhalb einer Tabelle zu löschen. Dieser Trick verhindert nicht, eine Tabelle zielgerichtet zu löschen, da der Datenbankadministrator auch die Sicht und anschließend die Tabelle löschen kann. Aber ein Objekt absichtlich zu löschen, das nicht gelöscht werden sollte, ist ein Sicherheitsproblem. Die Option VIEW_METADATA gibt Metadaten über eine Sicht an clientbasierte Datenzugriffsbibliotheken zurück. Sie verwenden die AS-Klausel des Befehls, um die SELECT-Anweisung anzugeben, die die Sicht definiert. Die SELECT-Anweisung kann von beliebiger Komplexität sein, solange die Abfrage gültig ist, und kann auf Tabellen, Sichten, benutzerdefinierte Funktionen und Systemfunktionen verweisen. Die einzigen Einschränkungen bestehen darin, dass die SELECTAnweisung einer Sicht folgende Dinge nicht tun kann: Verwenden der COMPUTE- oder COMPUTE BY-Klausel Verwenden des Schlüsselworts INTO Verwenden der OPTION-Klausel Verweisen auf eine temporäre Tabelle oder eine Tabellenvariable Verwenden der ORDER BY-Klausel, es sei denn, sie gibt auch den TOP-Operator an Die letzte Option des Befehls, WITH CHECK OPTION, wird verwendet, um eine aktualisierbare Sicht zu erstellen. Lektion 2, „Bearbeiten von Daten mithilfe von Sichten“, behandelt diese Option. Nachdem Sie eine Sicht erstellt haben, können Sie diese wie eine Tabelle in einer Datenbank verwenden. Eine Sicht enthält jedoch keine Daten, sondern ist einfach eine SELECT-Anweisung mit einem Namen. Wenn daher in einer SELECT-Anweisung auf eine Sicht verwiesen wird, ersetzt der Abfrageoptimierer den Verweis durch die Sichtdefinition, ehe ein Ausführungsplan generiert wird. Betrachten Sie beispielsweise den folgenden Code: Solid Quality Learning: Implementieren und Warten von Microsoft SQL Server 2005 - Original Microsoft Training für Examen 70-431. Microsoft Press 2006 (ISBN 978-3-86645-900-7) SQLServ2005.book Seite 226 Mittwoch, 2. August 2006 3:24 15 226 Kapitel 7 Sichten CREATE VIEW v_CustomerAddress AS SELECT a.CustomerID, a.CustomerName, c.AddressLine1, c.AddressLine2, c.AddressLine3, c.City, d.StateProvince, c.PostalCode, e.Country FROM dbo.Customer a INNER JOIN dbo.CustomerToCustomerAddress b ON a.CustomerID = b.CustomerID INNER JOIN dbo.CustomerAddress c ON b.CustomerAddressID = c.CustomerAddressID INNER JOIN dbo.StateProvince d ON c.StateProvinceID = d.StateProvinceID INNER JOIN dbo.Country e ON c.CountryID = e.CountryID; SELECT a.CustomerName, b.CreditLine FROM v_CustomerAddress a INNER JOIN dbo.Customer b ON a.CustomerID = b.CustomerID; Der Optimierer findet den Verweis auf die Sicht v_CustomerAddress und ersetzt ihn durch die Sichtdefinition, wobei die gesendete Abfrage ähnlich wie im folgenden Beispiel neu geschrieben wird: SELECT a.CustomerName, f.CreditLine FROM dbo.Customer a INNER JOIN dbo.CustomerToCustomerAddress b ON a.CustomerID = b.CustomerID INNER JOIN dbo.CustomerAddress c ON b.CustomerAddressID = c.CustomerAddressID INNER JOIN dbo.StateProvince d ON c.StateProvinceID = d.StateProvinceID INNER JOIN dbo.Country e ON c.CountryID = e.CountryID INNER JOIN dbo.Customer f ON a.CustomerID = f.CustomerID; Grundlegendes zur Besitzverkettung Da eine Sicht auf andere Objekte verweist, sind Leistungsprobleme möglich. Betrachten Sie die Objekte und Objektbesitzer, die das Diagramm in Abbildung 7.1 zeigt. Abbildung 7.1 Definieren der Besitzverkettung Nehmen wir an, dass BenutzerA dem BenutzerD eine SELECT-Berechtigung für die Sicht v_CustomerAddress gewährt. Obwohl BenutzerD die Berechtigung hat, eine SELECT- Solid Quality Learning: Implementieren und Warten von Microsoft SQL Server 2005 - Original Microsoft Training für Examen 70-431. Microsoft Press 2006 (ISBN 978-3-86645-900-7) SQLServ2005.book Seite 227 Mittwoch, 2. August 2006 3:24 15 Lektion 1: Erstellen von Sichten 227 Anweisung an der Sicht auszuführen, wird er beim Versuch, die Sicht zu benutzen, einen Fehler erhalten. Dies passiert, weil die Sicht auf der Grundlage der Tabellen Customer und CustomerAddress definiert ist, die nicht im Besitz von BenutzerA bzw. BenutzerD, sondern eines anderen Benutzers sind. Wenn der Besitz über eine Kette abhängiger Objekte einen Fehler aufgrund unzureichender Berechtigungen verursacht, haben Sie eine unterbroche Besitzkette. Damit BenutzerD eine SELECT-Anweisung an der Sicht v_CustomerAddress ausführen kann, muss Folgendes geschehen: BenutzerA gewährt BenutzerD die SELECT-Berechtigung für die Sicht. BenutzerB gewährt BenutzerD die SELECT-Berechtigung für dbo.Customer. BenutzerC gewährt BenutzerD die SELECT-Berechtigung für dbo.CustomerAddress. Weitere Informationen: Besitzverkettung Weitere Informationen zur Besitzverkettung finden Sie im Thema „Besitzketten“ der SQL Server 2005-Onlinedokumentation. Diese Dokumentation wird als Teil von SQL Server 2005 installiert. Aktualisierungen stehen unter der Adresse www.microsoft.com/technet/ prodtechnol/sql/2005/downloads/books.mspx zum Herunterladen zur Verfügung. Schnelltest Welchen Einschränkungen unterliegt eine SELECT-Anweisung innerhalb einer Sicht? Antworten COMPUTE- oder COMPUTE BY-Klauseln sind nicht erlaubt. Sie können nicht das Schlüsselwort INTO oder die OPTION-Klausel verwenden. Es kann nicht auf temporäre Tabellen und Tabellenvariablen verwiesen werden. Es kann keine ORDER BYKlausel angegeben werden, es sei denn, es wird auch der TOP-Operator verwendet. Übung: Erstellen einer Sicht In dieser Übung verwenden Sie die Datenbank, die die in Kapitel 3, „Erstellen von Tabellen, Einschränkungen und benutzerdefinierten Typen“, rstellten Tabellen enthält. Es soll eine Sicht erstellt werden, um Informationen über Kunden zurückzugeben, die in Kanada leben. 1. Starten Sie SQL Server Management Studio (SSMS), stellen Sie eine Verbindung mit Ihrer Instanz her, öffnen Sie ein neues Abfragefenster und ändern Sie den Kontext auf die Datenbank, die die von Ihnen in Kapitel 3 erstellten Tabellen enthält. 2. Erstellen Sie eine Sicht, um Informationen über Kunden zurückzugeben, die in Kanada leben, indem Sie die folgende Anweisung ausführen: CREATE VIEW v_CanadaCustomerAddress AS SELECT a.CustomerID, a.CustomerName, c.AddressLine1, c.AddressLine2, c.AddressLine3, Solid Quality Learning: Implementieren und Warten von Microsoft SQL Server 2005 - Original Microsoft Training für Examen 70-431. Microsoft Press 2006 (ISBN 978-3-86645-900-7) SQLServ2005.book Seite 228 Mittwoch, 2. August 2006 3:24 15 228 Kapitel 7 Sichten c.City, d.StateProvince, c.PostalCode, e.Country FROM dbo.Customer a INNER JOIN dbo.CustomerToCustomerAddress b ON a.CustomerID = b.CustomerID INNER JOIN dbo.CustomerAddress c ON b.CustomerAddressID = c.CustomerAddressID INNER JOIN dbo.StateProvince d ON c.StateProvinceID = d.StateProvinceID INNER JOIN dbo.Country e ON c.CountryID = e.CountryID WHERE e.Country = 'Canada' AND PrimaryAddressFlag = 1; 3. Konstruieren Sie eine SELECT-Anweisung, um zu überprüfen, dass die Sicht nur Kunden aus Kanada zurückgibt. Zusammenfassung der Lektion Eine Sicht ist einfach eine SELECT-Anweisung, die Sie benennen und in SQL Server als eine Art „virtuelle Tabelle“ speichern. Sie ermöglicht es Ihnen, Benutzern Zugriff auf lediglich eine Teilmenge der Daten zu gewähren und insbesondere für komplexe Abfragen die Leistung zu verbessern. Nachdem die Sicht definiert wurde, kann wie bei einer Tabelle in einer SELECT-Anweisung darauf verwiesen werden, obwohl die Sicht keine Daten enthält. Wenn Berechtigungen für eine Sicht erteilt werden, müssen Sie sorgfältig auf die Besitzverkettung achten. Dies ist erforderlich, um sicherzustellen, dass der Benutzer sowohl auf die Sichten als auch auf die Objekte Zugriff hat, auf deren Grundlage sie erstellt wurde. Lernzielkontrolle Die folgenden Fragen dienen dazu, dass Sie sich die in dieser Lektion vermittelten Schlüsselinformationen besser einprägen. Hinweis: Antworten Antworten auf diese Fragen und Erklärungen darüber, warum eine bestimmte Antwort falsch oder richtig ist, finden Sie im Anhang „Antworten“ am Ende dieses Buchs. 1. Welche der folgenden Optionen kann verhindern, dass eine Tabelle gelöscht wird? a. CHECK OPTION b. SCHEMABINDING c. UNION d. QUOTED_IDENTIFIER Solid Quality Learning: Implementieren und Warten von Microsoft SQL Server 2005 - Original Microsoft Training für Examen 70-431. Microsoft Press 2006 (ISBN 978-3-86645-900-7) SQLServ2005.book Seite 229 Mittwoch, 2. August 2006 3:24 15 Lektion 2: Bearbeiten von Daten mithilfe von Sichten 229 Lektion 2: Bearbeiten von Daten mithilfe von Sichten Wie bereits erwähnt ist eine Sicht lediglich eine benannte SELECT-Anweisung. Folglich ist eine Sicht ein Pass-Through-Verweis auf eine oder mehrere Basistabellen. Obwohl die meisten Sichten nur Lesezugriff auf die zugrundeliegenden Daten bereitstellen, können Sie aufgrund der Tatsache, dass eine Sicht eine „Weiterleitung“ ist, darin auch Daten bearbeiten. Eine Sicht, die es Ihnen ermöglicht, Daten zu bearbeiten, wird aktualisierbare Sicht genannt. Diese Lektion erläutert, wie Sie INSERT-, UPDATE-, DELETE-, BCP- und BULK INSERTVorgänge in einer Sicht ausführen können. Am Ende dieser Lektion werden Sie in der Lage sein, die folgenden Aufgaben auszuführen: Erstellen einer aktualisierbaren Sicht Veranschlagte Zeit für die Lektion: 20 Minuten Erstellen von aktualisierbaren Sichten Obwohl Sie eine Sicht definieren können, die auf mehreren Tabellen basiert, beschränkt SQL Server Datenänderungen, die Sie durch die Sicht ausführen, auf eine einzelne Tabelle. Außerdem müssen alle Änderungen direkt auf Spalten und nicht auf Ableitungen einer Spalte verweisen. Folglich können Sie keine Spalten bearbeiten, die durch eine Aggregatfunktion abgeleitet sind, wie beispielsweise AVG, COUNT, SUM, MIN oder MAX, oder durch eine Berechnung, die andere Spalten oder Operationen an einer Spalte einschließt, wie zum Beispiel SUBSTRING. Änderungen können nicht auf Spalten verweisen, die mithilfe von Operatoren wie UNION, CROSSJOIN und INTERSECT generiert wurden. Außerdem kann die Sichtdefinition keine GROUP BY-, HAVING- oder DISTINCT-Klausel enthalten. Des weiteren können Sie TOP nicht verwenden, wenn Sie WITH CHECK OPTION angeben. Empfohlene Vorgehensweise: Datenbearbeitung mit Sichten Obwohl Sie Sichten verwenden können, um Daten einzufügen, zu aktualisieren und zu löschen, werden Sichten fast nie für diesen Zweck verwendet. Gespeicherte Prozeduren sind immer die bessere Wahl, da Sie mit ihrer Hilfe Änderungen einfacher überprüfen können. Auch sind gespeicherte Prozeduren flexibler. Sie können in Ihrer Sichtdefinition eine WHERE-Klausel einschließen, um den Bereich der Zeilen einzuschränken, den die Sicht zurückgibt. Die WHERE-Klausel schränkt jedoch nicht die Änderungen ein, die Benutzer durch die Sicht vornehmen können. Dazu verwenden Sie bei der Definition der Sicht die WITH CHECK OPTION-Klausel des Befehls CREATE VIEW. Lassen Sie uns ein kurzes Beispiel betrachten, um zu sehen, wie die CHECK OPTION-Klausel funktioniert. Nehmen Sie an, dass Sie eine Sicht definieren, die Kunden mit einem Kredit- Solid Quality Learning: Implementieren und Warten von Microsoft SQL Server 2005 - Original Microsoft Training für Examen 70-431. Microsoft Press 2006 (ISBN 978-3-86645-900-7) SQLServ2005.book Seite 230 Mittwoch, 2. August 2006 3:24 15 230 Kapitel 7 Sichten rahmen von über 1.000 Euro zeigt. Ein Benutzer kann einen neuen Kunden einfügen, der einen Kreditrahmen von 500 Euro hat, ohne dabei einen Fehler zu verursachen. Diese Vorgehensweise könnte jedoch für Verwirrung sorgen, denn obwohl das Einfügen erfolgreich war, kann die Sicht die eingefügten Daten nicht anzeigen. Ein Benutzer könnte denken, dass die Daten verloren gegangen sind. Um die von den Benutzern durchführbaren Änderungen so einzuschränken, dass die Daten immer in der Sicht angezeigt werden, sollten Sie die Sicht mithilfe der WITH CHECK OPTION-Klausel definieren. Wenn Sie die vorhergehende Sicht mit dieser CHECK OPTION definieren, führt der Versuch eines Benutzers, einen Kunden mit einem Kreditrahmen von 1.000 Euro oder weniger einzufügen, zur Rückgabe eines Fehlers. Sie können auch Trigger für eine Sicht erstellen, die nützlich sind, um Vorgänge zum Ändern von Daten auszuführen. Für Sichten erstellen Sie eine besondere Art von Triggern, INSTEAD OF-Trigger genannt. Sie funktionieren genauso, wie Sie es erwarten würden: SQL Server führt nicht den Vorgang an der Sicht aus, sondern den Trigger, um einen alternativen Vorgang durchzuführen. Weitere Informationen: INSTEAD OF-Trigger Weitere Informationen zu Triggern finden Sie in Kapitel 9, „Erstellen von Funktionen, gespeicherten Prozeduren und Triggern“. Schnelltest Welche Klausel sollten Sie verwenden, um Datenänderungen in der Sicht sichtbar zu machen? Antworten Die WITH CHECK OPTION-Klausel gibt eine Einschränkung für INSERT-, UPDATE, DELETE-, BCP- und BULK INSERT-Anweisungen vor. Die Operationen können nur für Zeilen durchgeführt werden, die mit den Kriterien in der WHERE-Klausel der Sicht übereinstimmen. Übung: Erstellen einer aktualisierbaren Sicht In dieser Übung erstellen Sie eine Sicht, die Sie verwenden können, um für jeden Kunden, der einen Kreditrahmen von über 1.000 Euro besitzt, Änderungen an der Tabelle Customer vorzunehmen. 1. Starten Sie, falls nötig, SSMS, stellen Sie die Verbindung mit Ihrer Instanz her, öffnen Sie ein neues Abfragefenster und ändern Sie den Kontext für die Datenbank, die die in Kapitel 3 erstellten Kundentabellen enthält. 2. Erstellen Sie eine Kundensicht aufgrund der Tabelle Customer, indem Sie die folgende Anweisung ausführen: CREATE VIEW dbo.v_Customer AS Solid Quality Learning: Implementieren und Warten von Microsoft SQL Server 2005 - Original Microsoft Training für Examen 70-431. Microsoft Press 2006 (ISBN 978-3-86645-900-7) SQLServ2005.book Seite 231 Mittwoch, 2. August 2006 3:24 15 Lektion 2: Bearbeiten von Daten mithilfe von Sichten 231 SELECT CustomerID, CustomerName, CreditLine, AvailableCredit FROM dbo.Customer WHERE CreditLine > 1000 WITH CHECK OPTION; 3. Führen Sie die folgende INSERT-Anweisung aus und beobachten Sie die Ergebnisse: INSERT INTO dbo.Customer (CustomerName, CreditLine) VALUES('Customer1',5000); 4. Führen sie die folgende INSERT-Anweisung aus und beobachten Sie die Ergebnisse: INSERT INTO dbo.v_Customer (CustomerName, CreditLine) VALUES('Customer2',300); Zusammenfassung der Lektion Auch wenn gespeicherte Prozeduren die geeignetere Alternative darstellen, um Änderungen an Daten vorzunehmen, können sie Sichten verwenden, um Daten mithilfe der Anweisungen INSERT, UPDATE, DELETE, BCP und BULK INSERT zu bearbeiten. Die Sicht wird als Weiterleitung genutzt, um die Änderungen direkt auf eine einzelne Basistabelle anzuwenden. Um die Änderungen auf die Zeilen zu beschränken, die mit der WHERE-Klausel der Sicht übereinstimmen, verwenden Sie beim Erstellen der Sicht die WITH CHECK OPTIONKlausel. Lernzielkontrolle Die folgenden Fragen dienen dazu, dass Sie sich die in dieser Lektion vermittelten Schlüsselinformationen besser einprägen. Hinweis: Antworten Antworten auf diese Fragen und Erklärungen darüber, warum eine bestimmte Antwort falsch oder richtig ist, finden Sie im Anhang „Antworten“ am Ende dieses Buchs. 1. Welche der folgenden Optionen schränkt Änderungen an Daten ein, um den Auswahlkriterien einer Sicht zu entsprechen? a. SCHEMABINDING b. CHECKOPTION c. ANSI_NULLS d. QUOTED_IDENTIFIER Solid Quality Learning: Implementieren und Warten von Microsoft SQL Server 2005 - Original Microsoft Training für Examen 70-431. Microsoft Press 2006 (ISBN 978-3-86645-900-7) SQLServ2005.book Seite 232 Mittwoch, 2. August 2006 3:24 15 232 Kapitel 7 Sichten Lektion 3: Erstellen von indizierten Sichten Wenn eine Abfrage auf eine reguläre Sicht verweist, ersetzt der Abfrageoptimierer, wie Sie weiter vorn in diesem Kapitel gesehen haben, den Verweis durch die gespeicherte Sichtdefinition, ehe die SELECT-Anweisung ausgeführt wird. Zur Ausführungszeit berechnet SQL Server jedoch noch Verknüpfungen oder Aggregationen für die Abfrage. Indizierte Sichten stellen eine Möglichkeit zur Verfügung, das von einer Sicht zurückgegebene Resultset im Voraus zu berechnen. Die Verwendung indizierter Sichten ist wertvoll, wenn Daten geändert werden und die für SQL Server durch das ständige Ausführen der Abfrage entstehenden Kosten die für die Wartung der Ergebnisse der SELECT-Anweisung in einer Sicht erforderlichen Kosten bei weitem übersteigen. Diese Lektion erläutert, wie eine indizierte Sicht erstellt wird, und stellt einige geeignete Situationen für indizierte Sichten vor. Am Ende dieser Lektion werden Sie in der Lage sein, die folgenden Aufgaben auszuführen: Erstellen einer indizierten Sicht Veranschlagte Zeit für die Lektion: 20 Minuten Voraussetzungen für eine indizierte Sicht Theoretisch ist das Erstellen einer indizierten Sicht einfach ein Vorgang, bei dem eine Sicht und anschließend ein gruppierter Index für die Sicht erstellt werden. In der Praxis ist der Prozess nicht so einfach. Um eine indizierte Sicht zu erstellen, müssen ihre Basistabellen viele Kriterien erfüllen. Die Sicht hat dann zusätzliche Einschränkungen. Für den Index gelten schließlich noch weitere Bedingungen. Weitere Informationen: Einschränkungen für das Erstellen indizierter Sichten Details zu allen Anforderungen und Einschränkungen beim Erstellen indizierter Sichten finden Sie im Thema „Erstellen von indizierten Sichten“ der SQL Server 2005-Onlinedokumentation. Ziel all dieser Einschränkungen ist es, sicherzustellen, dass SQL Server eine konsistente Berechnung ausführen kann. Eine indizierte Sicht, auch materialisierte Sicht genannt, veranlasst SQL Server, die SELECT-Anweisung in der Sichtdefinition auszuführen. SQL Server erstellt anschließend einen gruppierten Index für die Ergebnisse der Sicht und speichert die Daten und den Index innerhalb der Datenbank. Wenn Sie Daten in den Basistabellen ändern, gibt SQL Server diese Änderungen an die indizierte Sicht weiter. Wenn sich das Ergebnis der Sicht von einer Ausführung zur nächsten oder bei der Verwendung verschiedener Abfrageoptionen ändern könnte, würde die gesamte Datenmenge, die SQL Server berechnet und gespeichert hat, für ungültig erklärt werden. Daher sind alle Operatoren oder Funktionen, die unterschiedliche Ergebnisse verursachen können, unzulässig. Solid Quality Learning: Implementieren und Warten von Microsoft SQL Server 2005 - Original Microsoft Training für Examen 70-431. Microsoft Press 2006 (ISBN 978-3-86645-900-7) SQLServ2005.book Seite 233 Mittwoch, 2. August 2006 3:24 15 Lektion 3: Erstellen von indizierten Sichten 233 Es folgen einige Beispiele für diese Einschränkungen: Die SELECT-Anweisung kann nicht auf andere Sichten verweisen. Alle Funktionen müssen deterministisch sein. Sie können beispielsweise nicht getdate() verwenden, da bei jeder Ausführung ein anderes Datum als Ergebnis zurückgegeben wird. AVG, MIN, MAX und STDEV sind nicht zulässig. Sie verwenden den Transact-SQL-Befehl CREATE INDEX, um für eine Sicht einen gruppierten Index zu erstellen. Details zu diesem Befehl finden Sie in Kapitel 4, „Erstellen von Indizes“. Sie können auch nicht gruppierte Indizes für eine Sicht erstellen, um dem Abfrageoptimierer für die Bearbeitung einer Abfrage mehr Optionen zur Verfügung zu stellen. Den CREATE INDEX-Befehl verwenden Sie auch, um nicht gruppierte Indizes für eine Sicht zu erstellen. Abfragenersetzung In Lektion 1, „Erstellen von Sichten“, wurde die Abfragenersetzung erläutert, die eintritt, wenn eine SELECT-Anweisung auf eine reguläre Sicht verweist. Indizierte Sichten funktionieren anders, da es sich bei ihnen in Wirklichkeit um eine Tabelle handelt. Abfragen, die auf die indizierte Sicht verweisen, geben daher die Daten direkt aus der Sicht zurück. Der Abfrageoptimierer ersetzt nicht die Sichtdefinition durch die Abfrage. Obwohl Sie in jeder Version von SQL Server 2005 eine indizierte Sicht erstellen können, enthält die Enterprise Edition ein interessantes Optimierer-Feature. Wenn der Optimierer feststellt, dass für die Bearbeitung einer Abfrage eine indizierte Sicht effizienter ist als eine Basistabelle, schreibt er die Abfrage neu, um stattdessen die indizierte Sicht zu verwenden. Sie müssen nicht einmal die indizierte Sicht in der Abfrage angeben. Die Abfrage muss nur eine Tabelle vorgeben, für die Sie eine indizierte Sicht definiert haben. Die Übung in dieser Lektion verdeutlicht dieses Ersetzungsverhalten, das nur zur Verfügung steht, wenn Sie SQL Server 2005 Enterprise Edition oder die SQL Server 2005 Developer Edition verwenden. Um eine indizierte Sicht in einer anderen Edition von SQL Server zu verwenden, müssen Sie in der Abfrage explizit darauf verweisen. Schnelltest Was ist der Unterschied zwischen einer regulären und einer indizierten Sicht? Antworten Eine reguläre Sicht ist eine SELECT-Anweisung, auf die durch einen Namen verwiesen wird und die in SQL Server gespeichert wird. Sie enthält keine Daten. Eine indizierte Sicht ist eine Sicht, für die ein gruppierter Index erstellt worden ist. Dies veranlasst SQL Server, die in der Sicht definierten Ergebnisse der Abfrage zu materialisieren und auf dem Datenträger zu speichern. Eine indizierte Sicht muss sehr strenge Anforderungen an sich selbst, an die Basistabellen, auf die sie verweist, und an ihren Index erfüllen. Solid Quality Learning: Implementieren und Warten von Microsoft SQL Server 2005 - Original Microsoft Training für Examen 70-431. Microsoft Press 2006 (ISBN 978-3-86645-900-7) SQLServ2005.book Seite 234 Mittwoch, 2. August 2006 3:24 15 234 Kapitel 7 Sichten Übung: Erstellen einer indizierten Sicht In dieser Übung erstellen Sie eine indizierte Sicht in der Datenbank AdventureWorks. 1. Starten Sie, falls nötig, SSMS, stellen Sie die Verbindung mit Ihrer Instanz her, öffnen Sie ein neues Abfragefenster und ändern Sie den Kontext der Datenbank AdventureWorks. 2. Erstellen Sie eine indizierte Sicht namens Orders, indem Sie den folgenden Code ausführen: --Setzen der Optionen, um indizierte Sichten zu --unterstützen. SET NUMERIC_ROUNDABORT OFF; SET ANSI_PADDING, ANSI_WARNINGS, CONCAT_NULL_YIELDS_NULL, ARITHABORT, QUOTED_IDENTIFIER, ANSI_NULLS ON; GO --Erstellen einer Sicht mit Schemabindung. IF OBJECT_ID ('Sales.vOrders', 'view') IS NOT NULL DROP VIEW Sales.vOrders ; GO CREATE VIEW Sales.vOrders WITH SCHEMABINDING AS SELECT SUM(UnitPrice*OrderQty*(1.00UnitPriceDiscount)) AS Revenue, OrderDate, ProductID, COUNT_BIG(*) AS COUNT FROM Sales.SalesOrderDetail AS od, Sales.SalesOrderHeader AS o WHERE od.SalesOrderID = o.SalesOrderID GROUP BY OrderDate, ProductID; GO --Erstellen eines Index für die Sicht. CREATE UNIQUE CLUSTERED INDEX IDX_V1 ON Sales.vOrders (OrderDate, ProductID); GO 3. Führen Sie die folgenden Abfragen aus, die die indizierte Sicht verwenden, auch wenn in den Abfragen nicht explizit auf die Sicht verwiesen wird: SELECT SUM(UnitPrice*OrderQty*(1.00UnitPriceDiscount)) AS Rev, OrderDate, ProductID FROM Sales.SalesOrderDetail AS od JOIN Sales.SalesOrderHeader AS o ON od.SalesOrderID=o.SalesOrderID AND ProductID BETWEEN 700 and 800 AND OrderDate >= CONVERT(datetime,'05/01/2002',101) GROUP BY OrderDate, ProductID ORDER BY Rev DESC; SELECT OrderDate, SUM(UnitPrice*OrderQty*(1.00UnitPriceDiscount)) AS Rev FROM Sales.SalesOrderDetail AS od JOIN Sales.SalesOrderHeader AS o ON Solid Quality Learning: Implementieren und Warten von Microsoft SQL Server 2005 - Original Microsoft Training für Examen 70-431. Microsoft Press 2006 (ISBN 978-3-86645-900-7) SQLServ2005.book Seite 235 Mittwoch, 2. August 2006 3:24 15 Lektion 3: Erstellen von indizierten Sichten 235 od.SalesOrderID=o.SalesOrderID AND DATEPART(mm,OrderDate)= 3 AND DATEPART(yy,OrderDate) = 2002 GROUP BY OrderDate ORDER BY OrderDate ASC; Zusammenfassung der Lektion Sie erstellen eine indizierte Sicht, indem Sie einen gruppierten Index dafür anlegen. Durch das Erstellen eines gruppierten Index für eine Sicht speichert SQL Server das bei der Abfrage der Sicht erhaltene Resultset auf dem Datenträger. Dies kann die Leistung entscheidend verbessern, insbesondere für Abfragen, die Aggregationen oder Berechnungen ausführen. Wenn Sie SQL Server 2005 Enterprise Edition verwenden, schreibt der Abfrageoptimierer automatisch eine Abfrage neu, um eine indizierte Sicht zu verwenden, wenn er feststellt, dass die indizierte Sicht zum Bearbeiten der Abfrage effizienter ist als die Basistabelle. Lernzielkontrolle Die folgenden Fragen dienen dazu, dass Sie sich die in dieser Lektion vermittelten Schlüsselinformationen besser einprägen. Hinweis: Antworten Antworten auf diese Fragen und Erklärungen darüber, warum eine bestimmte Antwort falsch oder richtig ist, finden Sie im Anhang „Antworten“ am Ende dieses Buchs. 1. Welche der folgenden Einstellungen sind erforderlich, um eine indizierte Sicht zu erstellen? (Wählen Sie alle zutreffenden Antworten aus.) a. QUOTED_IDENTIFIER ON b. Dreiteilige Namen c. SCHEMABINDING d. ANSI_NULLS OFF Wiederholung des Kapitels Um die Fähigkeiten, die Sie sich in diesem Kapitel angeeignet haben, weiter zu üben und zu vertiefen, können Sie Folgendes tun: Die Zusammenfassung des Kapitels durcharbeiten. Die Liste der in diesem Kapitel vorgestellten Schlüsselbegriffe durcharbeiten. Solid Quality Learning: Implementieren und Warten von Microsoft SQL Server 2005 - Original Microsoft Training für Examen 70-431. Microsoft Press 2006 (ISBN 978-3-86645-900-7) SQLServ2005.book Seite 236 Mittwoch, 2. August 2006 3:24 15 236 Kapitel 7 Sichten Die Fallstudie durcharbeiten. Sie enthält eine praxisnahe Aufgabenstellung zu den in diesem Kapitel behandelten Themen. Die vorgeschlagenen Übungen durchführen. Eine Testprüfung ablegen. Zusammenfassung des Kapitels Sichten sind einfach eine benannte SELECT-Anweisung, die in SQL Server gespeichert wird. Sie können eine Sicht so wie eine Tabelle verwenden, ohne sich über die Komplexität der zugrunde liegenden SELECT-Anweisung Gedanken machen zu müssen. Da Sichten von den zugrunde liegenden Basistabellen abhängig sind, um auf Daten zuzugreifen, müssen Sie der Kette von Berechtigungen, die für die Rückgabe der Daten erforderlich sind, Aufmerksamkeit widmen. Um Sichten sicher zu nutzen und Daten in eine einzelne Basistabelle einzufügen, zu aktualisieren und zu löschen, verwenden Sie die Klausel WITH CHECK OPTION für den Befehl CREATE VIEW. Damit werden die Änderungen auf die Zeilen beschränkt, die mit der WHERE-Klausel der Sicht übereinstimmen. Sie können die Leistung verbessern, indem Sie einen gruppierten Index für eine Sicht erstellen. Indizierte Sichten veranlassen, dass die zurückgegebenen Daten, einschließlich der Aggregationen und Berechnungen, auf dem Datenträger materialisiert und nicht zur Ausführungszeit berechnet werden. SQL Server 2005 Enterprise Edition kann eine indizierte Sicht auch dann verwenden, wenn in einer SELECT-Anweisung nicht direkt darauf verwiesen wird. Schlüsselbegriffe Kennen Sie die Bedeutung der folgenden Schlüsselbegriffe? Sie können Ihre Antworten überprüfen, indem Sie im Glossar am Ende des Buches nachschlagen. Unterbrochene Besitzkette Indizierte Sicht Besitzverkettung Aktualisierbare Sicht Sicht Fallstudien In den folgenden Fallstudien wenden Sie an, was Sie in diesem Kapitel gelernt haben. Die Antworten auf die Fragen finden Sie im Anhang „Antworten“ am Ende dieses Buches. Solid Quality Learning: Implementieren und Warten von Microsoft SQL Server 2005 - Original Microsoft Training für Examen 70-431. Microsoft Press 2006 (ISBN 978-3-86645-900-7) SQLServ2005.book Seite 237 Mittwoch, 2. August 2006 3:24 15 Kapitel 7 Wiederholung des Kapitels 237 Fallstudie: Erstellen von Sichten Contoso Limited, ein Versicherungsunternehmen mit Sitz in Bothell, Washington, verarbeitet Versicherungspolicen und Schadensfälle von Privatkunden. Die Entwicklungsgruppe hat ausgewählte Codeteile innerhalb der Anwendungen untersucht, die dieselbe Funktion ausführen, aber unterschiedliche Ergebnisse zurückgeben. Außerdem hat die Gruppe mehrere komplexe Abfragen identifiziert, die aufgrund der großen Anzahl von Tabellen, die sie miteinander verknüpfen, eine schlechte Leistung bringen. Um die Probleme zu beheben, muss das Entwicklungsteam die Abfragen standardisieren und die Leistung der Schlüsselabfragen verbessern. Wie sollte die Gruppe diese Probleme lösen? Empfohlene Übungen Damit Sie die in diesem Kapitel vorgestellten Prüfungsziele meistern können, sollten Sie die folgenden Übungsaufgaben durchführen. Erstellen einer Sicht Nehmen Sie mehrere Ihrer komplexeren Abfragen und wandeln Sie sie in Sichten um. Ersetzen Sie diese neuen Sichten wieder durch Ihren Code. Erstellen einer indizierten Sicht Nehmen Sie eine der in Übung 1 erstellten Sichten und wandeln Sie sie in eine indizierte Sicht um. Vergleichen Sie die Leistung der indizierten Sicht mit der Leistung der zugrunde liegenden SELECT-Anweisung. Ablegen einer Testprüfung Die Prüfungsfragen auf der Begleit-CD bieten Ihnen viele Möglichkeiten. Sie können z.B. überprüfen, ob Sie mit dem Inhalt dieses Kapitels vertraut sind, sich aber auch am gesamten Inhalt der Zertifizierungsprüfung 70-431 versuchen. Dabei haben Sie die Möglichkeit, den Test so einzurichten, dass die Zertifizierungsprüfung genau nachgeahmt wird. Sie können aber auch in den Lernmodus schalten, bei dem Sie die nach der Beantwortung einer Frage die richtigen Antworten und die Erklärungen sehen. Weitere Informationen: Prüfungsfragen Einzelheiten über alle verfügbaren Optionen der Prüfungsfragen finden Sie im Abschnitt „Verwenden der Prüfungsfragen“ in der Einleitung zu diesem Buch. Solid Quality Learning: Implementieren und Warten von Microsoft SQL Server 2005 - Original Microsoft Training für Examen 70-431. Microsoft Press 2006 (ISBN 978-3-86645-900-7)