Programmieren Einer Microsoft SQL Server 2000-Datenbank

864
Programmieren einer Microsoft® SQL Server 2000-Datenbank Arbeitsbuch für Kursleiter Kursnummer: 2328A Version: 11/2000 Artikelnummer: X06-15268

Transcript of Programmieren Einer Microsoft SQL Server 2000-Datenbank

Page 1: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Programmieren einer Microsoft®

SQL Server™ 2000-Datenbank

Arbeitsbuch für Kursleiter Kursnummer: 2328A

Version: 11/2000Artikelnummer: X06-15268

Page 2: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Die in diesen Unterlagen enthaltenen Angaben und Daten können ohne vorherige Ankündigung geändert werden. Die in diesen Unterlagen genannten Firmen, Produkte, Menschen, Charaktere und/oder Daten sind frei erfunden und sollen keine wirklichen Individuen, Gesellschaften, Produkte oder Veranstaltungen darstellen, soweit nichts anderes angegeben ist. Die Benutzer/innen sind verpflichtet, sich an alle anwendbaren Urheberrechtsgesetze zu halten. Ohne ausdrückliche schriftliche Erlaubnis der Microsoft Corporation darf kein Teil dieser Unterlagen für irgendwelche Zwecke vervielfältigt oder übertragen werden, unabhängig davon, auf welche Art und Weise oder mit welchen Mitteln, elektronisch oder mechanisch, dies geschieht. Wenn auf dieses Dokument nur auf elektronischem Wege zugegriffen werden kann, sind Sie hiermit berechtigt, eine (1) Kopie zum persönlichen Gebrauch auszudrucken.

Microsoft Corporation kann Inhaber von Patenten oder Patentanträgen, Marken, Urheberrechten oder anderen gewerblichen Schutzrechten sein, die den Inhalt dieses Dokuments betreffen. Die Bereitstellung dieses Dokuments gewährt keinerlei Lizenzrechte an diesen Patenten, Marken, Urheberrechten oder anderen gewerblichen Schutzrechten, es sei denn, dies wurde ausdrücklich durch einen schriftlichen Lizenzvertrag mit der Microsoft Corporation vereinbart.

2000 Microsoft Corporation. Alle Rechte vorbehalten.

Microsoft, ActiveX, BackOffice, MS-DOS, PowerPoint, Visual Basic, Visual C++, Visual Studio, Windows und Windows NT sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern.

Andere in diesem Dokument aufgeführte Produkt- und Firmennamen sind möglicherweise Marken der jeweiligen Eigentümer.

Project Lead: Rich Rose Instructional Designers: Rich Rose, Cheryl Hoople, Marilyn McGill Instructional Software Design Engineers: Karl Dehmer, Carl Raebler, Rick Byham Technical Lead: Karl Dehmer Subject Matter Experts: Karl Dehmer, Carl Raebler, Rick Byham Graphic Artist: Kirsten Larson (Independent Contractor) Editing Manager: Lynette Skinner Editor: Wendy Cleary Copy Editor: Edward McKillop (S&T Consulting) Production Manager: Miracle Davis Production Coordinator: Jenny Boe Production Support: Lori Walker (S&T Consulting) Test Manager: Sid Benavente Courseware Testing: TestingTesting123 Classroom Automation: Lorrin Smith-Bates Creative Director, Media/Sim Services: David Mahlmann Web Development Lead: Lisa Pease CD Build Specialist: Julie Challenger Online Support: David Myka (S&T Consulting) Localization Manager: Rick Terek Operations Coordinator: John Williams Manufacturing Support: Laura King; Kathy Hershey Lead Product Manager, Release Management: Bo Galford Lead Product Manager, Data Base: Margo Crandall Group Manager, Courseware Infrastructure: David Bramble Group Product Manager, Content Development: Dean Murray General Manager: Robert Stewart

Kursnummer: 2328A Artikelnummer: X06-15268 Version: 11/2000

Page 3: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Programmieren einer Microsoft SQL Server 2000-Datenbank iii

InhaltEinführungEinführung ...............................................................................................................1Kursunterlagen.........................................................................................................2Voraussetzungen......................................................................................................3Kursbeschreibung ....................................................................................................5Installation ...............................................................................................................9Microsoft Official Curriculum...............................................................................12Microsoft Certified Professional-Programm..........................................................13Einrichtungen.........................................................................................................15Unterrichtseinheit 1: Übersicht über SQL ServerÜbersicht..................................................................................................................1Informationen zu SQL Server ..................................................................................2SQL Server-Integration..........................................................................................12SQL Server-Datenbanken ......................................................................................18SQL Server-Sicherheit ...........................................................................................28Arbeiten mit SQL Server .......................................................................................35Übungseinheit A: Übersicht über SQL Server.......................................................44Lernzielkontrolle....................................................................................................50Unterrichtseinheit 2: Übersicht über die SQL Server-ProgrammierungÜbersicht..................................................................................................................1Entwerfen der Anwendungsarchitektur einer Organisation .....................................2SQL Server-Programmierungstools.........................................................................8Transact-SQL (Programmiersprache) ....................................................................11Elemente von Transact-SQL..................................................................................12Zusätzliche Sprachelemente...................................................................................20Möglichkeiten zum Ausführen von Transact-SQL-Anweisungen.........................33Empfohlene Methoden...........................................................................................44Übungseinheit A: Übersicht über Transact-SQL ...................................................45Lernzielkontrolle....................................................................................................53Unterrichtseinheit 3: Erstellen und Verwalten von DatenbankenÜbersicht..................................................................................................................1Erstellen von Datenbanken ......................................................................................2Erstellen von Dateigruppen....................................................................................11Verwalten von Datenbanken..................................................................................14Einführung in Datenstrukturen ..............................................................................25Empfohlene Methoden...........................................................................................32Übungseinheit A: Erstellen und Verwalten von Datenbanken...............................33Lernzielkontrolle....................................................................................................39

Page 4: Programmieren Einer Microsoft SQL Server 2000-Datenbank

iv Programmieren einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 4: Erstellen von Datentypen und TabellenÜbersicht ................................................................................................................. 1Erstellen von Datentypen ........................................................................................ 2Erstellen von Tabellen ............................................................................................ 9Generieren von Spaltenwerten .............................................................................. 17Generieren von Skripts.......................................................................................... 21Empfohlene Methoden.......................................................................................... 22Übungseinheit A: Erstellen von Datentypen und Tabellen................................... 23Lernzielkontrolle................................................................................................... 33Unterrichtseinheit 5: Implementieren der DatenintegritätÜbersicht ................................................................................................................. 1Datenintegritätstypen .............................................................................................. 2Erzwingen der Datenintegrität ................................................................................ 3Definieren von Einschränkungen............................................................................ 4Einschränkungstypen ............................................................................................ 10Deaktivieren von Einschränkungen ...................................................................... 20Verwenden von Standardwerten und Regeln........................................................ 25Auswählen der geeigneten Methode zum Erzwingen der Datenintegrität ............ 27Empfohlene Methoden.......................................................................................... 29Übungseinheit A: Implementieren der Datenintegrität ......................................... 30Lernzielkontrolle................................................................................................... 41Unterrichtseinheit 6: Planen von IndizesÜbersicht ................................................................................................................. 1Einführung in Indizes.............................................................................................. 2Indexarchitektur ...................................................................................................... 7Abrufen von gespeicherten Daten durch SQL Server ........................................... 12Verwaltung von Index- und Heapstrukturen durch SQL Server ........................... 19Entscheiden, welche Spalten indiziert werden...................................................... 25Empfohlene Methoden.......................................................................................... 39Übungseinheit A: Bestimmen der Indizes für eine Tabelle .................................. 40Lernzielkontrolle................................................................................................... 44Unterrichtseinheit 7: Erstellen und Verwalten von IndizesÜbersicht ................................................................................................................. 1Erstellen von Indizes............................................................................................... 2Arbeiten mit den CREATE INDEX-Optionen...................................................... 13Verwalten von Indizes .......................................................................................... 18Übungseinheit A: Erstellen und Verwalten von Indizes ....................................... 27Einführung in die Arbeit mit Statistiken ............................................................... 37Abfragen der „sysindexes“-Tabelle ...................................................................... 48Einrichten von Indizes mit Hilfe des Indexoptimierungs-Assistenten.................. 50Leistungsaspekte ................................................................................................... 53Empfohlene Methoden.......................................................................................... 54Übungseinheit B: Anzeigen von Indexstatistiken ................................................. 56Lernzielkontrolle................................................................................................... 65

Page 5: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Programmieren einer Microsoft SQL Server 2000-Datenbank v

Unterrichtseinheit 8: Implementieren von SichtenÜbersicht..................................................................................................................1Einführung zu Sichten..............................................................................................2Vorteile von Sichten ................................................................................................4Definieren von Sichten ............................................................................................6Ändern von Daten mit Hilfe von Sichten...............................................................17Optimieren der Leistung mit Hilfe von Sichten.....................................................19Empfohlene Methoden...........................................................................................26Übungseinheit A: Implementieren von Sichten .....................................................28Lernzielkontrolle....................................................................................................38Unterrichtseinheit 9: Implementieren gespeicherter ProzedurenÜbersicht..................................................................................................................1Einführung in gespeicherte Prozeduren ...................................................................2Erstellen, Ausführen, Ändern und Löschen gespeicherter Prozeduren..................10Übungseinheit A: Erstellen gespeicherter Prozeduren...........................................21Verwenden von Parametern in gespeicherten Prozeduren.....................................26Ausführen erweiterter gespeicherter Prozeduren ...................................................37Behandeln von Fehlermeldungen...........................................................................39Leistungsaspekte ....................................................................................................45Empfohlene Methoden...........................................................................................47Übungseinheit B: Erstellen gespeicherter Prozeduren mit Parametern..................48Lernzielkontrolle....................................................................................................59Unterrichtseinheit 10: Implementieren von benutzerdefinierten FunktionenÜbersicht..................................................................................................................1Arten von benutzerdefinierten Funktionen ..............................................................2Definieren von benutzerdefinierten Funktionen ......................................................3Beispiele für benutzerdefinierte Funktionen............................................................9Empfohlene Methoden...........................................................................................17Übungseinheit A: Erstellen von benutzerdefinierten Funktionen ..........................18Lernzielkontrolle....................................................................................................24Unterrichtseinheit 11: Implementieren von TriggernÜbersicht..................................................................................................................1Einführung in Trigger ..............................................................................................2Definieren von Triggern ........................................................................................10Funktionsweise von Triggern ................................................................................16Beispiele für Trigger ..............................................................................................31Leistungsaspekte ....................................................................................................34Empfohlene Methoden...........................................................................................35Übungseinheit A: Erstellen von Triggern ..............................................................36Lernzielkontrolle....................................................................................................44

Page 6: Programmieren Einer Microsoft SQL Server 2000-Datenbank

vi Programmieren einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 12: Programmieren für mehrere ServerÜbersicht ................................................................................................................. 1Einführung in verteilte Abfragen ............................................................................ 2Ausführen einer Ad-hoc-Abfrage für eine Remotedatenquelle .............................. 4Einrichten einer Verbindungsserverumgebung....................................................... 7Ausführen einer Abfrage auf einem Verbindungsserver....................................... 18Ausführen einer gespeicherten Prozedur auf einem Verbindungsserver .............. 23Verwalten von verteilten Transaktionen ............................................................... 24Ändern von Daten auf einem Verbindungsserver ................................................. 25Verwenden partitionierter Sichten ........................................................................ 27Empfohlene Methoden.......................................................................................... 34Übungseinheit A: Verwenden von verteilten Daten ............................................. 36Lernzielkontrolle................................................................................................... 48Unterrichtseinheit 13: Optimieren der AbfrageleistungÜbersicht ................................................................................................................. 1Einführung zum Abfrageoptimierer ........................................................................ 2Abrufen von Ausführungsplaninformationen ....................................................... 13Verwenden eines Indexes zum Abdecken einer Abfrage...................................... 25Indizierungsstrategien ........................................................................................... 36Außerkraftsetzen des Abfrageoptimierers............................................................. 43Empfohlene Methoden.......................................................................................... 50Übungseinheit A: Optimieren der Abfrageleistung .............................................. 52Lernzielkontrolle................................................................................................... 67Unterrichtseinheit 14: Analysieren von AbfragenÜbersicht ................................................................................................................. 1Abfragen mit dem AND-Operator .......................................................................... 2Abfragen mit dem OR-Operator ............................................................................. 4Übungseinheit A: Analysieren von Abfragen mit dem AND-Operator und dem OR-Operator............................................................................................. 5Abfragen mit Verknüpfungsoperationen............................................................... 35Übungseinheit B: Analysieren von Abfragen mit unterschiedlichen Verknüpfungsstrategien ........................................................................................ 48Empfohlene Methoden.......................................................................................... 57Lernzielkontrolle................................................................................................... 58Unterrichtseinheit 15: Verwalten von Transaktionen und SperrenÜbersicht ................................................................................................................. 1Einführung in Transaktionen und Sperren .............................................................. 2Verwalten von Transaktionen ................................................................................. 4SQL Server-Sperren.............................................................................................. 13Verwalten von Sperren.......................................................................................... 22Empfohlene Methoden.......................................................................................... 33Übungseinheit A: Verwalten von Transaktionen und Sperren.............................. 34Lernzielkontrolle................................................................................................... 45

Page 7: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Programmieren einer Microsoft SQL Server 2000-Datenbank vii

Über diesen Kurs Dieser Abschnitt bietet eine kurze Beschreibung des Kurses, der Zielgruppe, der empfohlenen Voraussetzungen und der Lernziele.

BeschreibungDieser fünftägige Kurs vermittelt den Kursteilnehmern die technischen Fähig-keiten, die zum Programmieren einer Datenbank mit Hilfe von Microsoft®SQL Server™ 2000 erforderlich sind.

Kurs 2328A ist eine überarbeitete Version von Kurs 1133, Implementieren einer Datenbank in Microsoft SQL Server 7.0. In diesem Kurs werden neue Funktionen von SQL Server 2000 vorgestellt. Ein Teil des Inhalts zum Ab-fragen wurde im Kurs ausgelassen. Der gelöschte Inhalt wird in einem geson-derten Kurs, Kurs 2316, Abfragen von Microsoft SQL Server 2000 mit Hilfe von Transact-SQL, angeboten. Dieser Kurs enthält einen Teil des Inhalts von Kurs 2013, Optimizing Microsoft SQL Server 7.0. Der Kurs enthält eine neue Unter-richtseinheit zu benutzerdefinierten Funktionen.

KursteilnehmerDieser Kurs richtet sich an Personen, die für das Implementieren von Daten-bankobjekten und das Programmieren von SQL Server-Datenbanken mit Hilfe von Transact-SQL verantwortlich sind.

Voraussetzungen für die Kursteilnehmer Für diesen Kurs müssen die Kursteilnehmer die folgenden Voraussetzungen erfüllen:

� Erfahrung im Verwenden des Microsoft Windows® 2000-Betriebssystems für folgende Aufgaben:

• Herstellen von Verbindungen zwischen Clients unter Windows 2000 mit Netzwerken und dem Internet.

• Konfigurieren der Windows 2000-Umgebung.

• Erstellen und Verwalten von Benutzerkonten.

• Verwalten des Zugriffs auf Ressourcen mit Hilfe von Gruppen.

• Konfigurieren und Verwalten von Datenträgern und Partitionen, einschließlich Datenträgerstriping und -spiegelung.

• Verwalten von Daten mit Hilfe des NTFS-Dateisystems.

• Implementieren von Windows 2000-Sicherheit.

• Optimieren der Leistung in Windows 2000. Kursteilnehmer, die diese Voraussetzungen nicht erfüllen, können die erfor-derlichen Kenntnisse und Fähigkeiten in den folgenden Kursen erwerben:

• Kurs 2046, Microsoft Windows 2000 - Grundlagen zum Netzwerk und Betriebssystem

• Kurs 2054, Implementieren von Microsoft Windows 2000 Professional und Server

Page 8: Programmieren Einer Microsoft SQL Server 2000-Datenbank

viii Programmieren einer Microsoft SQL Server 2000-Datenbank

� Kenntnisse der grundlegenden Konzepte relationaler Datenbanken, ein-schließlich folgender Kenntnisse:

• Logischer und physischer Datenbankentwurf.

• Konzepte der Datenintegrität.

• Beziehungen zwischen Tabellen und Spalten (Primärschlüssel und Fremdschlüssel, 1:1, 1:n, n:n).

• Speichern von Daten in Tabellen (Zeilen und Spalten). Kursteilnehmer, die diese Voraussetzungen nicht erfüllen, können die erforderlichen Kenntnisse und Fähigkeiten im folgenden Kurs erwerben:

• Kurs 1609, Designing Data Services and Data Models� Kenntnisse der grundlegenden Transact-SQL-Syntax (SELECT-, UPDATE-

und INSERT-Anweisungen). Kursteilnehmer, die diese Voraussetzungen nicht erfüllen, können die erforderlichen Kenntnisse und Fähigkeiten im folgenden Kurs erwerben:

• Kurs 2316A, Abfragen von Microsoft SQL Server 2000 mit Hilfe von Transact-SQL

� Kenntnis der Rolle des Datenbankadministrators.

LernzieleNach Abschluss dieses Kurses werden die Kursteilnehmer in der Lage sein, die folgenden Aufgaben auszuführen:

� Beschreiben der Elemente von SQL Server. � Entwerfen einer SQL Server-Anwendungsarchitektur einer Organisation. � Beschreiben der begrifflichen Basis des Programmierens in Transact-SQL. � Erstellen und Verwalten von Datenbanken und der verbundenen Kom-

ponenten. � Implementieren der Datenintegrität mit Hilfe der IDENTITY-Spalteneigen-

schaft sowie mit Hilfe von Einschränkungen, Standardwerten, Regeln und eindeutigen Bezeichnern.

� Planen der Verwendung von Indizes. � Erstellen und Verwalten von Indizes. � Erstellen, Verwenden und Verwalten von Datensichten. � Entwerfen, Erstellen und Verwenden von gespeicherten Prozeduren. � Implementieren von benutzerdefinierten Funktionen. � Erstellen und Implementieren von Triggern. � Programmieren für mehrere Server mit Hilfe von verteilten Abfragen,

verteilten Transaktionen und partitionierten Sichten. � Optimieren der Abfrageleistung.� Analysieren von Abfragen. � Verwalten von Transaktionen und Sperren, um Parallelität und Wieder-

herstellbarkeit von Daten sicherzustellen.

Page 9: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Programmieren einer Microsoft SQL Server 2000-Datenbank ix

Zeitplan für den Kurs Der folgende Zeitplan zeigt eine ungefähre Schätzung der für die einzelnen Unterrichtseinheiten benötigten Zeit. Die Zeitplanung kann sich leicht ver-schieben.

1. Tag Beginn Ende Unterrichtseinheit

9:00 9:30 Einführung

9:30 10:30 Unterrichtseinheit 1: Übersicht über SQL Server

10:30 10:45 Pause

10:45 11:15 Übungseinheit A: Übersicht über SQL Server

11:15 12:00 Unterrichtseinheit 2: Übersicht über die SQL Server-Program-mierung

12:00 13:00 Mittagspause

13:00 13:30 Übungseinheit A: Übersicht über Transact-SQL

13:30 14:00 Unterrichtseinheit 3: Erstellen und Verwalten von Daten-banken

14:00 14:30 Übungseinheit A: Erstellen und Verwalten von Datenbanken

14:30 14:45 Pause

14:45 15:15 Unterrichtseinheit 4: Erstellen von Datentypen und Tabellen

15:15 15:45 Übungseinheit A: Erstellen von Datentypen und Tabellen

2. Tag Beginn Ende Unterrichtseinheit

9:00 9:30 Wiederholung des ersten Tages

9:30 10:15 Unterrichtseinheit 5: Implementieren der Datenintegrität

10:15 10:30 Pause

10:30 11:00 Übungseinheit A: Implementieren der Datenintegrität

11:00 12:30 Unterrichtseinheit 6: Planen von Indizes

12:30 13:30 Mittagspause

13:30 13:45 Übungseinheit A: Bestimmen der Indizes für eine Tabelle

13:45 14:15 Unterrichtseinheit 7: Erstellen und Verwalten von Indizes

14:15 14:45 Übungseinheit A: Erstellen und Verwalten von Indizes

14:45 15:00 Pause

15:00 15:30 Unterrichtseinheit 7: Erstellen und Verwalten von Indizes (Fortsetzung)

15:30 16:00 Übungseinheit B: Anzeigen von Indexstatistiken

Page 10: Programmieren Einer Microsoft SQL Server 2000-Datenbank

x Programmieren einer Microsoft SQL Server 2000-Datenbank

3. Tag Beginn Ende Unterrichtseinheit

9:00 9:30 Wiederholung des zweiten Tages

9:30 10:15 Unterrichtseinheit 8: Implementieren von Sichten

10:15 10:45 Übungseinheit A: Implementieren von Sichten

10:45 11:00 Pause

11:00 11:30 Unterrichtseinheit 9: Implementieren gespeicherter Prozeduren

11:30 11:45 Übungseinheit A: Erstellen gespeicherter Prozeduren

11:45 12:45 Mittagspause

12:45 13:45 Unterrichtseinheit 9: Implementieren gespeicherter Prozeduren (Fortsetzung)

13:45 14:30 Übungseinheit B: Erstellen gespeicherter Prozeduren mit Para-metern

14:30 14:45 Pause

14:45 15:15 Unterrichtseinheit 10: Implementieren von benutzerdefinierten Funktionen

15:15 15:45 Übungseinheit A: Erstellen von benutzerdefinierten Funktionen

4. Tag Beginn Ende Unterrichtseinheit

9:00 9:30 Wiederholung des dritten Tages

9:30 10:15 Unterrichtseinheit 11: Implementieren von Triggern

10:15 10:30 Pause

10:30 11:00 Übungseinheit A: Erstellen von Triggern

11:00 12:00 Unterrichtseinheit 12: Programmieren für mehrere Server

12:00 13:00 Mittagspause

13:00 14:00 Übungseinheit A: Verwenden von verteilten Daten

14:00 14:15 Pause

14:15 15:45 Unterrichtseinheit 13: Optimieren der Abfrageleistung

Page 11: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Programmieren einer Microsoft SQL Server 2000-Datenbank xi

5. Tag Beginn Ende Unterrichtseinheit

9:00 9:30 Wiederholung des vierten Tages

9:30 10:15 Übungseinheit A: Optimieren der Abfrageleistung

10:15 10:30 Pause

10:30 11:00 Unterrichtseinheit 14: Analysieren von Abfragen

11:00 12:00 Übungseinheit A: Analysieren von Abfragen mit dem AND-Operator und dem OR-Operator

12:00 13:00 Mittagspause

13:00 13:30 Unterrichtseinheit 14: Analysieren von Abfragen (Fortsetzung)

13:30 14:00 Übungseinheit B: Analysieren von Abfragen mit unterschied-lichen Verknüpfungsstrategien

14:00 14:15 Pause

14:15 15:00 Unterrichtseinheit 15: Verwalten von Transaktionen und Sperren

15:00 16:00 Übungseinheit A: Verwalten von Transaktionen und Sperren

Page 12: Programmieren Einer Microsoft SQL Server 2000-Datenbank

xii Programmieren einer Microsoft SQL Server 2000-Datenbank

Inhalt der Kursleiter-CD Die Kursleiter-CD enthält folgende Dateien und Ordner:

� Default.htm. Diese Datei öffnet die Webseite mit den Unterlagen für den Kursleiter.

� Readme.txt. Diese Datei enthält eine Beschreibung des CD-Inhalts und der Installationsanweisungen im ASCII-Format (kein Word-Dokument).

� 2328A_ms.doc. Diese Datei ist das Handbuch für das manuelle Einrichten von Schulungscomputern. Sie enthält die Schritte zum manuellen Instal-lieren der Schulungsraumcomputer.

� 2328A_sg.doc. Diese Datei ist das Handbuch für das Einrichten von Schulungscomputern. Sie enthält eine Beschreibung der Schulungsraum-anforderungen und der Schulungsraumkonfiguration sowie Anweisungen zum Verwenden der automatisierten Skripts für das Einrichten der Schulungscomputer und die „Checkliste für das Einrichten von Schulungscomputern“.

� Errorlog. Dieser Ordner enthält eine Vorlage, die zum Aufzeichnen von im Kurs auftretenden Fehlern und Korrekturen verwendet wird.

� Fonts. Dieser Ordner enthält Schriftarten, die erforderlich sind, um Präsen-tationen in Microsoft PowerPoint® und webbasierte Materialien anzuzeigen.

� Mplayer. Dieser Ordner enthält Dateien, die zum Installieren von Microsoft Windows Media™ Player erforderlich sind.

� Powerpnt. Dieser Ordner enthält PowerPoint-Folien, die in diesem Kurs verwendet werden.

� Pptview. Dieser Ordner enthält Microsoft PowerPoint Viewer, der zum An-zeigen der PowerPoint-Folien verwendet wird.

� Studentcd. Dieser Ordner enthält die Webseite mit Links zu den diesen Kurs betreffenden Ressourcen, einschließlich weiterer Informationen, der Lern-zielkontrolle und der Antworten zu den Übungseinheiten, der Dateien mit den Übungseinheiten, der Multimediapräsentationen und der Websites mit für den Kurs relevanten Inhalten.

� Tprep. Dieser Ordner enthält die Präsentation zur Vorbereitung des Kurs-leiters, eine kommentierte Präsentation, in der die Anweisungsstrategie für den Kurs sowie Präsentationstipps und Warnungen erklärt werden. Um die Präsentation zu öffnen, klicken Sie auf der Webseite mit den Unterlagen für den Kursleiter auf Präsentation zur Vorbereitung des Kursleiters.

Page 13: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Programmieren einer Microsoft SQL Server 2000-Datenbank xiii

Inhalt der Kursteilnehmer-CD Die Kursteilnehmer-CD enthält folgende Dateien und Ordner:

� Default.htm. Diese Datei öffnet die Webseite mit den Unterlagen für die Kursteilnehmer. Sie stellt den Kursteilnehmern die den Kurs betreffenden Ressourcen zur Verfügung, einschließlich weiterer Informationen, der Lern-zielkontrolle und der Antworten zu den Übungseinheiten, der Dateien mit den Übungseinheiten, der Multimediapräsentationen und der Websites mit für den Kurs relevanten Inhalten.

� Readme.txt. Diese Datei enthält eine Beschreibung des CD-Inhalts und der Installationsanweisungen im ASCII-Format (kein Word-Dokument).

� AddRead. Dieser Ordner enthält zusätzliche Informationen zu diesem Kurs. � Answers. Dieser Ordner enthält Antworten auf alle Fragen in den

Unterrichtseinheiten und praktischen Übungen. � Appendix. Dieser Ordner enthält Anhangdateien für diesen Kurs. � Fonts. Dieser Ordner enthält Schriftarten, die erforderlich sind, um Präsen-

tationen in PowerPoint und webbasierte Materialien anzuzeigen. � Labfiles. Dieser Ordner enthält Dateien, die in den praktischen Übungen

verwendet werden. Diese Dateien können zur Vorbereitung der Kursteil-nehmercomputer für die praktischen Übungen verwendet werden.

� Media. Dieser Ordner enthält Dateien, die in Multimediapräsentationen für diesen Kurs verwendet werden.

� Mplayer. Dieser Ordner enthält Dateien, die zum Installieren von Microsoft Windows Media Player erforderlich sind.

� Pptview. Dieser Ordner enthält PowerPoint Viewer, der zum Anzeigen der PowerPoint-Präsentationen verwendet wird, die die zusätzlichen Informa-tionen begleiten.

� Webfiles. Dieser Ordner enthält Dateien, die zum Anzeigen der Webseite mit den Unterlagen für die Kursteilnehmer erforderlich sind.

� Wordview. Dieser Ordner enthält Word Viewer, der zum Anzeigen belie-biger Dokumentdateien unter Word (DOC-Dateien) verwendet wird, die auf der CD enthalten sind.

Page 14: Programmieren Einer Microsoft SQL Server 2000-Datenbank

xiv Programmieren einer Microsoft SQL Server 2000-Datenbank

Typografische Vereinbarungen Die folgenden typografischen Vereinbarungen werden in den Kursunterlagen verwendet, um Textelemente hervorzuheben.

Vereinbarung Verwendung

���� Kennzeichnet eine Einführungsseite. Dieses Symbol steht neben dem Titel eines Themas, wenn auf der Seite bzw. den folgenden Seiten weitere Informationen zum entsprechenden Thema behan-delt werden.

Fett Kennzeichnet Befehle, Befehlsoptionen und Syntax, die exakt in der angegebenen Weise eingegeben werden müssen. Menübefehle, Schaltflächen, Titel von Dialogfeldern und Optionen und Namen von Symbolen und Menüs werden ebenfalls fett formatiert.

Kursiv Kennzeichnet in Syntaxanweisungen oder anderen beschreibenden Texten die Argumentnamen und Platzhalter für variable Informa-tionen. Auf neue Begriffe, auf Buchtitel und auf besonders hervor-zuhebende Begriffe wird ebenfalls in Kursivschrift hingewiesen.

Majuskel und Fett Kennzeichnet Domänen-, Benutzer-, Computer-, Verzeichnis-, Ordner- und Dateinamen, ausgenommen, wenn auf bestimmte Namen verwiesen wird, bei denen die Groß- und Kleinschreibung beachtet werden muss. Wenn nichts anderes angegeben ist, könnenSie bei der Eingabe eines Verzeichnis- oder Dateinamens in einem Dialogfeld oder an der Eingabeaufforderung Kleinbuchstaben verwenden.

GROSSBUCH-STABEN

Kennzeichnen Tastennamen, Tastenfolgen und Tastenkombina-tionen, z. B. ALT+LEERTASTE.

Festbreiten-schrift

Stellt Codebeispiele oder Beispiele für Bildschirmausgaben dar.

[ ] Zur Kennzeichnung optionaler Elemente in Syntaxanweisungen. So weist z. B. [Dateiname] in einer Befehlssyntax darauf hin, dass Sie wählen können, ob Sie einen Dateinamen mit dem Befehl eingeben möchten. Geben Sie nur die Informationen in den eckigen Klammern, jedoch nicht die Klammern selbst ein.

{ } Zur Kennzeichnung erforderlicher Elemente in Syntaxanweisun-gen. Geben Sie nur die Informationen in den geschweiften Klam-mern, jedoch nicht die Klammern selbst ein.

| Trennt in Syntaxanweisungen zwei Alternativen, von denen nur eine gewählt werden kann.

� Kennzeichnet (in den Übungseinheiten) ein Verfahren mit einer Abfolge von Schritten.

... Gibt in Syntaxanweisungen an, dass das vorausgegangene Element wiederholt werden kann.

.

.

.

Stellt einen ausgelassenen Teil eines Codebeispiels dar.

Page 15: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Inhalt

Einführung 1

Kursunterlagen 2

Voraussetzungen 3

Kursbeschreibung 5

Installation 9

Microsoft Official Curriculum 12

Microsoft Certified Professional-Programm 13

Einrichtungen 15

Einführung

Page 16: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Die in diesen Unterlagen enthaltenen Angaben und Daten können ohne vorherige Ankündigung geändert werden. Die in diesen Unterlagen genannten Firmen, Produkte, Menschen, Charaktere und/oder Daten sind frei erfunden und sollen keine wirklichen Individuen, Gesellschaften, Produkte oder Veranstaltungen darstellen, soweit nichts anderes angegeben ist. Die Benutzer/innen sind verpflichtet, sich an alle anwendbaren Urheberrechtsgesetze zu halten. Ohne ausdrückliche schriftliche Erlaubnis der Microsoft Corporation darf kein Teil dieser Unterlagen für irgendwelche Zwecke vervielfältigt oder übertragen werden, unabhängig davon, auf welche Art und Weise oder mit welchen Mitteln, elektronisch oder mechanisch, dies geschieht. Wenn auf dieses Dokument nur auf elektronischem Wege zugegriffen werden kann, sind Sie hiermit berechtigt, eine (1) Kopie zum persönlichen Gebrauch auszudrucken.

Microsoft Corporation kann Inhaber von Patenten oder Patentanträgen, Marken, Urheberrechten oder anderen gewerblichen Schutzrechten sein, die den Inhalt dieses Dokuments betreffen. Die Bereitstellung dieses Dokuments gewährt keinerlei Lizenzrechte an diesen Patenten, Marken, Urheberrechten oder anderen gewerblichen Schutzrechten, es sei denn, dies wurde ausdrücklich durch einen schriftlichen Lizenzvertrag mit der Microsoft Corporation vereinbart.

2000 Microsoft Corporation. Alle Rechte vorbehalten.

Microsoft, ActiveX, BackOffice, MS-DOS, PowerPoint, Visual Basic, Visual C++, Visual Studio, Windows und Windows NT sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern.

Andere in diesem Dokument aufgeführte Produkt- und Firmennamen sind möglicherweise Marken der jeweiligen Eigentümer.

Project Lead: Rich Rose Instructional Designers: Rich Rose, Cheryl Hoople, Marilyn McGill Instructional Software Design Engineers: Karl Dehmer, Carl Raebler, Rick Byham Technical Lead: Karl Dehmer Subject Matter Experts: Karl Dehmer, Carl Raebler, Rick Byham Graphic Artist: Kirsten Larson (Independent Contractor) Editing Manager: Lynette Skinner Editor: Wendy Cleary Copy Editor: Edward McKillop (S&T Consulting) Production Manager: Miracle Davis Production Coordinator: Jenny Boe Production Support: Lori Walker (S&T Consulting) Test Manager: Sid Benavente Courseware Testing: TestingTesting123 Classroom Automation: Lorrin Smith-Bates Creative Director, Media/Sim Services: David Mahlmann Web Development Lead: Lisa Pease CD Build Specialist: Julie Challenger Online Support: David Myka (S&T Consulting) Localization Manager: Rick Terek Operations Coordinator: John Williams Manufacturing Support: Laura King; Kathy Hershey Lead Product Manager, Release Management: Bo Galford Lead Product Manager, Data Base: Margo Crandall Group Manager, Courseware Infrastructure: David Bramble Group Product Manager, Content Development: Dean Murray General Manager: Robert Stewart

Page 17: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Einführung iii

Hinweise für den Kursleiter In der Unterrichtseinheit zur Einführung erhalten die Kursteilnehmer eine Übersicht über den Kursinhalt. Außerdem enthält diese Unterrichtseinheit logistische Hinweise zum Verlauf des Kurses 2328A, Programmieren einer Microsoft SQL Server 2000-Datenbank.

Kursunterlagen und Vorbereitung Erforderliche Unterlagen Um diesen Kurs zu unterrichten, benötigen Sie folgende Unterlagen:

� Arbeitsbuch für Kursleiter � Kursleiter-CD

Vorbereitende Aufgaben Zur Vorbereitung dieses Kurses gehen Sie folgendermaßen vor:

• Füllen Sie die Checkliste für die Kursvorbereitung aus, die in den Unterlagen für den Kursleiter bereitgestellt wird.

Strategie für die Unterrichtseinheit Verwenden Sie die folgende Strategie, um diese Unterrichtseinheit zu präsentieren:

� Kurs 2328A: Programmieren einer Microsoft SQL Server 2000-DatenbankZeigen Sie die Folie mit der Kursnummer und dem Kurstitel.

� Einführung Begrüßen Sie die Kursteilnehmer zu diesem Kurs, und stellen Sie sich vor. Geben Sie eine kurze Übersicht über Ihren beruflichen Werdegang, um Ihre Kompetenz als Kursleiter zu unterstreichen. Bitten Sie die Kursteilnehmer, sich vorzustellen und ihrerseits eine Über-sicht über Beruf, Produkterfahrung und Schulungserwartungen zu geben. Halten Sie die Erwartungen der Kursteilnehmer auf einer Tafel oder einem Flipchart fest, und greifen Sie diese Themen im Verlauf der Unterrichts-einheit auf.

� Kursunterlagen Erläutern Sie den Zweck aller in diesem Kurs verwendeten Unterlagen. Teilen Sie den Kursteilnehmern mit, dass sie am Ende des Kurses Gelegen-heit haben, mit Hilfe des Microsoft® Online Evaluation Systems Feedback zum Kurs und zu den Einrichtungen zu geben.

� Voraussetzungen Teilen Sie den Kursteilnehmern mit, welche Voraussetzungen vor der Teil-nahme an diesem Kurs erfüllt sein müssen. Dies ist eine Gelegenheit, um festzustellen, ob es Kursteilnehmer gibt, die möglicherweise nicht über den entsprechenden Hintergrund oder die Erfahrungen verfügen, die für die Teilnahme am Kurs erforderlich sind.

Präsentation:30 Minuten

Page 18: Programmieren Einer Microsoft SQL Server 2000-Datenbank

iv Einführung

� Kursbeschreibung Geben Sie eine Übersicht über die einzelnen Unterrichtseinheiten und Lern-ziele.Stellen Sie einen Bezug zwischen den Themen der Unterrichtseinheiten und den Erwartungen der Kursteilnehmer her.

� Installation Geben Sie den Kursteilnehmern alle notwendigen Installationsinforma-tionen für den Kurs.

� Microsoft Official Curriculum Geben Sie eine Übersicht über das Microsoft Official Curriculum-Pro-gramm (MOC), und verweisen Sie die Kursteilnehmer auf die Microsoft Official Curriculum-Webseite unter der folgenden Adresse: http://www.microsoft.com/train_cert/moc

� Microsoft Certified Professional-Programm Informieren Sie die Kursteilnehmer über das Microsoft Certified Professional-Programm (MCP) und die verschiedenen Zertifizierungs-möglichkeiten.

� Einrichtungen Erläutern Sie die Einrichtungen am Schulungsort.

Page 19: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Einführung 1

Einführung

� Name

� Firmenzugehörigkeit

� Titel/Funktion

� Beruflicher Verantwortungsbereich

� Programmieren, Netzwerk, Datenbankverwaltung

� Erfahrungen mit SQL Server

� Erwartungen an den Kurs

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

ThemaStellen Sie sich vor, wecken Sie Vertrauen in Ihre Kom-petenz als Kursleiter, und fordern Sie die Kursteil-nehmer auf, sich vorzu-stellen und ihre Erwartun-gen an den Kurs zu definieren.

EinstiegGuten Morgen. Willkommen zum Kurs Programmieren einer Microsoft SQL Server 2000-Datenbank.

Ich heiße...

Stellen Sie sich vor.

Geben Sie eine kurze Über-sicht über Ihren beruflichen Werdegang, um Ihre Kom-petenz als Kursleiter für SQL Server zu unter-streichen.

Bitten Sie die Kursteilneh-mer, sich anhand der aufgeführten Stichpunkte vorzustellen.

Methodischer Hinweis Notieren Sie während der Vorstellung der Kursteil-nehmer deren Erwartungen an den Kurs auf einer Tafel oder einem Flipchart.

Page 20: Programmieren Einer Microsoft SQL Server 2000-Datenbank

2 Einführung

Kursunterlagen

� Namensschild

� Arbeitsbuch für Kursteilnehmer

� Kursteilnehmer-CD

� Feedbackbogen

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Das Kit enthält die folgenden Unterlagen:

� Namensschild. Schreiben Sie Ihren Namen auf beide Seiten des Namens-schildes.

� Arbeitsbuch für Kursteilnehmer. Das Arbeitsbuch für Kursteilnehmer enthält die in diesem Kurs behandelten Themen sowie die Übungen der praktischen Übungseinheiten.

� Kursteilnehmer-CD. Die Kursteilnehmer-CD enthält die Webseite mit Hyperlinks zu den diesen Kurs betreffenden Ressourcen, einschließlich weiterführender Literatur, der Antworten zur Lernzielkontrolle und zu den Übungseinheiten, der Dateien mit den Übungseinheiten, der Multimedia-präsentationen und der Websites mit für den Kurs relevanten Inhalten.

Um die Webseite zu öffnen, legen Sie die Kursteilnehmer-CD in das CD-ROM-Laufwerk ein, und doppelklicken Sie dann im Stammver-zeichnis der CD auf Default.htm.

� Feedbackbogen. Füllen Sie nach Beendigung des Kurses den Feedback-bogen aus, um Feedback zum Kursleiter, zum Kurs und zum Software-produkt abzugeben. Mit Hilfe Ihrer Kommentare können zukünftige Kurse weiter verbessert werden. Wenn Sie weitere Kommentare zu den Kursunterlagen abgeben möchten, können Sie eine entsprechende E-Mail an die folgende Adresse senden: [email protected]. Die Betreffzeile muss die Angabe Kurs 2328A (2073A) enthalten. Wenn Sie weitere Kommentare zum MCP-Programm abgeben oder sich über dieses Programm informieren möchten, können Sie eine E-Mail an die folgende Adresse senden: [email protected]

ThemaZeigen und beschreiben Sie die Kursunterlagen.

EinstiegWir haben alle für den Kurs erforderlichen Unterlagen für Sie zusammengestellt. Auf Ihren Tischen finden Sie die folgenden Unterlagen...

Beschreiben Sie den Inhalt des Arbeitsbuches und der Kursteilnehmer-CD.

Bitten Sie die Kursteilneh-mer, ihre Namen auf beide Seiten des Namensschildes zu schreiben.

Weisen Sie die Kursteilneh-mer darauf hin, dass Sie am Ende des Kurses einen Feedbackbogen ausfüllen müssen.

Teilen Sie den Kursteilneh-mern die Adresse mit, an die sie Kommentare senden können.

Methodischer Hinweis Führen Sie vor, wie die auf der Kursteilnehmer-CD bereitgestellte Webseite geöffnet wird. Doppelklicken Sie auf der Kursleiter-CD im Ordner StudentCD auf Default.htm.

Anmerkung

Page 21: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Einführung 3

Voraussetzungen

� Erfahrung im Verwenden des Microsoft Windows 2000-Betriebssystems

� Kenntnisse der grundlegenden Konzepte relationaler Datenbanken

� Kenntnisse der grundlegenden Transact-SQL-Syntax(SELECT-, UPDATE- und INSERT-Anweisungen)

� Kenntnis der Rolle des Datenbankadministrators

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Für diesen Kurs müssen die folgenden Voraussetzungen erfüllt werden:

� Erfahrung im Verwenden des Microsoft Windows® 2000-Betrriebssystems für folgende Aufgaben:

• Herstellen von Verbindungen zwischen Clients unter Windows 2000 mit Netzwerken und dem Internet.

• Konfigurieren der Windows 2000-Umgebung.

• Erstellen und Verwalten von Benutzerkonten.

• Verwalten des Zugriffs auf Ressourcen mit Hilfe von Gruppen.

• Konfigurieren und Verwalten von Datenträgern und Partitionen, einschließlich Datenträgerstriping und -spiegelung.

• Verwalten von Daten mit Hilfe des NTFS-Dateisystems.

• Implementieren von Windows 2000-Sicherheit.

• Optimieren der Leistung in Windows 2000. Kursteilnehmer, die diese Voraussetzungen nicht erfüllen, können die erforderlichen Kenntnisse und Fähigkeiten in den folgenden Kursen erwerben:

• Kurs 2046, Microsoft Windows 2000 - Grundlagen zum Netzwerk und Betriebssystem

• Kurs 2054, Implementieren von Microsoft Windows 2000 Professional und Server

ThemaBenennen und beschreiben Sie die Voraussetzungen für diesen Kurs.

EinstiegFür diesen Kurs müssen Sie über die folgenden Kenntnisse verfügen.

Page 22: Programmieren Einer Microsoft SQL Server 2000-Datenbank

4 Einführung

� Kenntnisse der grundlegenden Konzepte relationaler Datenbanken, ein-schließlich folgender Kenntnisse:

• Logischer und physischer Datenbankentwurf.

• Konzepte der Datenintegrität.

• Beziehungen zwischen Tabellen und Spalten (Primärschlüssel und Fremdschlüssel, 1:1, 1:n, n:n).

• Speichern von Daten in Tabellen (Zeilen und Spalten). Kursteilnehmer, die diese Voraussetzungen nicht erfüllen, können die erfor-derlichen Kenntnisse und Fähigkeiten im folgenden Kurs erwerben:

• Kurs 1609, Designing Data Services and Data Models� Kenntnisse der grundlegenden Transact-SQL-Syntax (SELECT-, UPDATE-

und INSERT-Anweisungen). Kursteilnehmer, die diese Voraussetzungen nicht erfüllen, können die erforderlichen Kenntnisse und Fähigkeiten im folgenden Kurs erwerben:

• Kurs 2316A, Abfragen von Microsoft SQL Server 2000 mit Hilfe von Transact-SQL

� Kenntnis der Rolle des Datenbankadministrators.

Page 23: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Einführung 5

Kursbeschreibung

� Unterrichtseinheit 1: Übersicht über SQL Server� Unterrichtseinheit 2: Übersicht über die SQL Server-

Programmierung� Unterrichtseinheit 3: Erstellen und Verwalten von

Datenbanken� Unterrichtseinheit 4: Erstellen von Datentypen und

Tabellen� Unterrichtseinheit 5: Implementieren der Datenintegrität� Unterrichtseinheit 6: Planen von Indizes� Unterrichtseinheit 7: Erstellen und Verwalten von Indizes� Unterrichtseinheit 8: Implementieren von Sichten

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Unterrichtseinheit 1, „Übersicht über SQL Server“, gibt eine allgemeine Über-sicht über die Plattformen, die Architektur, die Komponenten und die Sicherheit von Microsoft SQL Server™ 2000. Außerdem werden wichtige Begriffe und Konzepte zu SQL Server behandelt und definiert. In dieser Unterrichtseinheit wird erläutert, wie gut SQL Server in Windows 2000 und in andere Server-anwendungen von Microsoft integriert werden kann. Die Unterrichtseinheit endet mit einer Übersicht über die SQL Server-Verwaltung und die SQL Server-Datenbankimplementierung sowie über Entwurfsoptionen für Anwendungen.

Unterrichtseinheit 2, „Übersicht über die SQL Server-Programmierung“, gibt den Kursteilnehmern eine Übersicht über die Anwendungsarchitektur auf Orga-nisationsebene und Transact-SQL als Programmiersprache. Transact-SQL ist eine Datendefinitions-, Datenbearbeitungs- und Datensteuerungssprache. Bei den Kursteilnehmern werden Kenntnisse in Bezug auf ANSI-SQL und grund-legende Programmierkonzepte wie Funktionen, Operatoren, Variablen und Ablaufsteuerungsanweisungen vorausgesetzt. Den Kursteilnehmern werden darüber hinaus die verschiedenen Methoden zum Ausführen von Transact-SQL vermittelt.

Unterrichtseinheit 3, „Erstellen und Verwalten von Datenbanken“, beschreibt, wie eine Datenbank erstellt wird, wie Datenbankoptionen festgelegt und Datei-gruppen erstellt werden und wie eine Datenbank und das Transaktionsprotokoll verwaltet werden. Außerdem wird behandelt, wie Speicherplatz reserviert wird und wie das Transaktionsprotokoll Datenänderungen aufzeichnet.

Unterrichtseinheit 4, „Erstellen von Datentypen und Tabellen“, erläutert, wie Datentypen und Tabellen erstellt und Transact-SQL-Skripts generiert werden, die Anweisungen enthalten, mit denen eine Datenbank und deren Objekte erstellt werden.

ThemaGeben Sie eine Übersicht über die einzelnen Unter-richtseinheiten und Lern-ziele.

EinstiegIn diesem Kurs werden folgende Themen behan-delt...

Geben Sie eine kurze Be-schreibung jeder Unter-richtseinheit.

Gehen Sie bei der Beschrei-bung der einzelnen Unter-richtseinheiten auf alle Be-reiche ein, die den zuvor geäußerten Erwartungen der Kursteilnehmer entsprechen.

Page 24: Programmieren Einer Microsoft SQL Server 2000-Datenbank

6 Einführung

Unterrichtseinheit 5, „Implementieren der Datenintegrität“, stellt zentral ver-waltete Datenintegrität als einen Vorteil relationaler Datenbanken dar. Diese Unterrichtseinheit beginnt mit einer Einführung in die Konzepte der Daten-integrität, einschließlich der Methoden, die zum Erzwingen der Datenintegrität verfügbar sind. Dann wird ein Abschnitt zu Einschränkungen behandelt. Ein-schränkungen stellen die zentrale Methode zum Sicherstellen der Dateninteg-rität dar. Die Erstellung, die Implementierung und das Deaktivieren von Ein-schränkungen wird erläutert. Die Unterrichtseinheit behandelt weiterhin Stan-dardwerte und Regeln, die eine alternative Methode zum Erzwingen der Daten-integrität bereitstellen. Die Unterrichtseinheit endet mit einem Vergleich der unterschiedlichen Methoden zum Erzwingen der Datenintegrität.

Unterrichtseinheit 6, „Planen von Indizes“, gibt den Kursteilnehmern eine Übersicht über das Planen von Indizes. Es wird erläutert, wie Indizes die Daten-bankleistung verbessern können. Außerdem wird beschrieben, wie gruppierte und nicht gruppierte Indizes in SQL Server gespeichert werden und wie SQL Server mit Hilfe von Indizes Zeilen abruft. Weiterhin wird gezeigt, wie SQL Server Indizes verwaltet. Abschließend werden die Richtlinien beschrie-ben, mit deren Hilfe entschieden werden kann, welche Spalten indiziert werden sollen.

Unterrichtseinheit 7, „Erstellen und Verwalten von Indizes“, gibt den Kursteil-nehmern eine Übersicht über das Erstellen und Verwalten von Indizes mit den CREATE INDEX-Optionen. Es wird erläutert, wie Indizes mit Wartungsver-fahren physisch geändert werden. In der Unterrichtseinheit werden Wartungs-tools behandelt und die Verwendung von Statistiken wird beschrieben. Darüber hinaus werden Möglichkeiten aufgezeigt, um zu prüfen, ob Indizes verwendet werden, und es wird erklärt, wie festgestellt werden kann, ob die Indizes eine optimale Leistung aufweisen. Die Unterrichtseinheit schließt mit einer Erklärung, wann der Indexoptimierungs-Assistent eingesetzt werden sollte.

Unterrichtseinheit 8, „Implementieren von Sichten“, zeigt, wie Sichten das Speichern einer vordefinierten Abfrage als Objekt in der Datenbank ermög-lichen, um es zu einem späteren Zeitpunkt zu verwenden. Sie bieten eine ein-fache Möglichkeit, vertrauliche Daten zu schützen oder die Komplexität einer Datenbankstruktur zu verbergen und Informationen bereitzustellen, ohne dass die Benutzer Transact-SQL-Anweisungen schreiben und ausführen müssen. In der Unterrichtseinheit werden außerdem Sichten und deren Vorteile definiert. Im weiteren Verlauf der Unterrichtseinheit wird beschrieben, wie Sichten er-stellt werden, und es werden Beispiele für Projektionen und Verknüpfungen bereitgestellt. Die Beispiele zeigen, wie berechnete Spalten und integrierte Funktionen in die Sichtdefinitionen eingeschlossen werden. Anschließend behandelt die Unterrichtseinheit Einschränkungen beim Ändern von Daten durch Sichten. Im letzten Abschnitt wird erläutert, wie Sichten die Leistung verbessern können.

Page 25: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Einführung 7

Kursbeschreibung (Fortsetzung)

� Unterrichtseinheit 9: Implementieren gespeicherter Prozeduren

� Unterrichtseinheit 10: Implementieren von benutzer-definierten Funktionen

� Unterrichtseinheit 11: Implementieren von Triggern� Unterrichtseinheit 12: Programmieren für mehrere Server� Unterrichtseinheit 13: Optimieren der Abfrageleistung� Unterrichtseinheit 14: Analysieren von Abfragen� Unterrichtseinheit 15: Verwalten von Transaktionen und

Sperren

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Unterrichtseinheit 9, „Implementieren gespeicherter Prozeduren“, beschreibt die Verwendung gespeicherter Prozeduren, um den Entwurf und die Leistung von Anwendungen zu verbessern, indem Geschäftsregeln gekapselt werden. Es werden Verfahren zum Verarbeiten häufig verwendeter Abfragen und Daten-änderungen erläutert. In der Unterrichtseinheit werden viele Beispiele und Vor-führungen zu gespeicherten Prozeduren bereitgestellt.

Unterrichtseinheit 10, „Implementieren von benutzerdefinierten Funktionen“, erläutert die Implementierung benutzerdefinierter Funktionen. Es werden die drei Arten von benutzerdefinierten Funktionen und die allgemeine Syntax zum Erstellen und Ändern der Funktionen erläutert. Außerdem wird zu jeder Art ein Beispiel gegeben.

Unterrichtseinheit 11, „Implementieren von Triggern“, zeigt, dass Trigger hilf-reiche Tools für Datenbankimplementierer sind, die vordefinierte Aktionen aus-führen möchten, sobald aus einer bestimmten Tabelle Daten eingefügt, aktuali-siert oder gelöscht werden. Sie eignen sich besonders für das Kaskadieren von Änderungen über andere Tabellen in der Datenbank, während die komplexe referenzielle Integrität erhalten bleibt.

Unterrichtseinheit 12, „Programmieren für mehrere Server“, gibt den Kursteil-nehmern Informationen, wie Sicherheit für eine Multiserverumgebung ent-worfen wird. Es wird außerdem beschrieben, wie verteilte Abfragen, verteilte Transaktionen und partitionierte Sichten erstellt werden.

Unterrichtseinheit 13, „Optimieren der Abfrageleistung“, vermittelt den Kurs-teilnehmern, wie der Abfrageoptimierer arbeitet, wie Abfrageplaninformationen abgerufen werden und wie Indizierungsstrategien implementiert werden.

Page 26: Programmieren Einer Microsoft SQL Server 2000-Datenbank

8 Einführung

Unterrichtseinheit 14, „Analysieren von Abfragen“, beschreibt, wie der Ab-frageoptimierer Abfragen auswertet und verarbeitet, die den AND-Operator und den OR-Operator sowie Verknüpfungsoperationen enthalten.

Unterrichtseinheit 15, „Verwalten von Transaktionen und Sperren“, stellt dar, wie Transaktionen und Sperren die Integrität von Transaktionen bei gleichzei-tiger Verwendung sicherstellen. Anschließend folgt eine Diskussion darüber, wie Transaktionen ausgeführt werden und wie ein Rollback für die Transaktion ausgeführt wird. Eine kurze Animation soll verdeutlichen, wie die Trans-aktionsverarbeitung abläuft. Als Nächstes wird beschrieben, wie SQL Server 2000-Sperren die Datenkonsistenz und Parallelität aufrechterhalten. Es werden dann Ressourcen, die gesperrt werden können, verschiedene Typen von Sperren und die Kompatibilität von Sperren vorgestellt. Dann folgt eine Diskussion zu dynamischen Sperren von SQL Server basierend auf dem Schema und der Abfrage. Im letzten Abschnitt werden einige Sperroptionen erläutert, Deadlocks beschrieben, und es wird erklärt, wie Informationen zu aktiven Sperren angezeigt werden.

Page 27: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Einführung 9

Installation

� Software

� Kursdateien

� Einrichten des Schulungsraumes

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Die Schulungsraumumgebung wurde mit Software und einem Pfad zu Kurs-dateien eingerichtet, die Sie im Verlauf des Kurses verwenden werden. Sie sollten außerdem die Schulungsraumkonfiguration beachten, in der Sie die Übungseinheiten durchführen werden.

SoftwareDie folgenden Software wird im Schulungsraum verwendet:

� Microsoft Windows 2000 Advanced Server � Microsoft SQL Server 2000 Enterprise Edition

KursdateienZu den Übungseinheiten des Kurses gehören Dateien. Diese Dateien befinden sich in C:\Moc\2328A\Labfiles auf den Kursteilnehmercomputern.

ThemaGeben Sie die notwen-digen Informationen zur Schulungsraumumgebung.

EinstiegDie Schulungsraumumge-bung wurde mit Software und einem Pfad zu Kurs-dateien eingerichtet, die Sie im Verlauf des Kurses ver-wenden werden. Sie sollten außerdem die Schulungs-raumkonfiguration beachten, in der Sie die Übungs-einheiten durchführen werden.

Page 28: Programmieren Einer Microsoft SQL Server 2000-Datenbank

10 Einführung

Einrichten des Schulungsraumes Der Schulungsraum ist im einfachen Domänen/Arbeitsgruppenmodell konfiguriert, wie in der nachfolgenden Grafik dargestellt.

Auf jedem Kursteilnehmercomputer ist Windows 2000 Advanced Server als eigenständiger Server einer Arbeitsgruppe installiert.

Der Aufbau des Schulungsraumes soll die Organisation des weltweit agieren-den Handelsunternehmens Northwind Traders widerspiegeln. Das Unternehmen hat den fiktiven Domänennamen nwtraders.msft. Der primäre DNS-Server für nwtraders.msft ist der Kursleitercomputer, dessen IP-Adresse (Internet-protokoll) 192.168.x.200 lautet (wobei x die zugewiesene Schulungsraum-nummer ist). Der Name des Kursleitercomputers ist London.

Page 29: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Einführung 11

Die folgende Tabelle stellt den Benutzernamen, den Computernamen und die IP-Adresse für jeden Kursteilnehmercomputer in der fiktiven Domäne nwtraders.msft bereit. Suchen Sie den Ihrem Computer zugewiesenen Benutzernamen und notieren Sie ihn.

Benutzername Computername IP-Adresse

SQLAdmin1 Vancouver 192.168.x.1

SQLAdmin2 Denver 192.168.x.2

SQLAdmin3 Perth 192.168.x.3

SQLAdmin4 Brisbane 192.168.x.4

SQLAdmin5 Lisbon 192.168.x.5

SQLAdmin6 Bonn 192.168.x.6

SQLAdmin7 Lima 192.168.x.7

SQLAdmin8 Santiago 192.168.x.8

SQLAdmin9 Bangalore 192.168.x.9

SQLAdmin10 Singapore 192.168.x.10

SQLAdmin11 Casablanca 192.168.x.11

SQLAdmin12 Tunis 192.168.x.12

SQLAdmin13 Acapulco 192.168.x.13

SQLAdmin14 Miami 192.168.x.14

SQLAdmin15 Auckland 192.168.x.15

SQLAdmin16 Suva 192.168.x.16

SQLAdmin17 Stockholm 192.168.x.17

SQLAdmin18 Moscow 192.168.x.18

SQLAdmin19 Caracas 192.168.x.19

SQLAdmin20 Montevideo 192.168.x.20

SQLAdmin21 Manila 192.168.x.21

SQLAdmin22 Tokyo 192.168.x.22

SQLAdmin23 Khartoum 192.168.x.23

SQLAdmin24 Nairobi 192.168.x.24

Page 30: Programmieren Einer Microsoft SQL Server 2000-Datenbank

12 Einführung

Microsoft Official Curriculum

� Betriebssysteme der Microsoft Windows-Familie

� Microsoft Office� Microsoft BackOffice

Small Business Server� Microsoft SQL Server� Microsoft Exchange

� Microsoft BackOffice Server-Infrastrukturund -Lösungen

� Microsoft FrontPage� Microsoft Systems

Management Server� Knowledge Management-

Lösungen

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Bei MOC handelt es sich um praxisorientierte, in einem Schulungsraum durch-geführte, webbasierte Schulungen. Microsoft entwickelt auf die Vermittlung von Fähigkeiten ausgerichtete Schulungen für Computerexperten, die mit Hilfe von Microsoft-Produkten, -Lösungen und -Technologien Lösungen entwickeln, unterstützen und implementieren. MOC-Kurse stehen für die folgenden Pro-dukte und Lösungen zur Verfügung:

� Betriebssysteme der Microsoft Windows-Familie � Microsoft Office � Microsoft BackOffice® Small Business Server � Microsoft SQL Server � Microsoft Exchange � Microsoft BackOffice Server-Infrastruktur und -Lösungen � Microsoft FrontPage®

� Microsoft Systems Management Server � Knowledge Management-Lösungen

MOC stellt einen Curriculum-Pfad für jedes Produkt und jede Lösung zur Ver-fügung. Weitere Informationen zu den Curriculum-Pfaden finden Sie auf der MOC-Webseite unter der folgenden Adresse: http://www.microsoft.com/train_cert/moc/

Auf der MOC-Webseite werden Informationen zu den MOC-Kursen bereitge-stellt. Darüber hinaus finden Sie auf dieser Seite empfohlene Curriculum-Pfade für Benutzer, die in die IT-Industrie (Information Technology) einsteigen, die die Schulung zu Microsoft-Produkten und -Lösungen fortsetzen möchten oder die zurzeit Produkte unterstützen, die nicht von Microsoft stammen.

ThemaBeschreiben Sie das MOC-Programm, und stellen Sie Informationen zu den Curriculum-Pfaden bereit.

EinstiegSprechen wir kurz über das Microsoft Official Curriculum-Programm.

Page 31: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Einführung 13

Microsoft Certified Professional-Programm

� Microsoft Certified Systems Engineer (MCSE)

� Microsoft Certified Database Administrator (MCDBA)

� Microsoft Certified Solution Developer (MCSD)

� Microsoft Certified Professional + Site Building(MCP + Site Building)

� Microsoft Certified Professional (MCP)

� Microsoft Certified Trainer (MCT)

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Das Microsoft Certified Professional-Programm (MCP) ist die beste Möglichkeit, um Ihre Kompetenz als Experte von Microsoft-Produkten und -Technologien zu belegen. In der folgenden Tabelle werden die Zertifizierungen ausführlich erläutert.

Zertifizierung Beschreibung

Microsoft Certified Systems Engineer (MCSE)

MCSEs verfügen über die Qualifikation, Informationssysteme in einer Vielzahl von Computerumgebungen unter Windows 2000 und BackOffice effizient zu planen, zu implementieren, zu verwalten und zu unterstützen.

Microsoft Certified Database Administrator (MCDBA)

MCDBAs verfügen über die Qualifikation zum Erstellen physischer Datenbank-entwürfe, Entwickeln logischer Datenmodelle, Erstellen physischer Datenbanken, Erstellen von Datendiensten mit Hilfe von Transact-SQL, Verwalten und Pflegen von Datenbanken, Konfigurieren und Verwalten der Sicherheit, Überwachen und Optimieren von Datenbanken sowie zum Installieren und Konfigurieren von SQL Server.

Microsoft Certified Solution Developer (MCSD)

MCSDs verfügen über die Qualifikation, mit Hilfe von Microsoft-Produkten, wie z. B. SQL Server, Microsoft Visual Studio® und Komponentendienste, webbasierte, verteilte und für den Handel einsetzbare Anwendungen zu erstellen.

Microsoft Certified Professional + Site Building (MCP + Site Building)

MCPs mit einer Spezialisierung im Bereich Sitebuilding sind qualifiziert, Websites mit Microsoft-Technologien und -Produkten zu planen, zu erstellen, zu warten und zu verwalten.

Microsoft Certified Professional (MCP)

MCPs verfügen über detaillierte Kenntnisse zu mindestens einem Produkt. Diese Kenntnisse müssen in einer beliebigen Prüfung (ausgenommen Netzwerkgrund-lagen) nachgewiesen werden.

Microsoft Certified Trainer (MCT)

MCTs verfügen über spezielle didaktische und technische Fähigkeiten, die sie dazu qualifizieren, das Microsoft Official Curriculum (MOC) in Microsoft Certified Technical Education Centers (Microsoft CTECs) zu unterrichten.

ThemaInformieren Sie die Kursteilnehmer über das Microsoft Certified Professional-Programm.

EinstiegDas Microsoft Certified Professional-Programm verfügt über die folgenden Zertifizierungen.

Page 32: Programmieren Einer Microsoft SQL Server 2000-Datenbank

14 Einführung

Zertifizierungsanforderungen Die Zertifizierungsanforderungen unterscheiden sich je nach Zertifizierungsart und orientieren sich an den Produkten und Tätigkeiten, für die die jeweilige Zertifizierung gilt. Um den Status eines Microsoft Certified Professionals zu erlangen, müssen Sie strenge Zertifizierungsprüfungen absolvieren, die eine gültige und zuverlässige Messung der technischen Fertigkeiten und Sachkennt-nisse zulassen.

Weitere Informationen finden Sie im Abschnitt „Microsoft Training und Zertifizierung“ der auf der CD bereitgestellten Webseite oder in der Website zu Microsoft Training und Zertifizierung unter der folgenden Adresse: http://www.microsoft.com/germany/training/Falls Sie besondere Fragen zur Zertifizierung haben, können Sie auch eine E-Mail an die folgende Adresse senden: [email protected]

Vorbereiten auf eine MCP-Prüfung Mit MOC können Sie sich auf MCP-Prüfungen vorbereiten. Es besteht jedoch keine 1:1-Entsprechung zwischen den Inhalten der MOC-Kurse und den Inhal-ten der MCP-Prüfungen. Microsoft sieht das MOC nicht als einziges Vorberei-tungstool für das Bestehen einer MCP-Prüfung an. Praktische Produktkennt-nisse und -erfahrungen sind für das Bestehen einer MCP-Prüfung ebenfalls erforderlich.

Als Unterstützung bei den Vorbereitungen auf die MCP-Prüfungen können Sie die Leitfäden zur Vorbereitung verwenden, die für jede Prüfung zur Verfügung stehen. Alle Leitfäden zur Prüfungsvorbereitung enthalten prüfungsspezifische Informationen, wie beispielsweise eine Liste der Themen, zu denen Sie geprüft werden. Diese Leitfäden sind in der Microsoft Certified Professional-Website unter der folgenden Adresse verfügbar: http://www.microsoft.com/train_cert/moc/

Weitere Informationen

Page 33: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Einführung 15

Einrichtungen

Öffnungszeiten

Parkplätze

Toiletten

Kantine

Telefone

Nachrichten

Raucherzonen

Recycling

Kurszeiten

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

ThemaInformieren Sie die Kursteil-nehmer über die örtlichen Einrichtungen und die zu beachtenden Regeln auf dem Schulungsgelände.

EinstiegBevor wir mit der Schulung beginnen, möchte ich Sie über die Einrichtungen im Schulungsgebäude infor-mieren.

Informieren Sie die Kursteil-nehmer über die Kurszeiten, Mahlzeiten, Öffnungszeiten des Gebäudes für die Bear-beitung der Übungseinhei-ten, Parkmöglichkeiten, Toiletten, Raucherzonen, Telefone und Möglichkeiten zur Übermittlung von Nach-richten.

Informieren Sie die Kursteil-nehmer gegebenenfalls auch über das Recycling-programm.

Page 34: Programmieren Einer Microsoft SQL Server 2000-Datenbank

2 Einführung

This page is intentionally left blank.

Page 35: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 1: Übersicht über SQL Server

Inhalt

Übersicht 1

Informationen zu SQL Server 2

SQL Server-Integration 12

SQL Server-Datenbanken 18

SQL Server-Sicherheit 28

Arbeiten mit SQL Server 35

Übungseinheit A: Übersicht über SQL Server 44

Lernzielkontrolle 50

Page 36: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Die in diesen Unterlagen enthaltenen Angaben und Daten können ohne vorherige Ankündigung geändert werden. Die in diesen Unterlagen genannten Firmen, Produkte, Menschen, Charaktere und/oder Daten sind frei erfunden und sollen keine wirklichen Individuen, Gesellschaften, Produkte oder Veranstaltungen darstellen, soweit nichts anderes angegeben ist. Die Benutzer/innen sind verpflichtet, sich an alle anwendbaren Urheberrechtsgesetze zu halten. Ohne ausdrückliche schriftliche Erlaubnis der Microsoft Corporation darf kein Teil dieser Unterlagen für irgendwelche Zwecke vervielfältigt oder übertragen werden, unabhängig davon, auf welche Art und Weise oder mit welchen Mitteln, elektronisch oder mechanisch, dies geschieht. Wenn auf dieses Dokument nur auf elektronischem Wege zugegriffen werden kann, sind Sie hiermit berechtigt, eine (1) Kopie zum persönlichen Gebrauch auszudrucken.

Microsoft Corporation kann Inhaber von Patenten oder Patentanträgen, Marken, Urheberrechten oder anderen gewerblichen Schutzrechten sein, die den Inhalt dieses Dokuments betreffen. Die Bereitstellung dieses Dokuments gewährt keinerlei Lizenzrechte an diesen Patenten, Marken, Urheberrechten oder anderen gewerblichen Schutzrechten, es sei denn, dies wurde ausdrücklich durch einen schriftlichen Lizenzvertrag mit der Microsoft Corporation vereinbart.

2000 Microsoft Corporation. Alle Rechte vorbehalten.

Microsoft, ActiveX, BackOffice, MS-DOS, PowerPoint, Visual Basic, Visual C++, Visual Studio, Windows und Windows NT sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern.

Andere in diesem Dokument aufgeführte Produkt- und Firmennamen sind möglicherweise Marken der jeweiligen Eigentümer.

Project Lead: Rich Rose Instructional Designers: Rich Rose, Cheryl Hoople, Marilyn McGill Instructional Software Design Engineers: Karl Dehmer, Carl Raebler, Rick Byham Technical Lead: Karl Dehmer Subject Matter Experts: Karl Dehmer, Carl Raebler, Rick Byham Graphic Artist: Kirsten Larson (Independent Contractor) Editing Manager: Lynette Skinner Editor: Wendy Cleary Copy Editor: Edward McKillop (S&T Consulting) Production Manager: Miracle Davis Production Coordinator: Jenny Boe Production Support: Lori Walker (S&T Consulting) Test Manager: Sid Benavente Courseware Testing: TestingTesting123 Classroom Automation: Lorrin Smith-Bates Creative Director, Media/Sim Services: David Mahlmann Web Development Lead: Lisa Pease CD Build Specialist: Julie Challenger Online Support: David Myka (S&T Consulting) Localization Manager: Rick Terek Operations Coordinator: John Williams Manufacturing Support: Laura King; Kathy Hershey Lead Product Manager, Release Management: Bo Galford Lead Product Manager, Data Base: Margo Crandall Group Manager, Courseware Infrastructure: David Bramble Group Product Manager, Content Development: Dean Murray General Manager: Robert Stewart

Page 37: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 1: Übersicht über SQL Server iii

Hinweise für den Kursleiter Diese Unterrichtseinheit gibt eine allgemeine Übersicht über die Plattformen, die Architektur, die Komponenten und die Sicherheit von Microsoft® SQL Server™ 2000. Außerdem werden wichtige Begriffe und Konzepte zu SQL Server behandelt und definiert. In dieser Unterrichtseinheit wird erläutert, wie gut SQL Server in Microsoft Windows® 2000 und in andere Serveranwen-dungen von Microsoft integriert werden kann. Die Unterrichtseinheit endet mit einer Übersicht über Verwaltungs- und Implementierungsaktivitäten für die SQL Server-Datenbank sowie mit Entwurfsoptionen für SQL Server-Anwen-dungen.

Am Ende dieser Unterrichtseinheit werden die Kursteilnehmer in der Lage sein, die folgenden Aufgaben auszuführen:

� Beschreiben von SQL Server 2000 und den unterstützten Betriebssystem-plattformen.

� Beschreiben der SQL Server-Integration in Windows 2000 und in andere Serveranwendungen.

� Beschreiben von SQL Server-Datenbanken. � Beschreiben der SQL Server-Sicherheit. � Beschreiben der Verwaltungs- und Implementierungsaktivitäten für die

SQL Server-Datenbank sowie der Entwurfsoptionen für SQL Server-Anwendungen.

Unterlagen und Vorbereitung In diesem Abschnitt werden die erforderlichen Unterlagen und vorbereitenden Aufgaben erläutert, die nötig sind, um diese Unterrichtseinheit zu unterrichten.

Erforderliche Unterlagen Um diese Unterrichtseinheit zu unterrichten, benötigen Sie folgende Unterlagen:

� Die Microsoft PowerPoint®-Datei 2328A_01.ppt� Die Beispieldatei C:\Moc\2328A\Demo\D01_Ex.sql, die alle Beispiel-

skripts der Unterrichtseinheit enthält, soweit in der Unterrichtseinheit nichts anderes angegeben ist.

Vorbereitende Aufgaben Zur Vorbereitung dieser Unterrichtseinheit gehen Sie folgendermaßen vor:

� Lesen Sie alle Unterlagen für diese Unterrichtseinheit. � Arbeiten Sie die Übungseinheit durch.

Präsentation:60 Minuten

Übungseinheit:30 Minuten

Page 38: Programmieren Einer Microsoft SQL Server 2000-Datenbank

iv Unterrichtseinheit 1: Übersicht über SQL Server

Sonstige Aktivitäten In diesem Abschnitt werden Verfahren bereitgestellt, mit denen interaktive Aktivitäten zum Anzeigen und Überprüfen von Informationen implementiert werden, wie Spiele oder Übungen mit Rollenspielen.

Anzeigen der PowerPoint-Animationen Alle Animationen sind durch ein Hyperlinksymbol in der unteren linken Ecke der Folie gekennzeichnet.

� So zeigen Sie die Folie „Client/Server-Kommunikationsprozess“ an Auf dieser Folie wird gezeigt, wie SQL Server eine Abfrage verarbeitet. 1. Zeigen Sie die Folie mit dem Thema an, auf der die Clientanwendung eine

Abfrage sendet. Der Client ruft die Datenbank-API (Application Programming Interface, Schnittstelle für Anwendungsprogrammierung) auf und übergibt die Abfrage. Die Datenbank-API verwendet einen Provider, Treiber oder eine DLL (Dynamic Link Library), um die Abfrage in ein oder mehrere TDS-Pakete (Tabular Data Stream) einzuschließen und an die Client-Netzwerkbibliothek zu übergeben.

2. Fahren Sie mit der ersten Animation fort, bei der die Client-Netzwerk-bibliothek die TDS-Pakete in Netzwerkprotokoll-Pakete verpackt. Die Client-Netzwerkbibliothek ruft eine prozessübergreifende Kommunikations-API (Interprocess Communication, IPC) von Windows auf, um die Netz-werkprotokoll-Pakete mit Hilfe des Netzwerkprotokoll-Stacks des Betriebs-systems an eine Server-Netzwerkbibliothek zu senden. Die entsprechende Server-Netzwerkbibliothek extrahiert die TDS-Pakete aus den Netzwerk-protokoll-Paketen und übergibt die TDS-Pakete an Open Data Services.

3. Fahren Sie mit der nächsten Animation fort, bei der Open Data Services die Abfrage aus den TDS-Paketen extrahiert und die Abfragen an das relationa-le Modul übergibt. Das relationale Modul kompiliert dann die Abfrage in einen optimierten Ausführungsplan. Der Ausführungsplan wird ausgeführt. Das relationale Modul kommuniziert mit dem Speichermodul mit Hilfe der OLE DB-Schnittstelle.

4. Fahren Sie mit der nächsten Animation fort, bei der das Speichermodul Daten aus einer Datenbank an Datenpuffer überträgt und dann Rowsets mit Daten an das relationale Modul übergibt. Das relationale Modul kombiniert die Rowsets zum endgültigen Resultset und übergibt das Resultset an Open Data Services.

5. Fahren Sie mit der letzten Animation fort, bei der Open Data Services die Resultsets verpackt und sie mit Hilfe einer Server-Netzwerkbibliothek, des Netzwerkprotokoll-Stacks, der Client-Netzwerkbibliothek und der Daten-bank-API an die Clientanwendung zurückgibt.

Page 39: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 1: Übersicht über SQL Server v

� So zeigen Sie die Folie „Datenbankobjekte“ an Diese Folie veranschaulicht die SQL Server-Datenbankobjekte und stellt detaillierte Definitionen zu allen Objekten bereit. Beachten Sie, dass diese Informationen auf einer fiktiven Datenbank basieren. 1. Zeigen Sie die Folie an, zuerst wird eine Abbildung der Employee-Tabelle

angezeigt.2. Zeigen Sie das nächste Bild an, in dem die vom System angegebenen und

benutzerdefinierten Datentypen angezeigt werden, die den Spalten zuge-wiesen sind.

3. Zeigen Sie das nächste Bild mit den drei Einschränkungstypen an. Definieren Sie kurz PRIMARY KEY-, FOREIGN KEY- und CHECK-Einschränkungen. Stellen Sie außerdem die DEFAULT-Einschränkung vor (obwohl sie nicht angezeigt wird), und nennen Sie Regeln und Standard-werte.

4. Zeigen Sie das nächste Bild an, auf dem der gruppierte Index für die LastName-Spalte angezeigt wird. Definieren Sie kurz den Unterschied zwischen gruppierten und nicht gruppierten Indizes. Andere Indizes, die Sie wahrscheinlich für diese Tabelle erstellen werden, schließen einen nicht gruppierten Index für die CtryCode-Spalte mit der FOREIGN KEY-Einschränkung und einen eindeutigen, nicht gruppierten Index für die EmpNum-Spalte ein (als PRIMARY KEY definiert wurde).

5. Zeigen Sie das nächste Bild an, auf dem die Definition der EmployeePhoneView-Sicht angezeigt wird.

6. Zeigen Sie das nächste Bild an, auf dem ein Quadrat über der Extension-Spalte angezeigt wird. Dieses Quadrat zeigt an, dass eine gespeicherte Prozedur zum Aktualisieren der Durchwahl eines Angestellten geschrieben werden kann.

7. Zeigen Sie das letzte Bild an. Auf diesem Bild zeigt ein Quadrat über der LastMod-Spalte an, dass ein Überwachungstrigger definiert wurde. Der Trigger aktualisiert den Wert automatisch mit dem Namen des Benutzers, der die Tabellenzeile zuletzt geändert hat.

Page 40: Programmieren Einer Microsoft SQL Server 2000-Datenbank

vi Unterrichtseinheit 1: Übersicht über SQL Server

Strategie für die Unterrichtseinheit Diese Unterrichtseinheit ist in zwei Kursen enthalten: Kurs 2322A, Verwalten einer Microsoft SQL Server 2000-Datenbank, und Kurs 2328A, Programmieren einer Microsoft SQL Server 2000-Datenbank. Bestimmen Sie den Kenntnis-stand der Kursteilnehmer, und verwenden Sie dann diese Informationen, um die Präsentation dieser Unterrichtseinheit entsprechend anzupassen.

Verwenden Sie die folgende Strategie, um diese Unterrichtseinheit zu präsentieren:

� Informationen zu SQL Server Stellen Sie SQL Server vor. Erläutern Sie die Skalierbarkeit von SQL Server und die Funktion eines relationalen Datenbank-Management-systems (RDBMS). Weisen Sie darauf hin, dass Benutzer zwei Datenbanktypen verwalten: OLTP-Datenbanken (Online Transaction Processing, Onlinetransaktions-verarbeitung) und OLAP-Datenbanken (Online Analytical Processing, Analytische Onlineverarbeitung). Betonen Sie, dass der Schwerpunkt dieses Kurses auf Aktivitäten mit OLTP-Datenbanken und Transact-SQL liegt. Weisen Sie darauf hin, dass Benutzer auf SQL Server und SQL Server 2000 Analysis Services nicht direkt zugreifen, sondern gesonderte Clientanwen-dungen verwenden, die für das Zugreifen auf Daten geschrieben wurden. Beschreiben Sie kurz die Clientanwendungen, die auf SQL Server zu-greifen. Beschreiben Sie die Komponenten des Client/Server-Kommunikations-prozesses und die Funktion der Komponenten. Weisen Sie darauf hin, dass die Client-Netzwerkbibliothek mit einer der Server-Netzwerkbibliotheken übereinstimmen muss. Zeigen Sie die Folie „Client/Server-Kommunikationsprozess“ an. Beschreiben Sie die SQL Server-Dienste.

� SQL Server-Integration Beschreiben Sie SQL Server und die unterstützten Betriebssysteme. Weisen Sie darauf hin, dass Internetbrowser und Anwendungen von Drittanbietern, die unter verschiedenen Betriebssystemen ausgeführt werden, auch auf SQL Server zugreifen können. Beschreiben Sie die SQL Server-Integration in Windows 2000 und in andere Serveranwendungen von Microsoft. Erläutern Sie die Integration von SQL Server in bestimmte Features von Windows 2000.

Page 41: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 1: Übersicht über SQL Server vii

� SQL Server-Datenbanken Weisen Sie darauf hin, dass Kenntnisse in Bezug auf die SQL Server-Daten-bankstruktur dem Benutzer beim effizienten Entwickeln und Implemen-tieren einer Datenbank helfen. Stellen Sie die beiden SQL Server-Datenbanktypen vor. Erläutern Sie, dass in Systemtabellen Informationen zum System oder zu Objekten in einer Datenbank gespeichert sind. Beschreiben Sie kurz die Funktion der einzelnen Datenbanken, und stellen Sie dann mehrere typische Entwürfe für Benutzerdatenbanken dar. Weisen Sie darauf hin, dass SQL Server mehrere Instanzen unterstützt. Betonen Sie, dass das Löschen der msdb-Datenbank die meisten Funk-tionen des SQL Server-Agents entfernt. Erläutern und kommentieren Sie die Animation, die eine detaillierte Defini-tion der SQL Server-Datenbankobjekte bereitstellt. Beachten Sie, dass die Informationen der Abbildung fiktiv sind und nur als Unterrichtsbeispiel dienen. Fassen Sie die einzelnen Datenbankobjekte zusammen und beschreiben Sie sie. Unterscheiden Sie dabei zwischen vom System angegebenen und benutzerdefinierten Datentypen und zwischen gruppierten und nicht gruppierten Indizes. Eine ausführliche Erläuterung der Metadaten finden die Kursteilnehmer in der SQL Server-Onlinedokumentation. Weisen Sie darauf hin, dass das Schreiben von Skripts, die Systemtabellen direkt abfragen, nicht empfehlenswert ist. Die Kursteilnehmer sollten Informationsschemasichten anstelle von Systemtabellen verwenden. Weisen Sie darauf hin, dass Systemfunktionen bestimmte Einzelwerte zurückgeben. Erklären Sie außerdem, dass Informationsschemasichten in SQL Server dem ANSI SQL-Standard (American National Standards Institute) entsprechen und mehrere Werte erzeugen.

� SQL Server-Sicherheit Weisen Sie darauf hin, dass Benutzer in SQL Server auf zwei Sicherheits-stufen überprüft werden: Anmeldeauthentifizierung und Berechtigungs-überprüfung für Datenbank-Benutzerkonten und Datenbankrollen. Beschreiben Sie, wie SQL Server Anmeldekonten authentifiziert. Weisen Sie darauf hin, dass ein Benutzer für die Verbindung mit SQL Server ein Anmeldekonto benötigt. Erläutern Sie den Unterschied zwischen Windows 2000-Authentifizierung und SQL Server-Authentifizierung sowie zwischen Windows-Authentifizierungsmodus und gemischtem Modus. Möglicherweise finden die Kursteilnehmer die Authentifizierungsmodi und -mechanismen verwirrend. Erläutern Sie deshalb, dass der Server in einem bestimmten Authentifizierungsmodus ausgeführt wird und dass ein Client, der eine Verbindung mit einem im gemischten Modus ausgeführten Server herstellt, einen Authentifizierungsmechanismus auswählen muss. Beschreiben Sie, wie SQL Server Anmeldeauthentifizierung zu Benutzer-konten und Rollen zuordnet. Weisen Sie auf den Unterschied zwischen Rollen auf Serverebene und Datenbankebene und auf die entsprechenden Berechtigungen hin. Besprechen Sie, wie SQL Server Berechtigungen überprüft.

Page 42: Programmieren Einer Microsoft SQL Server 2000-Datenbank

viii Unterrichtseinheit 1: Übersicht über SQL Server

� Arbeiten mit SQL Server Erläutern Sie, wann Skripts oder grafische Tools zum Arbeiten mit SQL Server verwendet werden. Nennen Sie Beispiele. Identifizieren Sie kurz allgemeine Verwaltungsaufgaben beim Verwalten von SQL Server. Führen Sie kurz SQL Server Enterprise Manager, SQL Query Analyzer und osql vor. Beschreiben Sie die verschiedenen Möglichkeiten der Hilfe von SQL Server. Identifizieren Sie kurz typische Aktivitäten beim Implementieren einer Datenbank. Vergleichen Sie mehrere physische Architekturen und logische Software-anwendungsentwürfe, die beim Planen einer Datenbank verfügbar sind. Weisen Sie darauf hin, dass auf der Folie nur die häufigsten Architektur-entwürfe und Bereitstellungsoptionen dargestellt werden. Weisen Sie darauf hin, dass sich die Softwareanwendung bei jedem Entwurf physisch auf einem oder auf mehreren Servern befinden kann. Beschreiben Sie kurz die einzelnen Optionen zur Anwendungsbereitstellung, und er-läutern Sie die Beispiele. Beschreiben Sie die APIs, die beim Entwickeln einer relationalen Daten-bankanwendung zur Verwendung mit SQL Server verwendet werden. Eine ausführliche Erläuterung der Programmierschnittstellen finden die Kurs-teilnehmer in der SQL Server-Onlinedokumentation.

AnpassungsinformationenDieser Abschnitt beschreibt die Anforderungen zum Einrichten der Übungs-einheiten für eine Unterrichtseinheit sowie die Konfigurationsänderungen, die während der Übungseinheiten an den Kursteilnehmercomputern vorgenommen werden. Diese Informationen sollen Ihnen beim Replizieren oder Anpassen der Microsoft Official Curriculum-Courseware (MOC) helfen.

Die Übungseinheit in dieser Unterrichtseinheit hängt auch von der Schulungsraumkonfiguration ab, die im Abschnitt „Anpassungsinformationen“ am Ende des Dokuments Handbuch für das Einrichten von Schulungs-computern für Kurs 2328A, Programmieren einer Microsoft SQL Server 2000-Datenbank, angegeben ist.

Einrichten der Übungseinheit Es gibt keine Anforderungen zum Einrichten der Übungseinheit, die die Replikation oder die Anpassung betreffen.

Ergebnisse der Übungseinheit Auf den Kursteilnehmercomputern gibt es keine Konfigurationsänderungen, die die Replikation oder die Anpassung betreffen.

Wichtig

Page 43: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 1: Übersicht über SQL Server 1

Übersicht

� Informationen zu SQL Server

� SQL Server-Integration

� SQL Server-Datenbanken

� SQL Server-Sicherheit

� Arbeiten mit SQL Server

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Diese Unterrichtseinheit gibt eine allgemeine Übersicht über die Plattformen, die Architektur, die Komponenten und die Sicherheit von Microsoft® SQL Server™ 2000. Außerdem werden wichtige Begriffe und Konzepte zu SQL Server behandelt und definiert. In dieser Unterrichtseinheit wird erläutert, wie SQL Server in Microsoft Windows® 2000 und in andere Serveranwendun-gen von Microsoft integriert werden kann. Die Unterrichtseinheit endet mit einer Übersicht über Verwaltungs- und Implementierungsaktivitäten für die SQL Server-Datenbank sowie mit Entwurfsoptionen für SQL Server-Anwen-dungen.

Am Ende dieser Unterrichtseinheit werden Sie in der Lage sein, die folgenden Aufgaben auszuführen:

� Beschreiben von SQL Server 2000 und den unterstützten Betriebssystem-plattformen.

� Beschreiben der SQL Server-Integration in Windows 2000 und in andere Serveranwendungen.

� Beschreiben von SQL Server-Datenbanken. � Beschreiben der SQL Server-Sicherheit. � Beschreiben der Verwaltungs- und Implementierungsaktivitäten für die

SQL Server-Datenbank sowie der Entwurfsoptionen für SQL Server-Anwendungen.

ThemaGeben Sie eine Übersicht über die Themen und Lern-ziele dieser Unterrichts-einheit.

EinstiegIn dieser Unterrichtseinheit werden die Architektur, die Komponenten, die Begriffe und die Konzepte von SQL Server besprochen.

Page 44: Programmieren Einer Microsoft SQL Server 2000-Datenbank

2 Unterrichtseinheit 1: Übersicht über SQL Server

���� Informationen zu SQL Server

� Einführung in SQL Server

� Client/Server-Komponenten

� Client/Server-Kommunikationsprozess

� SQL Server-Dienste

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Sie verwenden SQL Server zum Verwalten von zwei Datenbanktypen: OLTP-Datenbanken (Online Transaction Processing, Onlinetransaktionsverarbeitung) und OLAP-Datenbanken (Online Analytical Processing, Analytische Online-verarbeitung). Normalerweise greifen voneinander getrennte Clients auf die Datenbanken zu, indem sie über ein Netzwerk kommunizieren.

Durch die Skalierbarkeit kann SQL Server für Datenbanken mit bis zu mehre-ren Terabyte und auch für kleine Unternehmensserver und tragbare Computer verwendet werden. Mit Hilfe von Windows Clustering in Windows 2000 kön-nen Sie SQL Server auf mehreren Servern dezentral skalieren.

ThemaStellen Sie das Thema dar.

EinstiegSie verwenden SQL Server zum Verwalten von zwei Datenbanktypen.

Page 45: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 1: Übersicht über SQL Server 3

Einführung in SQL Server

Relationales Datenbank-Managementsystem

SQL ServerClient

ErgebnisseErgebnisseErgebnisse

Clientanwendungen

OLAPOLAP

OLTPOLTPAnfrageAnfrageAnfrage

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Sie können SQL Server verwenden, um Transaktionsverarbeitung durchzu-führen, um Daten zu speichern und zu analysieren und um neue Anwendungen zu erstellen.

SQL Server ist eine Familie von Produkten und Technologien, mit denen die Anforderungen an die Datenspeicherung von OLTP- und OLAP-Umgebungen erfüllt werden. SQL Server ist ein relationales Datenbank-Managementsystem (RDBMS), das Folgendes durchführt:

� Verwalten der Datenspeicherung für Transaktionen und Analysen. � Antworten auf Anforderungen von Clientanwendungen. � Verwenden von Transact-SQL, XML (Extensible Markup Language),

multidimensionalen Ausdrücken (Multidimensional Expressions, MDX) oder SQL Distributed Management Objects (SQL-DMO), um Anforderungen zwischen einem Client und SQL Server zu senden.

Der Schwerpunkt dieses Kurses liegt auf Aktivitäten mit OLTP-Datenbanken und Transact-SQL.

Relationales Datenbank-Managementsystem Das RDBMS von SQL Server ist für Folgendes verantwortlich:

� Verwalten der Beziehungen zwischen Daten in einer Datenbank. � Sicherstellen, dass die Daten ordnungsgemäß gespeichert und dass die

Regeln nicht verletzt werden, die die Beziehungen zwischen den Daten definieren.

� Wiederherstellen aller Daten in einem konsistenten Zustand im Fall von Systemfehlern.

ThemaGeben Sie eine Einführung in SQL Server.

EinstiegSie können SQL Server ver-wenden, um Transaktions-verarbeitung durchzuführen, um Daten zu speichern und zu analysieren und um neue Anwendungen zu erstellen.

Anmerkung

Methodischer Hinweis Betonen Sie, dass der Schwerpunkt dieses Kurses auf Aktivitäten mit OLTP-Datenbanken und Transact-SQL liegt.

Page 46: Programmieren Einer Microsoft SQL Server 2000-Datenbank

4 Unterrichtseinheit 1: Übersicht über SQL Server

DatenspeicherungsmodelleSQL Server verwaltet OLTP- und OLAP-Datenbanken.

In einer OLTP-Datenbank werden Daten im Allgemeinen in relationalen Tabellen organisiert, um redundante Informationen zu reduzieren und die Geschwindigkeit von Aktualisierungen zu erhöhen. Mit Hilfe von SQL Server können viele Benutzer Transaktionen durchführen und gleichzeitig Echtzeitdaten in OLTP-Datenbanken ändern. Beispiele für OLTP-Datenbank-typen sind Buchungssysteme von Fluggesellschaften und Banktransaktions-systeme.

Mit der OLAP-Technologie werden große Datenmengen so organisiert und zusammengefasst, dass ein Analytiker Daten schnell und in Echtzeit auswerten kann. Mit Hilfe von SQL Server 2000 Analysis Services werden diese Daten so organisiert, dass eine Vielzahl von Unternehmens-lösungen unterstützt wird, angefangen bei der Berichterstellung und Analyse bis hin zu Datenmodellierung und Entscheidungsfindung in Unternehmen.

ClientanwendungenBenutzer greifen auf SQL Server und Analysis Services nicht direkt zu. Statt-dessen verwenden Sie gesonderte Clientanwendungen, die für das Zugreifen auf Daten geschrieben wurden. Diese Anwendungen verwenden für das Zugreifen auf SQL Server Folgendes:

Diese Abfragesprache, eine Version von SQL (Structured Query Language), ist die wichtigste Abfrage- und Programmiersprache für Daten-banken, die von SQL Server verwendet wird.

Dieses Format gibt Daten von Abfragen und gespeicherten Prozeduren zurück, indem URLs (Uniform Resource Locators) oder Vorlagen über HTTP (Hypertext Transfer Protocol) verwendet werden. Sie können XML auch zum Einfügen, Löschen und Aktualisieren von Werten in einer Datenbank ver-wenden.

Die MDX-Syntax definiert multidimensionale Objekte und Abfragen und ändert multidimensionale Daten in OLAP-Datenbanken.

Clientanwendungen verwenden OLE DB-APIs (Application Programming Interfaces, Schnittstellen für Anwendungsprogram-mierung) und ODBC-APIs (Open Database Connectivity), um Befehle an eine Datenbank zu senden. Befehle, die Sie über diese APIs senden, verwenden die Sprache Transact-SQL.

OLTP-Datenbanken

OLAP-Datenbanken

Transact-SQL

XML

MDX

OLE DB- und ODBC-APIs

Page 47: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 1: Übersicht über SQL Server 5

Microsoft ActiveX® Data Objects (ADO) und ActiveX Data Objects (Multi-dimensional) (ADO MD) umschließen OLE DB für die Verwendung in Sprachen wie z. B. Microsoft Visual Basic®, Visual Basic für Applikationen, Active Server Pages und Visual Basic Scripting für Microsoft Internet Explorer. Sie verwenden ADO, um auf Daten in OLTP-Datenbanken zuzugreifen. Sie verwenden ADO MD, um auf Daten in Analysis Services-Datencubes zuzu-greifen.

Diese Anwendung stellt eine Automatisierungs-API bereit, die es Benutzern ermöglicht, Fragen zu Informationen in einer Datenbank in natür-licher Sprache (Englisch) zu formulieren, statt komplexe Transact-SQL- oder MDX-Anweisungen zu schreiben. Beispielsweise können Benutzer die Frage stellen: „What are the total sales for Region 5?“ (Wie hoch ist der Gesamt-umsatz in Region 5?)

ActiveX Data Objects und ActiveX Data Objects (Multidimensional)

English Query

Page 48: Programmieren Einer Microsoft SQL Server 2000-Datenbank

6 Unterrichtseinheit 1: Übersicht über SQL Server

Client/Server-Komponenten

ClientanwendungClientanwendung

Client-NetzwerkbibliothekClient-NetzwerkbibliothekClient

SQL ServerSQL Server

RelationalesModul

RelationalesModul Server

SpeichermodulSpeichermodul

LokaleDatenbank

Datenbank-API(OLE DB, ODBC,

DB-Library)

Datenbank-API(OLE DB, ODBC,

DB-Library)

ProzessorProzessor

Arbeits-speicherArbeits-speicher

Server-Netzwerkbibliotheken

Server-Netzwerkbibliotheken

Open Data ServicesOpen Data Services

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

SQL Server besteht aus Client- und Serverkomponenten, die Daten speichern und abrufen. In SQL Server wird eine Kommunikationsarchitektur mit mehre-ren Schichten verwendet, um Anwendungen vom zugrunde liegenden Netzwerk und den Protokollen zu isolieren. Dank dieser Architektur kann eine Anwen-dung in verschiedenen Netzwerkumgebungen bereitgestellt werden.

Client/Server-ArchitekturSQL Server verwendet die Client/Server-Architektur, um die Arbeitslast in Tasks aufzuteilen, die auf Servercomputern bzw. auf Clientcomputern aus-geführt werden.

� Der Client ist verantwortlich für die Geschäftslogik und das Präsentieren der Daten für den Benutzer. Der Client wird normalerweise auf einem oder mehreren Computern ausgeführt. Er kann aber auch zusammen mit SQL Server auf dem Servercomputer ausgeführt werden.

� SQL Server verwaltet Datenbanken und ordnet die verfügbaren Server-ressourcen, wie beispielsweise Arbeitsspeicher, Netzwerk-Bandbreite und Datenträgeroperationen, mehreren Anforderungen zu.

Mit der Client/Server-Architektur können Sie Anwendungen entwerfen und bereitstellen, um eine Vielzahl von Umgebungen zu erweitern. Über Schnitt-stellen für Clientprogrammierung können Anwendungen auf getrennten Client-computern ausgeführt werden und über ein Netzwerk mit dem Server kommu-nizieren.

In diesem Kurs bezeichnet der Begriff „Client“ eine Client-anwendung.

ThemaBeschreiben Sie die Kompo-nenten des Client/Server-Kommunikationsprozesses.

EinstiegDiese Komponenten ver-walten die Kommunikation zwischen Clients und SQL Server.

Anmerkung

Page 49: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 1: Übersicht über SQL Server 7

ClientkomponentenZu den Clientkomponenten in der Kommunikationsarchitektur gehören die folgenden:

Eine Clientanwendung beendet Transact-SQL-Anweisungen und empfängt Resultsets. Sie entwickeln eine Anwendung mit Hilfe einer Datenbank-API. Die Anwendung hat keine Kenntnis von den zugrunde liegen-den Netzwerkprotokollen für die Kommunikation mit SQL Server.

Die Datenbank-API (OLE DB, ODBC) verwendet einen Provider, Treiber oder eine DLL (Dynamic Link Library), um Transact-SQL-Anweisungen zu übergeben und Resultsets zu empfangen. Dies ist eine Schnitt-stelle, über die eine Anwendung Anforderungen an SQL Server sendet und die Ergebnisse verarbeitet, die SQL Server zurückgibt.

Einige Internetanwendungen werden in HTTP statt in eine Daten-bank-API geschrieben.

Eine Client-Netzwerkbibliothek verwaltet Netzwerk-verbindungen und Routing auf einem Client. Dies ist eine Kommunikations-softwarekomponente, die die Datenbankanforderungen und -ergebnisse für die Übertragung durch das entsprechende Netzwerkprotokoll zusammenstellt.

Serverkomponenten Zu den Serverkomponenten in der Kommunikationsarchitektur gehören die folgenden:

SQL Server kann gleichzeitig mehrere Netzwerk-bibliotheken überwachen. Die Client-Netzwerkbibliothek muss mit einer der Server-Netzwerkbibliotheken übereinstimmen, um erfolgreich zu kommuni-zieren. SQL Server unterstützt u. a. die folgenden Netzwerkprotokolle: TCP/IP (Transmission Control Protocol/Internet Protocol), Named Pipes, NWLink, IPX/SPX (Internetwork Packet Exchange/Sequenced Packet Exchange), VIA ServerNet II SAN, VIA GigaNet SAN, Banyan VINES und AppleTalk.

Durch Open Data Services sehen Datendienste für einen Client wie SQL Server aus, indem eine Netzwerk-Schnittstelle für das Ver-walten von Netzwerkprotokoll-Prozessen und Serverroutinen bereitgestellt wird. Diese SQL Server-Komponente verwaltet Netzwerkverbindungen, über-gibt Clientanforderungen an SQL Server zum Verarbeiten und gibt die Ergeb-nisse und Antworten an SQL Server-Clients zurück. Open Data Services fragt automatisch alle auf dem Server installierten Server-Netzwerkbibliotheken ab.

Clientanwendung

Methodischer Hinweis Weisen Sie darauf hin, dass die Client-Netzwerkbiblio-thek mit einer der Server-Netzwerkbibliotheken übereinstimmen muss.

Datenbank-API

Anmerkung

Client-Netzwerkbibliothek

Server-Netzwerkbibliotheken

Open Data Services

Page 50: Programmieren Einer Microsoft SQL Server 2000-Datenbank

8 Unterrichtseinheit 1: Übersicht über SQL Server

Das relationale Modul analysiert Transact-SQL-Anweisun-gen, optimiert Ausführungspläne und führt sie aus, verarbeitet DDL-Anweisun-gen (Data Definition Language, Datendefinitionssprache) und andere Anweisungen und erzwingt Sicherheit.

Das Speichermodul verwaltet Datenbankdateien und die Ver-wendung des Speicherplatzes in den Dateien, erstellt und liest Daten von physischen Seiten, verwaltet Datenpuffer und physische Eingaben und Aus-gaben, steuert Parallelität, führt Protokollier- und Wiederherstellungsvorgänge aus und implementiert Dienstprogrammfunktionen wie das Datenbankprüf-programm (Database Consistency Checker, DBCC) sowie Sicherung und Wiederherstellung.

Relationales Modul

Speichermodul

Page 51: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 1: Übersicht über SQL Server 9

Client/Server-Kommunikationsprozess

ClientanwendungClientanwendung

Client-NetzwerkbibliothekClient-NetzwerkbibliothekClient

SQL ServerSQL Server

RelationalesModul

RelationalesModul

SpeichermodulSpeichermodul

Server

LokaleDatenbank

Datenbank-API(OLE DB, ODBC,

DB-Library)

Datenbank-API(OLE DB, ODBC,

DB-Library)

ProzessorProzessor

Arbeits-speicherArbeits-speicher

Open Data ServicesOpen Data Services

Server-Netzwerkbibliotheken

Server-Netzwerkbibliotheken

AbfrageAbfrage

ResultsetResultset

ResultsetResultset

AbfrageAbfrage11

22

33

44

55

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Clients und Server kommunizieren normalerweise über ein Netzwerk. In der folgenden Sequenz wird eine Abfrage verwendet, um einen typischen Client/Server-Kommunikationsprozess mit Hilfe einer Datenbank-API darzustellen.

1. Eine Clientanwendung sendet eine Abfrage ab. Der Client ruft die Daten-bank-API auf und übergibt die Abfrage. Die Datenbank-API verwendet einen Provider, Treiber oder eine DLL, um die Abfrage in ein oder mehrere TDS-Pakete (Tabular Data Stream) einzuschließen und an die Client-Netz-werkbibliothek zu übergeben.

2. Die Client-Netzwerkbibliothek verpackt die TDS-Pakete in Netzwerk-protokoll-Pakete. Die Client-Netzwerkbibliothek ruft eine prozessüber-greifende Kommunikations-API (Interprocess Communication, IPC) von Windows auf, um die Netzwerkprotokoll-Pakete mit Hilfe des Netzwerk-protokoll-Stacks des Betriebssystems an eine Server-Netzwerkbibliothek zu senden. Die entsprechende Server-Netzwerkbibliothek extrahiert die TDS-Pakete aus den Netzwerkprotokoll-Paketen und übergibt die TDS-Pakete an Open Data Services.

3. Open Data Services extrahiert die Abfrage aus den TDS-Paketen und über-gibt die Abfrage an das relationale Modul. Das relationale Modul kompiliert dann die Abfrage in einen optimierten Ausführungsplan. Der Ausführungs-plan wird ausgeführt. Das relationale Modul kommuniziert mit dem Speichermodul mit Hilfe der OLE DB-Schnittstelle.

4. Das Speichermodul überträgt Daten aus einer Datenbank an Datenpuffer und übergibt dann Rowsets mit Daten an das relationale Modul. Das rela-tionale Modul kombiniert die Rowsets zum endgültigen Resultset und über-gibt das Resultset an Open Data Services.

5. Open Data Services packt die Resultsets und gibt sie mit Hilfe einer Server-Netzwerkbibliothek, des Netzwerkprotokoll-Stacks, der Client-Netzwerk-bibliothek und der Datenbank-API an die Clientanwendung zurück. Das Resultset kann auch im XML-Format zurückgegeben werden.

ThemaBeschreiben Sie den Client/Server-Kommuni-kationsprozess.

EinstiegClients und Server kommu-nizieren normalerweise über ein Netzwerk.

Methodischer Hinweis Diese Folie enthält Anima-tionen. Im Abschnitt „Hin-weise für den Kursleiter“ finden Sie Informationen zum Navigieren durch diese Folie.

Weisen Sie darauf hin, dass für die gesamte Kommuni-kation zwischen der Client-Netzwerkbibliothek und einer SQL Server-Netzwerk-bibliothek der Netzwerk-protokoll-Stack des Be-triebssystems verwendet wird.

Page 52: Programmieren Einer Microsoft SQL Server 2000-Datenbank

10 Unterrichtseinheit 1: Übersicht über SQL Server

SQL Server-Dienste

Microsoft DistributedTransaction Coordinator

MSSQLServer-Dienst

SQLServerAgent-Dienst

Microsoft Search

Server

� Daten verwalten� Transaktionen und

Abfragen verarbeiten� Datenintegrität

� Aufträge� Warnungen� Operatoren

� Volltextkataloge� Volltextindizes

� Verteilte Transaktionenverwalten

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Die SQL Server-Dienste schließen MSSQLServer-Dienst, SQLServerAgent-Dienst, Microsoft Distributed Transaction Coordinator (MS DTC) und Microsoft Search ein. Obwohl diese SQL Server-Dienste unter Windows 2000 normalerweise als Dienste ausgeführt werden, können sie auch als Anwendun-gen ausgeführt werden.

Vier SQL Server-Dienste SQL Server schließt vier Dienste ein, die standardmäßig bei einer neuen Instal-lation installiert werden. MSSQLServer-Dienst, SQLServerAgent-Dienst, Microsoft Distributed Transaction Coordinator und Microsoft Search.

MSSQLServer-Dienst MSSQLServer-Dienst ist das Datenbankmodul. Diese Komponente verarbeitet alle Transact-SQL-Anweisungen und verwaltet alle Dateien, aus denen sich die Datenbanken auf dem Server zusammensetzen. Der MSSQLServer-Dienst führt Folgendes aus:

� Zuordnen von Computerressourcen zu mehreren gleichzeitigen Benutzern. � Verhindern von Problemen mit der Logik, wie z. B. das Planen der Anfor-

derungen von Benutzern, die die gleichen Daten zur gleichen Zeit aktuali-sieren möchten.

� Sicherstellen der Datenkonsistenz und Datenintegrität.

ThemaStellen Sie die Server-software für SQL Server vor.

EinstiegDie SQL Server-Dienste schließen MSSQLServer-Dienst, SQLServerAgent-Dienst, Microsoft Distributed Transaction Coordinator und Microsoft Search ein.

Page 53: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 1: Übersicht über SQL Server 11

SQLServerAgent-Dienst Der SQLServerAgent-Dienst arbeitet in Verbindung mit SQL Server, um War-nungen, lokale oder Multiserveraufträge und Operatoren zu erstellen und zu verwalten. Beachten Sie die folgenden Informationen zum SQLServerAgent-Dienst:

� Warnungen stellen Informationen zum Status eines Vorgangs bereit, z. B. wenn ein Auftrag abgeschlossen ist oder wenn ein Fehler auftritt.

� Der SQLServerAgent-Dienst schließt ein Auftragserstellungs- und Zeit-planungsmodul ein, mit dem Aufgaben automatisiert werden.

� Mit dem SQLServerAgent-Dienst können E-Mail-Nachrichten gesendet werden, ein Operator kann per Pager benachrichtigt werden oder eine an-dere Anwendung kann gestartet werden, wenn eine Warnung auftritt. Sie können beispielsweise festlegen, dass eine Warnung auftritt, wenn eine Datenbank oder ein Transaktionsprotokoll beinahe voll ist oder wenn eine Datenbanksicherung erfolgreich ist.

Microsoft Distributed Transaction Coordinator Mit MS DTC können Clients mehrere verschiedene Datenquellen in eine Trans-aktion einschließen. MS DTC koordiniert die ordnungsgemäße Ausführung ver-teilter Transaktionen, um sicherzustellen, dass alle Aktualisierungen auf allen Servern dauerhaft sind bzw. dass bei Fehlern alle Änderungen rückgängig ge-macht werden.

Microsoft Search Microsoft Search ist ein Volltextmodul, das als Dienst unter Windows 2000 ausgeführt wird. Die Volltextunterstützung umfasst die Funktion, Abfragen auf Zeichendaten auszuführen, und die Erstellung und Verwaltung von Indizes, die diese Abfragen ermöglichen.

Mehrere Instanzen von SQL Server Mehrere Instanzen von SQL Server können gleichzeitig auf demselben Computer ausgeführt werden.

Jede Instanz von SQL Server verfügt über eigene System- und Benutzer-datenbanken, die nicht von den Instanzen gemeinsam genutzt werden. Jede Instanz arbeitet so, als wenn sie sich auf einem gesonderten Server befinden würde. Anwendungen können mit jeder Instanz des SQL Server-Datenbank-moduls auf einem Computer eine Verbindung herstellen, ähnlich wie sie mit SQL Server-Datenbankmodulen eine Verbindung herstellen, die auf verschie-denen Computern ausgeführt werden.

Wenn Sie nur den Computernamen angeben, arbeiten Sie mit der Standard-instanz. Sie müssen Computername\Instanzname angeben, um eine Verbindung mit einer benannten Instanz herzustellen.

Page 54: Programmieren Einer Microsoft SQL Server 2000-Datenbank

12 Unterrichtseinheit 1: Übersicht über SQL Server

���� SQL Server-Integration

� Integrieren von SQL Server in Betriebssysteme

� Integrieren von SQL Server in Windows 2000

� Integrieren von SQL Server in andere Serveranwendungen von Microsoft

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

SQL Server schließt Client- und Serverkomponenten ein, die in viele Betriebs-systeme von Microsoft, einschließlich Windows 2000, und in andere Server-anwendungen von Microsoft integriert werden können. Internetbrowser und Anwendungen von Drittanbietern, die unter verschiedenen Betriebssystemen ausgeführt werden, können auch auf SQL Server zugreifen.

ThemaStellen Sie das Thema dar.

EinstiegSQL Server schließt Client- und Serverkomponenten ein.

Page 55: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 1: Übersicht über SQL Server 13

Integrieren von SQL Server in Betriebssysteme

Browsers

Windows 2000 Windows 98

ClientServer

Windows 2000 Windows NTWindows Me, 98 und 95 Drittanbieter

Windows NT

InternetInternet

Windows Me Windows CE

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

SQL Server schließt Client- und Serverkomponenten ein, die unter verschie-denen Betriebssystemen ausgeführt werden.

ClientkomponentenDie Clientkomponenten aller Editionen von SQL Server 2000, mit Ausnahme von SQL Server Windows CE Edition, können unter allen Editionen von Windows 2000, Versionen von Microsoft Windows NT®, Microsoft Windows Millennium Edition (Me), Microsoft Windows 98 und Microsoft Windows 95 ausgeführt werden.

Alle Clientkomponenten von SQL Server 2000 CE Edition können ausschließ-lich unter dem Betriebssystem Microsoft Windows CE ausgeführt werden.

Serverkomponenten Die verschiedenen Editionen von SQL Server können unter allen Editionen von Windows 2000, Versionen von Windows NT, Windows Me, Windows 98 und Windows CE ausgeführt werden. Bestimmte Versionen der Betriebssysteme und Editionen von SQL Server beschränken Serverkomponenten. Microsoft Windows NT Server 4.0 Service Pack 5 (SP5) oder höher, muss als Mindest-anforderung für alle Editionen von SQL Server 2000 installiert werden. Nur die Serverkomponenten, wie z. B. das Datenbankmodul und Analysis-Server, sind auf bestimmte Versionen der Betriebssysteme beschränkt. Obwohl z. B. das Datenbankmodul für Microsoft SQL Server 2000 Enterprise Edition nicht unter Microsoft Windows 2000 Professional, Microsoft Windows NT Workstation, Windows Me oder Windows 98 ausgeführt werden kann, können Sie die SQL Server 2000 Enterprise Edition-CD verwenden, um die Clientsoftware unter diesen Betriebssystemen zu installieren.

Windows NT 4.0 Terminal Server unterstützt SQL Server 2000 nicht.

ThemaBeschreiben Sie SQL Server-Plattformen für Client- und Serverkom-ponenten.

EinstiegSQL Server schließt Client- und Serverkomponenten ein, die unter verschiedenen Betriebssystemen ausge-führt werden.

Page 56: Programmieren Einer Microsoft SQL Server 2000-Datenbank

14 Unterrichtseinheit 1: Übersicht über SQL Server

Internetbrowser und Anwendungen von Drittanbietern Internetbrowser und Anwendungen von Drittanbietern, die unter verschiedenen Betriebssystemen ausgeführt werden, können auch auf SQL Server zugreifen.

Page 57: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 1: Übersicht über SQL Server 15

Integrieren von SQL Server in Windows 2000

� Active Directory� Sicherheit� Multiprozessorunterstützung� Microsoft-Ereignisanzeige� Windows 2000-Komponentendienste� Windows 2000-Systemmonitor� Microsoft Internet-Informationsdienste� Windows-Clustering

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

SQL Server ist vollständig in Windows 2000 integriert und nutzt viele Features von Windows 2000.

Beim Starten von Servern werden Server und deren Attribute automatisch im Verzeichnisdienst Active Directory™ registriert. Benutzer kön-nen bestimmte Server über Active Directory-Suche suchen und finden. Bei-spielsweise kann ein Benutzer das Verzeichnis verwenden, um alle Server zu finden, auf denen eine oder mehrere Instanzen von SQL Server mit einem bestimmten Datenbanknamen installiert sind.

SQL Server ist in das Sicherheitssystem von Windows 2000 integ-riert. Durch diese Integration kann mit einem einzelnen Benutzernamen und Kennwort auf SQL Server und Windows 2000 zugegriffen werden. SQL Server verwendet außerdem Verschlüsselungsfeatures von Windows 2000 für die Netzwerksicherheit, einschließlich Kerberos-Unterstützung. SQL Server stellt Clients, die ohne Authentifizierung durch Windows 2000 auf SQL Server zugreifen müssen, eigene Sicherheit bereit.

SQL Server unterstützt die SMP-Funktionen (Symmetric Multiprocessing) von Windows 2000. SQL Server nutzt automa-tisch die Vorteile aller zusätzlichen Prozessoren, die zum Servercomputer hinzugefügt werden.

SQL Server schreibt Meldungen an die Windows 2000-Anwendung, an die Windows 2000-Sicherheit und an die Windows 2000-Systemereignisprotokolle, und stellt so einen konsistenten Mechanismus zum Anzeigen und Nachverfolgen von Problemen bereit.

ThemaErläutern Sie die Integration von SQL Server in Windows 2000.

EinstiegSQL Server ist vollständig in Windows 2000 integriert.

Active Directory

Sicherheit

Multiprozessorunterstützung

Microsoft-Ereignisanzeige

Page 58: Programmieren Einer Microsoft SQL Server 2000-Datenbank

16 Unterrichtseinheit 1: Übersicht über SQL Server

Komponentendienste basieren auf Erwei-terungen von COM (Component Object Model) und Microsoft Transaction Server. Komponentendienste stellen verbessertes Threading, verbesserte Sicher-heit, Transaktionsverwaltung, Objektpooling, Queued Components, Anwen-dungsverwaltung und Anwendungspakete bereit. Beispielsweise können Soft-wareentwickler die Komponentendienste verwenden, um Routinekomponenten und Anwendungsverhalten visuell zu konfigurieren, wie beispielsweise die Sicherheit und die Teilnahme an Transaktionen, und um Komponenten in COM+-Anwendungen zu integrieren.

SQL Server sendet Leistungsdaten an Windows 2000-Systemmonitor, sodass Sie die Systemleistung von SQL Server überwachen können.

SQL Server verwendet Microsoft Internet-Informationsdienste (Internet Information Services, IIS), sodass Internetbrowser mit Hilfe des HTTP-Protokolls auf eine SQL Server-Datenbank zugreifen können.

Windows Clustering, eine Komponente von Windows 2000 Advanced Server, unterstützt die Verbindung von zwei Servern oder Knoten zu einem Cluster, um die Verfügbarkeit von Daten und Anwen-dungen zu erhöhen und deren Verwaltung zu erleichtern. SQL Server arbeitet mit Windows Clustering zusammen, um automatisch zum zweiten Knoten zu wechseln, falls der erste Knoten ausfällt.

Windows 2000-Komponentendienste

Windows 2000-Systemmonitor

Microsoft Internet-Informationsdienste

Windows Clustering

Page 59: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 1: Übersicht über SQL Server 17

Integrieren von SQL Server in andere Serveranwendungen von Microsoft

IBM Host

Microsoft Windows 2000 Server mitSolution Accelerator (SA) für dieInternetladenzeile

Microsoft HostIntegration Server 2000

Daten undAnwendungen

Microsoft SystemsManagement Server

Microsoft ExchangeServer

SQL Server

InternetInternet

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

SQL Server kann gut in andere Serveranwendungen von Microsoft integriert werden. Microsoft stellt eine Gruppe von Serveranwendungen bereit, die zusammenarbeiten, um Ihnen beim Erstellen von Unternehmenslösungen zu helfen. In der folgenden Tabelle werden einige häufig verwendete Server-anwendungen beschrieben, die mit SQL Server zusammenarbeiten oder die SQL Server verwenden.

Serveranwendung Beschreibung

Microsoft Windows 2000 Server mit Solution Accelerator (SA) für die Internetladenzeile

Stellt Internetverbindungen bereit, die sicher, schnell und leicht zu verwalten sind. Schließt einen erweiter-baren Unternehmensfirewall mit mehreren Ebenen und einen skalierbaren, leistungsfähigen Webcache ein.

Microsoft Exchange Server Ermöglicht SQL Server das Senden von E-Mail-Nach-richten mit Hilfe von Exchange Server oder anderen MAPI-kompatiblen (Messaging Application Programming Interface) Providern. SQL Server kann Nachrichten senden, wenn ein Fehler auftritt oder ein geplanter Task (z. B. eine Datenbank-sicherung) erfolgreich ausgeführt wurde oder fehlge-schlagen ist. Auch die Antwort auf in Nachrichten eingebettete Anfragen ist möglich.

Microsoft Host Integration Server 2000

Verbindet IBM-Umgebungen, in denen das SNA-Protokoll (Systems Network Architecture) ausgeführt wird, mit PC-basierten Netzwerken. Sie können SQL Server außerdem mit Hilfe von Microsoft Host Integration Server 2000 in IBM-Main-frames oder AS/400-Anwendungen und -Daten integrieren.

Microsoft Systems Management Server

Verwaltet Computersoftware, -hardware und -inventar und verwendet SQL Server zum Speichern der Datenbanken.

ThemaZeigen Sie, wie SQL Server mit anderen Serveranwen-dungen von Microsoft zusammenarbeitet.

EinstiegSQL Server kann gut in andere Serveranwendungen von Microsoft integriert werden.

Page 60: Programmieren Einer Microsoft SQL Server 2000-Datenbank

18 Unterrichtseinheit 1: Übersicht über SQL Server

���� SQL Server-Datenbanken

� Datenbanktypen

� Datenbankobjekte

� Verweisen auf SQL Server-Objekte

� Systemtabellen

� Metadatenabruf

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Das Vorhandensein von Kenntnissen in Bezug auf die SQL Server-Datenbank-struktur trägt dazu bei, dass Sie Ihre Datenbank auf effiziente Weise entwickeln und implementieren.

ThemaStellen Sie die Themen zu den SQL Server-Daten-banken vor.

EinstiegDas Vorhandensein von Kenntnissen in Bezug auf die SQL Server-Datenbank-struktur trägt dazu bei, dass Sie Ihre Datenbank auf effiziente Weise entwickeln und implementieren.

Page 61: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 1: Übersicht über SQL Server 19

Datenbanktypen

Systemdatenbanken

Benutzerdatenbanken

mastermastermodelmodel tempdbtempdb msdbmsdb

pubspubs NorthwindNorthwind User1User1

distributiondistribution

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Jeder Computer mit SQL Server weist zwei Datenbanktypen auf: Systemdaten-banken und Benutzerdatenbanken. In Systemdatenbanken werden Informa-tionen zu SQL Server als Ganzes gespeichert. SQL Server verwendet System-datenbanken, um das System zu betreiben und zu verwalten. Benutzerdaten-banken werden von Benutzern erstellt.

Wenn SQL Server installiert ist, erstellt SQL Server Setup Systemdatenbanken und Beispiel-Benutzerdatenbanken. Die Verteilungsdatenbank ist installiert, wenn Sie SQL Server für Replikationsaktivitäten konfigurieren. In der folgen-den Tabelle werden die einzelnen Datenbanken beschrieben.

Datenbank Beschreibung

master Steuert die Benutzerdatenbanken und den Betrieb von SQL Server als Ganzes, indem Informationen wie Benutzerkonten, konfigurier-bare Umgebungsvariablen und Systemfehlermeldungen nach-verfolgt werden

model Stellt eine Vorlage oder einen Prototyp für neue Benutzerdaten-banken bereit

tempdb Stellt einen Speicherbereich für temporäre Tabellen und sonstigen Bedarf an temporärem Speicherplatz bereit

msdb Stellt einen Speicherbereich für Zeitplanungsinformationen und den Auftragsverlauf bereit

distribution Speichert für die Replikation verwendete Verlaufs- und Trans-aktionsdaten

pubs Stellt eine Beispieldatenbank zum Lernen bereit

Northwind Stellt eine Beispieldatenbank zum Lernen bereit

User1 Identifiziert eine benutzerdefinierte Datenbank

ThemaBeschreiben Sie die beiden SQL Server-Datenbank-typen.

EinstiegJeder Computer mit SQL Server weist zwei Datenbanktypen auf: Systemdatenbanken und Benutzerdatenbanken.

Methodischer Hinweis Beschreiben Sie kurz die Funktion der Datenbank-typen. Weisen Sie darauf hin, dass SQL Server meh-rere Instanzen unterstützt.

Page 62: Programmieren Einer Microsoft SQL Server 2000-Datenbank

20 Unterrichtseinheit 1: Übersicht über SQL Server

Datenbankobjekte

EmpNumEmpNum LastNameLastName FirstNameFirstName ExtensionExtensionCtryCodeCtryCode

10191

10192

10202

Labrie

Labrie

Martin

Angela

Eva

Jose

x19891

x19433

x21467SP

FR

FR

LastModLastMod

\HR\KarlD

\HR\KarlD

\HR\AmyL

Gruppierter IndexGruppierter IndexAndersonAndersonBarr...

integer longstring varchar(20) char(6)char(2) longstring

TriggerTrigger

EmployeePhoneViewSELECT lastname, firstname, extensionFROM employee

EmployeePhoneViewSELECT lastname, firstname, extensionFROM employee

GespeicherteProzedur

UpdatePhone

GespeicherteProzedur

UpdatePhonePKPK FKFK

Checkx#####Checkx#####

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Eine Datenbank ist eine Auflistung von Daten, Tabellen und anderen Objekten. Datenbankobjekte helfen Ihnen beim Strukturieren von Daten und Definieren von Mechanismen für Datenintegrität. In der folgenden Tabelle werden die SQL Server-Datenbankobjekte beschrieben.

Datenbankobjekt Beschreibung

Tabelle Definiert eine Auflistung von Zeilen, denen Spalten zugeordnet sind.

Datentyp Definiert die für eine Spalte oder Variable zulässigen Datenwerte.

SQL Server stellt vom System angegebene Datentypen bereit. Benutzer erstellen benutzerdefinierte Datentypen.

Einschränkung Definiert Regeln für die in Spalten zulässigen Werte und stellt den Standardmechanismus zum Erzwingen von Datenintegrität dar.

Standard Definiert einen Wert, der in einer Spalte gespeichert ist, falls kein anderer Wert geliefert wird.

Regel Enthält Informationen, die gültige Werte definieren, die in einer Spalte oder einem Datentyp gespeichert sind.

Index Eine Speicherstruktur, die einen schnellen Zugriff zum Abrufen von Daten bereitstellt und Datenintegrität erzwingen kann.

Bei einem gruppierten Index ist die logische oder indizierte Reihenfolge der Schlüsselwerte mit der physischen, gespeicherten Reihenfolge der entsprechenden Zeilen in der Tabelle identisch.

Bei einem nicht gruppierten Index stimmt die logische Reihen-folge des Indexes nicht mit der physischen, gespeicherten Reihen-folge der Zeilen in der Tabelle überein.

ThemaBeschreiben Sie die Daten-bankobjekte von SQL Server.

EinstiegEine Datenbank ist eine Auf-listung von Daten, Tabellen und anderen Objekten.

Methodischer Hinweis Diese Folie enthält Anima-tionen. Im Abschnitt „Hin-weise für den Kursleiter“ finden Sie Informationen zum Navigieren durch diese Folie.

Beachten Sie, dass die Informationen in der Abbil-dung fiktiv sind und als Unterrichtsbeispiel bereit-gestellt werden.

Erläutern Sie, dass die Liste der Datenbankobjekte in der Tabelle generisch ist und keine Objekthierarchie dar-stellt.

Beschreiben Sie kurz die einzelnen Datenbank-objekte.

Page 63: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 1: Übersicht über SQL Server 21

(Fortsetzung) Datenbankobjekt Beschreibung

Sicht Ermöglicht das Anzeigen von Daten aus einer oder mehreren Tabellen oder Sichten einer Datenbank.

Benutzerdefinierte Funktion

Kann entweder einen skalaren Wert oder eine Tabelle zurück-geben. Funktionen werden verwendet, um häufig ausgeführte Logik zu kapseln. Code, der die in einer Funktion enthaltene Logik ausführen muss, kann die Funktion aufrufen und muss nicht die gesamte Logik der Funktion wiederholen.

Gespeicherte Prozedur

Eine benannte Auflistung vorkompilierter Transact-SQL-Anweisungen, die zusammen ausgeführt werden.

Trigger Eine besondere Form einer gespeicherten Prozedur, die auto-matisch ausgeführt wird, wenn ein Benutzer Daten in einer Tabelle oder Sicht ändert.

Page 64: Programmieren Einer Microsoft SQL Server 2000-Datenbank

22 Unterrichtseinheit 1: Übersicht über SQL Server

Verweisen auf SQL Server-Objekte

� Vollgekennzeichnete Namen

Server.Datenbank.Besitzer.Objekt

� Teilweise angegebene Namen� Server wird standardmäßig auf die aktuelle Instanz auf

dem lokalen Server eingestellt

� Datenbank wird standardmäßig auf die aktuelle Datenbank eingestellt

� Besitzer wird standardmäßig auf den Benutzernamen in der angegebenen Datenbank eingestellt

CREATE TABLE Northwind.dbo.OrderHistory...

CREATE TABLE Northwind.dbo.OrderHistory...

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Es gibt mehrere Möglichkeiten, um auf SQL Server-Objekte zu verweisen. Sie können den vollständigen Namen des Objekts angeben (dessen vollgekenn-zeichneten Namen), oder sie können nur einen Teil des Objektnamens angeben, damit SQL Server den Rest des Namen aus dem Kontext bestimmen kann, in dem Sie arbeiten.

Vollgekennzeichnete Namen In den vollständigen Namen eines SQL Server-Objektes sind im folgenden Format vier Bezeichner (der Servername, der Datenbankname, der Besitzer-name und der Objektname) eingeschlossen:

Server.Datenbank.Besitzer.Objekt

Ein Objektname, der alle vier Teile angibt, wird als vollgekennzeichneter Name bezeichnet. Jedes Objekt, das Sie in SQL Server erstellen, muss einen eindeu-tigen, vollgekennzeichneten Namen aufweisen. In einer Datenbank kann es z. B. zwei Tabellen mit dem Namen Orders geben, wenn diese unterschied-lichen Besitzern gehören. Außerdem müssen Spaltennamen innerhalb einer Tabelle oder Sicht eindeutig sein.

Teilweise angegebene Namen Wenn Sie auf ein Objekt verweisen, müssen Sie nicht immer den Server, die Datenbank und den Besitzer angeben. Vorläufige Bezeichner können ausge-lassen werden, wenn deren Positionen durch Punkte gekennzeichnet werden.

ThemaStellen Sie den Objekt-benennungsstandard von SQL Server vor.

EinstiegEs gibt mehrere Möglich-keiten, um auf SQL Server-Objekte zu verweisen…

Page 65: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 1: Übersicht über SQL Server 23

Die folgende Liste enthält gültige Formate für Objektnamen:

Server.Datenbank.Besitzer.Objekt Datenbank.Besitzer.Objekt Datenbank.Objekt Besitzer.Objekt Objekt

Wenn Sie ein Objekt erstellen und die verschiedenen Teile des Namens nicht angeben, verwendet SQL Server die folgenden Standardwerte:

� Server wird standardmäßig auf die aktuelle Instanz auf dem lokalen Server eingestellt.

� Datenbank wird standardmäßig auf die aktuelle Datenbank eingestellt. � Besitzer wird standardmäßig auf den Benutzernamen in der angegebenen

Datenbank eingestellt, der dem Benutzernamen der aktuellen Verbindung zugeordnet ist.

Ein Benutzer, der Mitglied einer Rolle ist, kann explizit die Rolle als Objekt-besitzer angeben. Ein Benutzer, der ein Mitglied der db_owner- oder db_ddladmin-Rolle in einer Datenbank ist, sollte das Benutzerkonto dbo als Besitzer eines Objekts angeben. Dies wird empfohlen.

Im folgenden Beispiel wird eine OrderHistory-Tabelle in der Northwind-Datenbank erstellt.

CREATE TABLE Northwind.dbo.OrderHistory (OrderID int, ProductID int, UnitPrice money, Quantity int, Discount decimal)

Die meisten Objektverweise verwenden aus drei Teilen bestehende Namen und werden standardmäßig auf den lokalen Server eingestellt. Aus vier Teilen be-stehende Namen werden in der Regel für verteilte Abfragen oder Aufrufe remote gespeicherter Prozeduren verwendet.

SQL Server unterstützt eine dreiteilige Benennungskonvention beim Verweisen auf den aktuellen Server. Der SQL-92-Standard unterstützt ebenfalls eine drei-teilige Benennungskonvention. In beiden Benennungskonventionen werden unterschiedliche Begriffe verwendet. In der folgenden Tabelle werden die Unterschiede zwischen SQL Server-Namen und SQL-92-Standard-Namen aufgeführt.

SQL Server-Name SQL-92-Name

Datenbank catalog

Besitzer schema

Objekt object

Beispiel

Page 66: Programmieren Einer Microsoft SQL Server 2000-Datenbank

24 Unterrichtseinheit 1: Übersicht über SQL Server

Systemtabellen

� Systemtabellen speichern Informationen (Metadaten)zum System und zu den Datenbankobjekten

� Datenbankkataloge speichern Metadaten zu einerbestimmten Datenbank

� Systemkataloge speichern Metadaten zum gesamten System und zu allen anderen Datenbanken

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

SQL Server speichert Informationen, so genannte Metadaten, zum System und zu Objekten in Datenbanken für eine Instanz von SQL Server. Metadaten sind Informationen zu Daten.

Metadaten schließen Informationen zu Eigenschaften von Daten ein, wie den Datentyp in einer Spalte (numerisch, Text usw.) oder die Länge einer Spalte. Es können außerdem Informationen zur Struktur von Daten sein oder Informa-tionen, die den Entwurf von Objekten angeben.

Die Informationen zu Daten in Systemtabellen schließen Konfigurationsinformationen und Definitionen aller Datenbanken und Daten-bankobjekte in der Instanz von SQL Server ein. Benutzer sollten System-tabellen nicht direkt ändern.

Jede Datenbank (einschließlich master) enthält eine Auflistung von Systemtabellen, in denen Metadaten zu dieser speziellen Datenbank gespeichert sind. Diese Auflistung von Systemtabellen wird als Datenbankkatalog bezeichnet. Er enthält die Definition aller Objekte in der Datenbank sowie Berechtigungen.

Der Systemkatalog, der nur in der master-Datenbank vor-handen ist, ist eine Auflistung von Systemtabellen, in denen Metadaten zum gesamten System und zu allen anderen Datenbanken gespeichert sind.

ThemaBeschreiben Sie die Systemtabellen.

EinstiegSystemtabellen speichern Informationen, so genannte Metadaten, zum System und zu Objekten in Datenbanken.

Methodischer Hinweis Eine ausführliche Erläu-terung der Metadaten finden die Kursteilnehmer in der SQL Server-Onlinedoku-mentation.

Systemtabellen

Datenbankkatalog

Systemkatalog

Page 67: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 1: Übersicht über SQL Server 25

Die Namen der meisten Systemtabellen beginnen mit dem Präfix sys. In der folgenden Tabelle werden mehrere häufig verwendete Systemtabellen und Sichten identifiziert.

Systemtabelle Datenbank Funktion

syslogins master Diese Tabelle enthält eine Zeile für jedes Anmelde-konto, das eine Verbindung mit SQL Server her-stellen kann

sysmessages master Diese Tabelle enthält eine Zeile für alle Systemfehler oder Warnungen, die SQL Server zurückgeben kann

sysdatabases master Diese Tabelle enthält eine Zeile für jede Datenbank von SQL Server

sysusers Alle Diese Tabelle enthält eine Zeile für alle Windows 2000-Benutzer, Windows 2000-Gruppen, SQL Server-Benutzer oder SQL Server-Rollen in einer Datenbank

sysobjects Alle Diese Tabelle enthält eine Zeile für jedes Objekt in einer Datenbank

Page 68: Programmieren Einer Microsoft SQL Server 2000-Datenbank

26 Unterrichtseinheit 1: Übersicht über SQL Server

Metadatenabruf

� Gespeicherte Systemprozeduren

� System- und Metadatenfunktionen

� Informationsschemasichten

EXEC sp_help EmployeesEXEC sp_help Employees

SELECT USER_NAME(10)SELECT USER_NAME(10)

SELECT * FROM INFORMATION_SCHEMA.TABLESSELECT * FROM INFORMATION_SCHEMA.TABLES

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Wenn Sie Anwendungen schreiben, die Metadaten aus Systemtabellen abrufen, sollten Sie gespeicherte Systemprozeduren, Systemfunktionen oder vom System angegebene Informationsschemasichten verwenden.

Sie können eine Systemtabelle auf die gleiche Weise abfragen wie alle anderen Datenbanktabellen, um Informationen zum System abzurufen. Sie sollten je-doch keine Skripts schreiben, mit denen die Systemtabellen direkt abgefragt werden. Wenn nämlich Systemtabellen in künftigen Produktversionen geändert werden, können die Skripts fehlschlagen oder nicht die richtigen Informationen bereitstellen.

Sie sollten die Systemtabellen nicht direkt bearbeiten. Das Ändern einer Systemtabelle kann dazu führen, dass SQL Server bei einem System-ausfall nicht ordnungsgemäß wiederhergestellt wird.

Gespeicherte Systemprozeduren SQL Server stellt vorgefertigte Abfragen bereit, so genannte gespeicherte Systemprozeduren, die Ihnen das Sammeln von Informationen zum Status des Servers und der Datenbankobjekte erleichtern.

Die Namen der meisten gespeicherten Systemprozeduren beginnen mit dem Präfix sp_. In der folgenden Tabelle werden drei häufig verwendete ge-speicherte Systemprozeduren beschrieben.

GespeicherteSystemprozedur Beschreibung

sp_help [object_name] Stellt Informationen zum angegebenen Datenbank-objekt bereit

sp_helpdb [database_name] Stellt Informationen zur angegebenen Datenbank bereit

sp_helpindex [table_name] Stellt Informationen zum Index für die angegebene Tabelle bereit

ThemaErläutern Sie die unter-schiedlichen Möglichkeiten, um Informationen aus Systemtabellen abzurufen.

EinstiegWenn Sie Anwendungen schreiben, die Informationen aus Systemtabellen abrufen, sollten Sie Folgendes verwenden…

Methodischer Hinweis Weisen Sie darauf hin, dass das Schreiben von Skripts, die Systemtabellen direkt abfragen, nicht empfehlens-wert ist.

Wenn Systemtabellen in künftigen Produktversionen geändert werden, können von einer bestimmten Systemtabellenstruktur abhängende Skripts, fehl-schlagen oder nicht die richtigen Informationen bereitstellen.

Verwenden Sie anstelle von SystemtabellenInformationsschemasichten.

Achtung

Page 69: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 1: Übersicht über SQL Server 27

Im folgenden Beispiel wird eine gespeicherte Systemtabelle ausgeführt, um Informationen zur Employees-Tabelle zu erhalten.

EXEC sp_help Employees

System- und Metadatenfunktionen System- und Metadatenfunktionen stellen eine Methode bereit, Systemtabellen aus Transact-SQL-Anweisungen abzufragen. In der folgenden Tabelle werden häufig verwendete Systemfunktionen und die entsprechenden zurückgegebenen Informationen beschrieben.

Systemfunktion Übergebener Parameter Ergebnis

DB_ID Name Gibt die Datenbank-ID zurück

USER_NAME ID Gibt den Namen des Benutzers zurück

COL_LENGTH Spalte Gibt die Spaltenbreite zurück

STATS_DATE Index Gibt das Datum zurück, an dem die Statistiken des angegebenen Indexes zuletzt aktualisiert wurden

DATALENGTH Datentyp Gibt die tatsächliche Länge eines Ausdrucks eines beliebigen Datentyps zurück

Im folgenden Beispiel wird eine Systemfunktion in einer Abfrage verwendet, um den Benutzernamen der Benutzer-ID 10 abzurufen.

SELECT USER_NAME(10)

InformationsschemasichtenInformationsschemasichten stellen eine interne, von den Systemtabellen unab-hängige Sicht der SQL Server-Metadaten bereit. Diese Sichten entsprechen der ANSI SQL-Standarddefinition für das Informationsschema.

Jede Informationsschemasicht enthält Metadaten für alle in der bestimmten Datenbank gespeicherten Datenobjekte. In der folgenden Tabelle werden häufig verwendete Informationsschemasichten beschrieben.

Informationsschemasicht Beschreibung

INFORMATION_SCHEMA.TABLES Eine Liste der Tabellen in der Datenbank

INFORMATION_SCHEMA.COLUMNS Informationen zu den in der Datenbank definierten Spalten

INFORMATION_SCHEMA.TABLES_PRIVILEGES Sicherheitsinformationen für Tabellen in der Datenbank

Im folgenden Beispiel wird eine Informationsschemasicht abgefragt, um eine Liste der Tabellen in einer Datenbank abzurufen.

SELECT * FROM INFORMATION_SCHEMA.TABLES

Beispiel

Methodischer Hinweis Weisen Sie darauf hin, dass System- und Metadaten-funktionen bestimmte ein-zelne Werte zurückgeben.

Beispiel 1

Beispiel 2

Page 70: Programmieren Einer Microsoft SQL Server 2000-Datenbank

28 Unterrichtseinheit 1: Übersicht über SQL Server

���� SQL Server-Sicherheit

� Anmeldeauthentifizierung

� Datenbank-Benutzerkonten und Datenbankrollen

� Arten von Rollen

� Berechtigungsüberprüfung

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

SQL Server überprüft Benutzer auf zwei Sicherheitsstufen: Anmeldeauthenti-fizierung und Berechtigungsüberprüfung für Datenbank-Benutzerkonten und Datenbankrollen.

Durch Authentifizierung wird der Benutzer identifiziert, der das Anmeldekonto verwendet, und es wird überprüft, ob der Benutzer eine Verbindung mit SQL Server herstellen kann. Wenn die Authentifizierung erfolgreich ist, stellt der Benutzer eine Verbindung mit SQL Server her.

Der Benutzer muss dann über die Berechtigung verfügen, auf Datenbanken auf dem Server zuzugreifen. Für den Zugriff auf Datenbanken des Servers weist der Datenbankadministrator Benutzerkonten und Rollen Berechtigungen für die Datenbank zu. Berechtigungen steuern die Aktivitäten, die der Benutzer in der SQL Server-Datenbank durchführen darf.

ThemaBeschreiben Sie die SQL Server-Sicherheit.

EinstiegSQL Server überprüft Benutzer auf zwei Sicher-heitsstufen: Anmelde-authentifizierung und Berechtigungsüberprüfung für Datenbank-Benutzer-konten und Datenbank-rollen.

Page 71: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 1: Übersicht über SQL Server 29

Anmeldeauthentifizierung

AUTHENTIFIZIERUNG

SQL Serverüberprüft vertrauteVerbindung

SQL Serverüberprüft Name und Kennwort

ODERSQLServer

Windows 2000 Gruppen oder Benutzer

Windows 2000 Gruppen oder Benutzer Windows 2000

SQL ServerAnmeldekonto

SQL ServerAnmeldekonto

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Ein Benutzer benötigt für die Verbindung mit SQL Server ein Anmeldekonto. SQL Server erkennt zwei Mechanismen zur Anmeldeauthentifizierung, Windows-Authentifizierung und SQL Server-Authentifizierung, von denen jeder einen anderen Anmeldekontotyp verwendet.

Windows-AuthentifizierungBeim Verwenden von Windows-Authentifizierung steuert ein Windows 2000-Konto oder eine Windows 2000-Gruppe den Benutzerzugriff auf SQL Server. Ein Benutzer stellt beim Verbinden kein SQL Server-Anmeldekonto bereit. Ein SQL Server-Systemadministrator muss entweder das Windows 2000-Konto oder die Windows 2000-Gruppe als gültiges SQL Server-Anmeldekonto definieren.

SQL Server-AuthentifizierungBeim Verwenden von SQL Server-Authentifizierung definiert ein SQL Server-Systemadministrator ein SQL Server-Anmeldekonto und -Kennwort. Benutzer müssen das SQL Server-Anmeldekonto und -Kennwort angeben, wenn sie eine Verbindung mit SQL Server herstellen.

ThemaStellen Sie vor, wie SQL Server Anmeldekonten authentifiziert.

EinstiegEin Benutzer benötigt für die Verbindung mit SQL Server ein Anmeldekonto.

Page 72: Programmieren Einer Microsoft SQL Server 2000-Datenbank

30 Unterrichtseinheit 1: Übersicht über SQL Server

Authentifizierungsmodus Wenn SQL Server unter Windows 2000 ausgeführt wird, kann ein System-administrator einen von zwei Authentifizierungsmodi angeben:

Nur Windows 2000-Authentifizierung ist zulässig. Benutzer können kein SQL Server-Anmeldekonto angeben.

Benutzer können eine Verbindung mit SQL Server über Windows-Authentifizierung oder SQL Server-Authentifizierung herstellen.

Methodischer Hinweis Möglicherweise werden die Kursteilnehmer die Authen-tifzierungsmodi und -mechanismen von SQL Server verwirrend finden. Erläutern Sie deshalb, dass der Server in einem Authentifizierungsmodus ausgeführt wird und dass ein Client, der eine Ver-bindung mit einem im gemischten Modus ausge-führten Server herstellt, einen Authentifizierungs-modus auswählen muss.

Windows-Authentifizierungsmodus

Gemischter Modus

Page 73: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 1: Übersicht über SQL Server 31

Datenbank-Benutzerkonten und Datenbankrollen

SQL Server weistBenutzernamen zuBenutzerkonten und-rollen zuDatenbank-Benutzer

Datenbankrolle

Windows 2000Gruppen oderBenutzer

SQL ServerAnmeldekonto

SQL Server überprüft vertrauteVerbindung

SQL Serverüberprüft Name und Kennwort

SQLServer

Windows 2000

ODER

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Nachdem Benutzer durch Windows 2000 oder SQL Server authentifiziert wur-den und sie sich bei SQL Server anmelden können, benötigen sie Konten in einer Datenbank. Benutzerkonten und Rollen identifizieren einen Benutzer in einer Datenbank und steuern den Besitz von Objekten und die Berechtigungen zum Ausführen von Anweisungen.

Datenbank-Benutzerkonten Die Benutzerkonten, die Sicherheitsberechtigungen anwenden, sind Windows 2000-Benutzer oder -Gruppen oder SQL Server-Anmeldekonten. Benutzerkonten sind datenbankspezifisch.

RollenMit Rollen können Sie Benutzer zu einer einzigen Einheit zusammenfassen, auf die Sie dann Berechtigungen anwenden können. SQL Server stellt vordefinierte Server- und Datenbankrollen für häufig verwendete Verwaltungsfunktionen bereit, sodass Sie auf einfache Weise einem bestimmten Benutzer Verwaltungs-berechtigungen erteilen können. Sie können auch Ihre eigenen benutzerdefinier-ten Datenbankrollen erstellen. In SQL Server können Benutzer Mitglied meh-rerer Rollen sein.

ThemaStellen Sie dar, wie SQL Server die SQL Server-Anmeldeauthentifizierung mit Benutzerkonten und Rollen vergleicht.

EinstiegNachdem Benutzer authen-tifiziert wurden und sie sich bei SQL Server anmelden können, benötigen sie Konten in einer Datenbank.

Page 74: Programmieren Einer Microsoft SQL Server 2000-Datenbank

32 Unterrichtseinheit 1: Übersicht über SQL Server

Arten von Rollen

� Feste Serverrollen

� Gruppierungen von Administratorprivilegien auf Serverebene

� Feste Datenbankrollen

� Gruppierungen von Administratorprivilegien auf Datenbankebene

� Benutzerdefinierte Datenbankrollen

� Representation der durch eine Gruppe von Angestellten innerhalb Ihrer Organisation definierten Arbeit

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Bei SQL Server sind drei Arten von Rollen möglich, um das Verwalten von Berechtigungen zu unterstützen: feste Serverrollen, feste Datenbankrollen und benutzerdefinierte Datenbankrollen.

Feste Serverrollen Feste Serverrollen stellen Gruppierungen von Administratorprivilegien auf Serverebene bereit. Sie werden unabhängig von Benutzerdatenbanken auf Serverebene verwaltet. In der folgenden Tabelle werden die festen Serverrollen in SQL Server 2000 beschrieben.

Rolle Berechtigung

Datenbankersteller (dbcreator) Datenbanken erstellen und ändern

Festplattenadministratoren (diskadmin) Festplattendateien verwalten

Prozessadministratoren (processadmin) SQL Server-Prozesse verwalten

Sicherheitsadministratoren(securityadmin)

Serverbenutzernamen verwalten und überwachen

Serveradministratoren (serveradmin) Serverübergreifende Einstellungen konfigurieren

Setup-Administratoren (setupadmin) Replikation installieren

Systemadministratoren (sysadmin) Beliebige Aktivitäten ausführen

Bulkadministratoren (bulkadmin) BULK INSERT-Anweisung ausführen

ThemaBeschreiben Sie drei Arten von Rollen.

EinstiegBei SQL Server sind drei Arten von Rollen möglich.

Page 75: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 1: Übersicht über SQL Server 33

Feste Datenbankrollen Feste Datenbankrollen stellen Gruppierungen von Administratorprivilegien auf Datenbankebene bereit. In der folgenden Tabelle werden die festen Datenbank-rollen in SQL Server 2000 beschrieben.

Rolle Berechtigung

public Alle Standardberechtigungen für Benutzer in einer Datenbank verwalten

db_owner Beliebige Datenbank-Rollenaktivitäten ausführen

db_accessadmin Datenbankbenutzer, Gruppen und Rollen hinzufügen oderentfernen

db_ddladmin Datenbankobjekte hinzufügen, ändern oder löschen

db_securityadmin Anweisungs- und Objektberechtigungen zuweisen

db_backupoperator Datenbanken sichern

db_datareader Daten aus beliebigen Tabellen lesen

db_datawriter Daten aus allen Tabellen hinzufügen, ändern oder löschen

db_denydatareader Keine Daten aus Tabellen lesen

db_denydatawriter Keine Daten in Tabellen ändern

Benutzerdefinierte Datenbankrollen Sie haben auch die Möglichkeit, Ihre eigenen Datenbankrollen zu erstellen, die für die Arbeit einer Gruppe von Angestellten Ihrer Organisation stehen. Sie müssen nicht für jede Person Berechtigungen erteilen oder aufheben. Wenn sich die Funktion einer Rolle ändert, können Sie auf einfache Weise die Berechti-gungen für die Rolle ändern und die Änderungen automatisch auf alle Mit-glieder der Rolle anwenden.

Page 76: Programmieren Einer Microsoft SQL Server 2000-Datenbank

34 Unterrichtseinheit 1: Übersicht über SQL Server

Berechtigungsüberprüfung

SQL ServerprüftBerechtigungen

Berechtigung OK; führt Befehl durch

Berechtigung nicht OK; gibt Error zurück

222 333

SELECT * FROM MembersSELECT * FROM Members

Datenbankbenutzerführt Befehle aus

Datenbankbenutzerführt Befehle aus

111

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Innerhalb jeder Datenbank weisen Sie Benutzerkonten und Rollen Berechtigun-gen zu, damit bestimmte Aktionen ausgeführt bzw. nicht ausgeführt werden können. SQL Server akzeptiert Befehle, nachdem ein Benutzer erfolgreich auf eine Datenbank zugegriffen hat.

SQL Server führt beim Überprüfen von Berechtigungen die folgenden Schritte durch:

1. Wenn der Benutzer eine Aktion wie das Ausführen einer Transact-SQL-Anweisung oder das Auswählen einer Menüoption ausführt, sendet der Client Transact-SQL-Anweisungen an SQL Server.

2. Wenn SQL Server eine Transact-SQL-Anweisung empfängt, wird überprüft, ob der Benutzer über die Berechtigung zum Ausführen der Anweisung verfügt.

3. SQL Server führt dann eine der folgenden beiden Aktionen aus:

• Wenn der Benutzer nicht über die entsprechenden Berechtigungen verfügt, gibt SQL Server einen Fehler zurück.

• Wenn der Benutzer über die entsprechenden Berechtigungen verfügt, führt SQL Server die Aktion aus.

ThemaBeschreiben Sie, wie SQL Server Berechtigungen überprüft.

EinstiegInnerhalb jeder Datenbank weisen Sie Benutzerkonten und Rollen Berechtigungen zu, damit bestimmte Aktionen ausgeführt bzw. nicht ausgeführt werden können.

Page 77: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 1: Übersicht über SQL Server 35

���� Arbeiten mit SQL Server

� Verwalten einer SQL Server-Datenbank

� Implementieren einer SQL Server-Datenbank

� Auswählen einer Anwendungsarchitektur für SQL Server

� Entwerfen von Anwendungen mit Hilfe von Datenbank-APIs

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Zum Arbeiten mit SQL Server gehört das Verwalten und Implementieren einer SQL Server-Datenbank und das Entwickeln von Anwendungen.

Wenn Sie mit SQL Server arbeiten, können Sie die von SQL Server bereit-gestellten grafischen Tools oder Skripts verwenden. Wenn Sie z. B. eine Daten-bank erstellen müssen, können Sie Skripts oder ein grafisches Tool verwenden. Da Sie im Allgemeinen eine bestimmte Datenbank einmal erstellen, verwenden Sie wahrscheinlich ein grafisches Tool. Wenn Sie jedoch die Datenbank sichern, verwenden Sie wahrscheinlich ein Skript, da das Sichern wiederholt vorgenommen werden muss.

ThemaWiederholen Sie die folgen-den Themen: SQL Server-Anwendungsentwurf und SQL Server-Datenbank-implementierung und -verwaltung.

EinstiegZum Arbeiten mit SQL Server gehört das Verwalten und Implemen-tieren einer SQL Server-Datenbank und das Ent-wickeln von Anwendungen.

Methodischer Hinweis Erläutern Sie, wann ein Skript oder ein grafisches Tools zum Arbeiten mit SQL Server verwendet wird.

Page 78: Programmieren Einer Microsoft SQL Server 2000-Datenbank

36 Unterrichtseinheit 1: Übersicht über SQL Server

Verwalten einer SQL Server-Datenbank

� Allgemeine Verwaltungsaufgaben

� SQL Server Enterprise Manager

� SQL Server-Verwaltungstools und -Assistenten

� SQL Server-Befehlszeilen-Verwaltungstools

� SQL Server-Hilfe und -Onlinedokumentation

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

SQL Server stellt grafische und Befehlszeilentools sowie Befehlszeilen-Dienst-programme zum Verwalten von SQL Server bereit. Es sind außerdem verschie-dene Arten von Hilfen eingeschlossen, um Sie bei der Arbeit mit SQL Server zu unterstützen.

Allgemeine Verwaltungsaufgaben Für das Verwalten einer SQL Server-Datenbank sind die folgenden Schritte erforderlich:

� Installieren, Konfigurieren und Sichern von SQL Server. � Erstellen der Datenbanken.

Dazu gehört das Zuweisen von Speicherplatz für die Datenbank und das Protokoll, das Übertragen von Daten in die Datenbank und aus der Daten-bank, das Definieren und Implementieren von Datenbanksicherheit, das Erstellen automatischer Aufträge für wiederkehrende Tasks und das Ein-richten der Replikation für das Publizieren von Daten an mehreren Stand-orten.

� Verwalten der laufenden Aktivitäten wie z. B. das Importieren und Expor-tieren von Daten, das Sichern und Wiederherstellen der Datenbank und des Protokolls und das Überwachen und Optimieren der Datenbank.

In SQL Server sind Tools und Assistenten zum Verwalten der Server, zum Entwerfen und Erstellen von Datenbanken und zum Abfragen von Daten eingeschlossen. Außerdem wird eine Onlinehilfe bereitgestellt.

SQL Server Enterprise Manager SQL Server stellt einen Verwaltungsclient, SQL Server Enterprise Manager, bereit. Es handelt sich dabei um ein MMC-Snap-In (Microsoft Management Console). MMC ist eine gemeinsam genutzte Benutzeroberfläche zum Verwalten von Microsoft-Serveranwendungen.

ThemaStellen Sie die Aktivitäten zur Verwaltung einer SQL Server-Datenbank vor.

EinstiegSQL Server stellt grafische und Befehlszeilentools sowie Befehlszeilen-Dienst-programme zum Verwalten von SQL Server bereit.

Methodischer Hinweis Führen Sie kurz SQL Server Enterprise Manager, SQL Query Analyzer und das Dienstprogramm osqlvor.

Page 79: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 1: Übersicht über SQL Server 37

SQL Server-Verwaltungstools und -Assistenten SQL Server stellt eine Reihe von Verwaltungstools und Assistenten bereit, die bestimmte Aspekte der Verwaltung unterstützen. In der folgenden Tabelle werden SQL Server-Tools und -Assistenten beschrieben.

Grafisches Tool Zweck

SQL Server-Clientkonfiguration Ein Dienstprogramm zum Verwalten der Clientkonfiguration für Netzwerkbibliotheken

SQL Server-Netzwerkkonfiguration Ein Dienstprogramm zum Verwalten der Serverkonfiguration für Netzwerkbibliotheken

SQL Profiler Ein Dienstprogramm für fortlaufende Auf-zeichnungen der Serveraktivität und zum Bereitstellen von Überwachungsfunktionen

SQL Query Analyzer Ein grafisches Abfragetool zum Analysieren des Planes einer Abfrage, zum Anzeigen von statis-tischen Informationen und zum gleichzeitigen Verwalten mehrerer Abfragen in verschiedenen Fenstern

SQL Server-Dienst-Manager Ein grafisches Dienstprogramm zum Starten, Beenden und Anhalten der SQL Server-Dienste

SQL Server Setup Eine Anwendung zum Installieren und Kon-figurieren von SQL Server

SQL Server-Assistenten Eine Auflistung von Tools, die den Benutzer bei komplexen Aufgaben führen

SQL Server-Befehlszeilen-Verwaltungstools Mit den SQL Server-Befehlszeilen-Verwaltungstools können Sie Transact-SQL-Anweisungen eingeben und Skriptdateien ausführen. In der folgenden Tabelle sind die am häufigsten verwendeten Befehlszeilen-Dienstprogramme von SQL Server beschrieben. Jede Datei ist eine ausführbare Anwendung.

Dienst-programm Beschreibung

osql Ein Dienstprogramm, das ODBC (Open Database Connectivity) zum Kommunizieren mit SQL Server verwendet. Es wird hauptsächlich verwendet, um Batchdateien mit einer oder mehreren SQL-Anweisungen auszuführen

bcp Batchdienstprogramm zum Importieren und Exportieren von Daten in und von SQL Server. Es kopiert Daten in eine und aus einer Datendatei in ein benutzerdefiniertes Format

Page 80: Programmieren Einer Microsoft SQL Server 2000-Datenbank

38 Unterrichtseinheit 1: Übersicht über SQL Server

SQL Server-Hilfe und -Onlinedokumentation SQL Server stellt Ihnen verschiedene Arten von Hilfe zur Verfügung, um Sie bei der Arbeit mit SQL Server zu unterstützen. In der folgenden Tabelle werden die verschiedenen Arten der Hilfe von SQL Server beschrieben.

Art der Hilfe Beschreibung

Hilfe zu Tools SQL Server-Tools stellen normalerweise eine kontextbezogene Hilfe zur Anwendungsoberfläche bereit. Klicken Sie auf die Schaltfläche Hilfe oder auf einen Befehl im Menü ?.

Hilfe zu Transact-SQL Wenn Sie SQL Query Analyser verwenden, wählen Sie den Namen einer Anweisung aus, und drücken Sie dann UMSCHALT+F1.

SQL Server-Dokumentation Die SQL Server-Onlinedokumentation ermöglicht den Onlinezugriff auf die SQL Server-Dokumen-tation.

Methodischer Hinweis Beschreiben Sie kurz die verschiedenen Arten der Hilfe von SQL Server.

Page 81: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 1: Übersicht über SQL Server 39

Implementieren einer SQL Server-Datenbank

� Entwerfen der Datenbank

� Erstellen der Datenbank und Datenbankobjekte

� Testen und Optimieren der Anwendung und der Datenbank

� Planen der Bereitstellung

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Das Implementieren einer SQL Server-Datenbank umfasst das Planen, Erstellen und Verwalten einer Reihe miteinander verbundener Komponenten.

Die Art und die Komplexität einer Datenbankanwendung sowie der Planungs-prozess können sich von Fall zu Fall erheblich unterscheiden. Eine Datenbank kann beispielsweise relativ einfach und nur für die Verwendung durch eine Person entworfen sein, sie kann jedoch auch groß und komplex sein und z. B. der Abwicklung von Banktransaktionen für Hunderttausende von Kunden dienen.

Unabhängig von der Größe und Komplexität der Datenbank, müssen beim Implementieren die folgenden Schritte durchgeführt werden:

� Entwerfen der Datenbank, sodass die Anwendung die Hardware optimal verwendet und künftige Erweiterungen möglich sind; Identifizieren und Modellieren von Datenbankobjekten und der Anwendungslogik und An-geben der Informationsarten für jedes Objekt und jede Art von Beziehung.

� Erstellen der Datenbank und der Datenbankobjekte, einschließlich Tabellen, Mechanismen für die Datenintegrität, Objekten für die Eingabe und den Abruf von Daten (oft gespeicherte Prozeduren), entsprechender Indizes und der Sicherheit.

� Testen und Optimieren der Anwendung und der Datenbank. Wenn Sie eine Datenbank entwerfen, sollten Sie sicherstellen, dass die Datenbank wichtige Funktionen ordnungsgemäß und schnell ausführt. In Verbindung mit dem richtigen Datenbankentwurf ist die richtige Verwen-dung von Indizes, RAID (Redundant Array of Inexpensive Disks) und Dateigruppen wichtig, um eine gute Leistung zu erreichen.

� Planen der Bereitstellung, dies schließt das Analysieren der Arbeitsaus-lastung und das Empfehlen einer optimalen Indexkonfiguration für die SQL Server-Datenbank ein.

ThemaStellen Sie die Schritte zum Implementieren einer SQL Server-Datenbank vor.

EinstiegDas Implementieren einer SQL Server-Datenbank umfasst das Planen, Er-stellen und Verwalten einer Reihe miteinander verbun-dener Komponenten.

Methodischer Hinweis Besprechen Sie kurz jeden Schritt.

Page 82: Programmieren Einer Microsoft SQL Server 2000-Datenbank

40 Unterrichtseinheit 1: Übersicht über SQL Server

Auswählen einer Anwendungsarchitektur für SQL Server

InternetInternetInternetn-Schichtennn--SchichtenSchichtenIntelligenterClient (2 Schichten)

IntelligenterIntelligenterClient (2 Schichten)Client (2 Schichten)

IntelligenterServer (2 Schichten)

IntelligenterIntelligenterServer (2 Schichten)Server (2 Schichten)

Präsentation

Geschäft

Daten

BrowserClientPräsentation

Geschäft

Daten

Präsentation

Geschäft

Daten

Geschäft

Daten

Präsentation

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Das Planen eines Datenbankentwurfs erfordert Kenntnisse in Bezug auf die von Ihnen zu modellierenden Geschäftsabläufen und Kenntnisse in Bezug auf die Datenbankkonzepte und -features, die zur Darstellung dieser Geschäftsabläufe verwendet werden können.

Bevor Sie eine Anwendung für SQL Server entwerfen, müssen Sie sich die Zeit nehmen, eine Datenbank zu entwerfen, die das Unternehmen genau modelliert. Eine gut entworfene Datenbank muss nicht so oft geändert werden und zeigt ein besseres Leistungsverhalten. Die ausgewählte Architektur wirkt sich darauf aus, wie Sie Ihre Softwareanwendung entwickeln, bereitstellen und verwalten.

SoftwarearchitekturSie können mehrere Anwendungsarchitekturen verwenden, um Client/Server-anwendungen zu implementieren. Das Auswählen einer Anwendung mit ver-schiedenen Schichten bedeutet jedoch Flexibilität und die Möglichkeit zur Aus-wahl aus Verwaltungsoptionen. Softwareanwendungen lassen sich in drei logische Schichten aufteilen, die sich physisch auf einem oder mehreren Servern befinden können.

Logische Schicht Beschreibung

Präsentation Diese Schicht schließt die Logik für das Präsentieren der Daten und der Anwendung für Benutzer ein. Sie wird fast immer auf einem Clientcomputer implementiert.

Geschäft Diese Schicht enthält die Anwendungslogik und die Geschäftsregeln. (SQL Server kann an dieser Schicht beteiligt sein.)

Daten Diese Schicht schließt die Datenbankdefinition, die Datenintegritäts-logik, gespeicherte Prozeduren und sonstige, eng mit den Daten verbundene Operationen ein. (SQL Server ist hauptsächlich an dieser Schicht beteiligt.)

ThemaBeschreiben Sie physische Architekturen und logische Softwareanwendungsent-würfe, die beim Planen einer Datenbank verfügbar sind.

EinstiegDas Planen eines Daten-bankentwurfs erfordert Kenntnisse in Bezug auf die von Ihnen zu modellieren-den Geschäftsabläufen und Kenntnisse in Bezug auf die Datenbankkonzepte und -features, die zur Dar-stellung dieser Geschäfts-abläufe verwendet werden können.

Methodischer Hinweis Weisen Sie darauf hin, dass nur die am häufigsten ver-wendeten Architekturent-würfe und Bereitstellungs-optionen dargestellt sind.

Weisen Sie unbedingt darauf hin, dass sich die Softwareanwendung bei jedem Architekturentwurf physisch auf einem Server befinden kann.

Page 83: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 1: Übersicht über SQL Server 41

ArchitekturentwurfEs gibt die folgenden typischen Optionen zur Anwendungsbereitstellung:

Der Großteil der Verarbeitung findet auf dem Server statt, während der Client die Präsentationsdienste verarbeitet. In vielen Fällen ist der Großteil der Geschäftslogik in die Datenbank implemen-tiert. Dieser Entwurf ist hilfreich, wenn Clients nicht über ausreichend Ressourcen zum Verarbeiten der Geschäftslogik verfügen. Der Server kann jedoch einen Engpass darstellen, weil Datenbank- und Geschäftsdienste dieselben Hardwareressourcen verwenden.

Unternehmensanwendungen, die mit dem Schwerpunkt auf der Datenbank entworfen werden, sind ein Beispiel für diesen Entwurf.

Der Großteil der Verarbeitung findet auf dem Client statt, während der Server die Datendienste verarbeitet. Dies ist ein häufig verwendeter Entwurf. Der Netzwerkverkehr kann jedoch stark zunehmen und das Verarbeiten von Transaktionen kann lange dauern. Dies kann die Leistung beeinträchtigen.

Ein Beispiel für diesen Entwurf sind Anwendungen, die für kleine Organisa-tionen mit Produkten wie Microsoft Access entwickelt wurden.

Das Verarbeiten wird auf einen Datenbankserver, einen Anwen-dungsserver und Clients verteilt. Bei diesem Ansatz wird die Logik von den Datendiensten getrennt, und es lassen sich bei Bedarf problemlos weitere An-wendungsserver oder Datenbankserver hinzufügen. Bei diesem Ansatz nimmt jedoch die Komplexität zu und kleinere Anwendungen werden möglicherweise langsamer ausgeführt.

Beispiele für diesen Entwurf sind Unternehmensanwendungen mit mehreren Ebenen und Anwendungen, die mit Transaktionsverarbeitungsmonitoren ent-wickelt werden.

Das Verarbeiten ist auf drei Schichten aufgeteilt, wobei sich die Geschäfts- und Präsentationsdienste auf dem Webserver befinden und die Clients Internetbrowser verwenden. SQL Server verwendet XML-Unter-stützung für die Präsentation von Daten für Browser. SQL Server kann jeden Client unterstützen, der über einen Browser verfügt. Die Software muss nicht auf dem Client gepflegt werden.

Ein Beispiel für diesen Entwurf ist eine Website, die mehrere Webserver verwendet, um Verbindungen mit Clients zu verwalten, und eine einzige SQL Server-Datenbank verwendet, die für Datenanforderungen zuständig ist.

Sie können auf SQL Server über HTTP mit Hilfe eines URLs zugreifen. So können Sie direkt auf Datenbankobjekte zugreifen und Vorlagendateien aus-führen. Dies ist nicht empfehlenswert in Umgebungen, die sehr sicher sein müssen und in denen die Leistung von großer Bedeutung ist.

Methodischer Hinweis Beschreiben Sie kurz die einzelnen Optionen zur Anwendungsbereitstellung, und weisen Sie auf die Beispiele hin.

Intelligenter Server (zwei Schichten)

Intelligenter Client (zwei Schichten)

n-Schichten

Internet

Page 84: Programmieren Einer Microsoft SQL Server 2000-Datenbank

42 Unterrichtseinheit 1: Übersicht über SQL Server

Entwerfen von Anwendungen mit Hilfe von Datenbank-APIs

Schnittstellefür Daten-objekte

Schnittstelle fürAnwendungs-programmierungen

ADOADOADO

OLE DBOLE DBOLE DB

andereandere DatenDaten--quellenquellen

RelationaleRelationaleDatenbankenDatenbanken

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Sie können eine Datenbankanwendung entwickeln, die über eine API auf SQL Server zugreift. Eine Datenbank-API enthält die folgenden zwei Teile:

� Transact-SQL-Sprachanweisungen, die an die Datenbank übergeben werden.

� Eine Reihe von Funktionen oder objektorientierten Schnittstellen und Methoden, mit denen die Transact-SQL-Anweisungen an die Datenbank gesandt und die von der Datenbank zurückgegebenen Ergebnisse verarbeitet werden.

Beispiele für relationale Datenbankanwendungen sind Buchungssysteme von Fluggesellschaften und Banktransaktionssysteme.

OLE DB OLE DB ist eine COM-basierte API. Diese API ist eine Bibliothek von COM-Schnittstellen, mit denen universeller Zugriff auf verschiedene Datenquellen möglich ist.

SQL Server enthält einen systemeigenen OLE DB-Provider. Der Provider unterstützt mit Hilfe von OLE DB geschriebene Anwendungen oder andere OLE DB verwendende APIs, wie z. B. ADO. Über den systemeigenen Provider bietet SQL Server zudem die Unterstützung von Objekten oder Komponenten, die OLE DB verwenden, wie z. B. ActiveX, ADO oder Microsoft .NET Enterprise Servers.

ThemaBeschreiben Sie das Ent-werfen einer Anwendung für SQL Server mit Hilfe von Datenbank-APIs.

EinstiegSie können eine Datenbank-anwendung entwickeln, um über eine API auf SQL Server zuzugreifen.

Methodischer Hinweis Eine ausführliche Erläute-rung der Programmier-schnittstellen finden die Kursteilnehmer in der SQL Server-Online-dokumentation.

Page 85: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 1: Übersicht über SQL Server 43

ADOMit dieser Datenbank-API wird definiert, wie eine Anwendung geschrieben wird, um eine Verbindung mit einer Datenbank mit Hilfe von OLE DB herzu-stellen, und wie Transact-SQL-Befehle an die Datenbank übergeben werden.

ADO ist eine Schnittstelle auf Anwendungsebene, die OLE DB verwendet. Da ADO OLE DB als Grundlage verwendet, können die Vorteile der von OLE DB bereitgestellten Datenzugriffsinfrastruktur genutzt werden. Gleichzeitig entfällt für den Anwendungsentwickler die Notwendigkeit, COM-Schnittstellen zu programmieren. Entwickler können ADO für allgemeine Zugriffsprogramme in Geschäftsanwendungen verwenden (Buchhaltung, Personalabteilung, Kunden-betreuung). Sie können OLE DB zur Entwicklung von Tools und Dienst-programmen oder für Entwicklungen auf Systemebene verwenden (Ent-wicklungstools und Datenbank-Dienstprogramme).

Page 86: Programmieren Einer Microsoft SQL Server 2000-Datenbank

44 Unterrichtseinheit 1: Übersicht über SQL Server

Übungseinheit A: Übersicht über SQL Server

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

LernzieleAm Ende dieser Übungseinheit werden Sie in der Lage sein, die folgenden Aufgaben auszuführen:

� Anzeigen des Inhalts, Verwenden des Indexes und Suchen nach Informa-tionen in der SQL Server-Onlinedokumentation sowie Speichern des Speicherortes von Informationen auf der Registerkarte Favoriten.

� Erstellen eines Datenbankdiagramms für die Northwind-Datenbank.

VoraussetzungenKeine.

Einrichten der Übungseinheit Nicht erforderlich.

Weitere Informationen Sollten Sie beim Ausführen von Dateien Hilfe benötigen, suchen Sie in der Hilfe von SQL Query Analyzer nach „Ausführen einer Abfrage“.

Daneben sind die folgenden Informationsquellen verfügbar:

� Das Northwind-Datenbankschema. � Die Microsoft SQL Server-Onlinedokumentation.

ThemaGeben Sie eine Einführung in die Übungseinheit.

EinstiegIn dieser Übungseinheit ver-wenden Sie die SQL Server-Onlinedokumentation, um nach Informationen zur Northwind-Datenbank zu suchen. Dann werden Sie ein Datenbankdiagramm für die Northwind-Datenbank erstellen.

Erläutern Sie die Lernziele der Übungseinheit.

Page 87: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 1: Übersicht über SQL Server 45

SzenarioDer Aufbau des Schulungsraumes soll die Organisation des weltweit agieren-den Handelsunternehmens Northwind Traders widerspiegeln. Das Unternehmen hat den fiktiven Domänennamen nwtraders.msft. Der primäre DNS-Server für nwtraders.msft ist der Kursleitercomputer, dessen IP-Adresse (Internetproto-koll) 192.168.x.200 lautet (wobei x die zugewiesene Schulungsraumnummer ist). Der Name des Kursleitercomputers ist London.

Die folgende Tabelle stellt den Benutzernamen, den Computernamen und die IP-Adresse für jeden Kursteilnehmercomputer in der fiktiven Domäne nwtraders.msft bereit. Suchen Sie den Ihrem Computer zugewiesenen Benutzernamen und notieren Sie ihn.

Benutzername Computername IP-Adresse

SQLAdmin1 Vancouver 192.168.x.1

SQLAdmin2 Denver 192.168.x.2

SQLAdmin3 Perth 192.168.x.3

SQLAdmin4 Brisbane 192.168.x.4

SQLAdmin5 Lisbon 192.168.x.5

SQLAdmin6 Bonn 192.168.x.6

SQLAdmin7 Lima 192.168.x.7

SQLAdmin8 Santiago 192.168.x.8

SQLAdmin9 Bangalore 192.168.x.9

SQLAdmin10 Singapore 192.168.x.10

SQLAdmin11 Casablanca 192.168.x.11

SQLAdmin12 Tunis 192.168.x.12

SQLAdmin13 Acapulco 192.168.x.13

SQLAdmin14 Miami 192.168.x.14

SQLAdmin15 Auckland 192.168.x.15

SQLAdmin16 Suva 192.168.x.16

SQLAdmin17 Stockholm 192.168.x.17

SQLAdmin18 Moscow 192.168.x.18

SQLAdmin19 Caracas 192.168.x.19

SQLAdmin20 Montevideo 192.168.x.20

SQLAdmin21 Manila 192.168.x.21

SQLAdmin22 Tokyo 192.168.x.22

SQLAdmin23 Khartoum 192.168.x.23

SQLAdmin24 Nairobi 192.168.x.24

Veranschlagte Zeit für die Übungseinheit: 30 Minuten

Page 88: Programmieren Einer Microsoft SQL Server 2000-Datenbank

46 Unterrichtseinheit 1: Übersicht über SQL Server

Übung 1 Verwenden der SQL Server-Onlinedokumentation

In dieser Übung verwenden Sie die SQL Server-Onlinedokumentation, um Informationen zu SQL Server abzurufen.

� So zeigen Sie den Inhalt des Abschnitts „Erste Schritte“ der SQL Server-Onlinedokumentation an

In diesem Verfahren zeigen Sie den Inhalt der SQL Server-Onlinedokumenta-tion an und machen sich mit den in der Dokumentation verwendeten Konven-tionen vertraut. 1. Melden Sie sich an der Schulungsraumdomäne nwtraders mit Hilfe der

Informationen in der folgenden Tabelle an.

Option Eingabe

Benutzername SQLAdminx (wobei x die Ihrem Computernamen zugewiesene Nummer ist, wie in der Schulungsraumdomäne nwtraders.msftfestgelegt)

Kennwort password

2. Klicken Sie auf der Taskleiste auf die Schaltfläche Start, zeigen Sie auf Programme, zeigen Sie auf Microsoft SQL Server, und klicken Sie dann auf Onlinedokumentation.

3. Sehen Sie sich in der Konsolenstruktur die Organisation der SQL Server-Onlinedokumentation an.

4. Klicken Sie auf der Registerkarte Inhalt in der Liste Aktive Untermengeauf (Gesamte Sammlung), und sehen Sie sich dann den Inhalt von Erste Schritte an.

5. Erweitern Sie in der Konsolenstruktur Erste Schritte mit der SQL Server-Onlinedokumentation, und klicken Sie dann auf Typografische Verein-barungen. Überprüfen Sie die Informationen im Detailbereich.

6. Erweitern Sie in der Konsolenstruktur Verwenden des HTML-Hilfe-Viewers, erweitern Sie Verwenden der SQL Server-Onlinedokumen-tation, und klicken Sie dann auf Finden eines Themas. Überprüfen Sie die Informationen im Detailbereich.

7. Erweitern Sie in der Konsolenstruktur Finden eines Themas, und klicken Sie dann auf Verwenden der Registerkarte "Suchen". Überprüfen Sie die Informationen im Detailbereich.

� So verwenden Sie die Index der SQL Server-Onlinedokumentation, um Informationen zur „Northwind“-Beispieldatenbank zu erhalten

In diesem Verfahren verwenden Sie den Index der SQL Server-Onlinedoku-mentation, um schnell Informationen zur Northwind-Beispieldatenbank anzuzeigen.1. Klicken Sie auf die Registerkarte Index, und geben Sie dann Northwind

ein. 2. Doppelklicken Sie auf Northwind-Beispieldatenbank.

Page 89: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 1: Übersicht über SQL Server 47

3. Doppelklicken Sie im Dialogfeld Themen gefunden auf Northwind-Beispieldatenbank. Überprüfen Sie die Informationen im Detailbereich.

4. Klicken Sie auf die Registerkarte Favoriten, und klicken Sie dann auf Hinzufügen.Klicken Sie auf die Registerkarte Inhalt, und erweitern Sie dann in der Konsolenstruktur Northwind-Beispieldatenbank, und beachten Sie die verfügbaren Themen.

� So suchen Sie in der SQL Server-Onlinedokumentation nach einem Wort oder einem Ausdruck

In diesem Verfahren verwenden Sie die SQL Server-Onlinedokumentation, um nach Informationen zur SQL Server-Architektur zu suchen. 1. Klicken Sie auf die Registerkarte Suchen, geben Sie sql NEAR

Architektur ein, und klicken Sie dann auf Themen auflisten.Beachten Sie die Anzahl der gefundenen Themen.

2. Deaktivieren Sie auf der Registerkarte Suche das Kontrollkästchen Ähnliche Wörter suchen, aktivieren Sie das Kontrollkästchen Nur Titel suchen, und klicken Sie dann auf Themen auflisten.Beachten Sie, dass zwei Themen gefunden wurden.

3. Doppelklicken Sie auf Grundlegendes zur SQL Server 2000-Architektur.4. Klicken Sie auf den Detailbereich, und drücken Sie dann STRG+F. 5. Geben Sie im Feld Suchen den Begriff oltp ein, und klicken Sie dann auf

Weitersuchen.Beachten Sie, dass die Suche das erste Vorkommnis von oltp findet.

6. Schließen Sie die SQL Server-Onlinedokumentation.

Page 90: Programmieren Einer Microsoft SQL Server 2000-Datenbank

48 Unterrichtseinheit 1: Übersicht über SQL Server

Übung 2 Erstellen eines Datenbankdiagramms

In dieser Übung verwenden Sie den Datenbank-Diagrammerstellungs-Assis-tenten, um automatisch ein Diagramm für die Northwind-Datenbank zu er-stellen. Dann verwenden Sie den Abfrage-Designer, um eine Abfrage zu er-stellen.

� So erstellen Sie ein Datenbankdiagramm In diesem Verfahren erstellen Sie mit Hilfe des Datenbank-Diagrammerstel-lungs-Assistenten ein Datenbankdiagramm der Northwind-Datenbank. 1. Klicken Sie auf der Taskleiste auf die Schaltfläche Start, zeigen Sie auf

Programme, zeigen Sie auf Microsoft SQL Server, und klicken Sie dann auf Enterprise Manager.

2. Erweitern Sie in der Konsolenstruktur Microsoft SQL Servers, erweitern Sie SQL Server-Gruppe, und erweitern Sie dann Ihren Server.

3. Erweitern Sie Datenbanken, und erweitern Sie dann Northwind.4. Klicken Sie mit der rechten Maustaste auf Diagramme, und klicken Sie

dann auf Neues Datenbankdiagramm.Das Dialogfeld Willkommen wird angezeigt.

5. Fügen Sie mit Hilfe des Datenbank-Diagrammerstellungs-Assistenten die folgenden Tabellen zum Diagramm hinzu:

• Categories

• CustomerCustomerDemo

• CustomerDemographics

• Customers

• Employees

• EmployeeTerritories

• Order Details

• Orders

• Products

• Region

• Shippers

• Suppliers

• Territories6. Klicken Sie auf der Symbolleiste auf das Symbol Zoom, und klicken Sie

dann auf 100 %.7. Klicken Sie auf der Symbolleiste auf das Symbol Speichern.8. Geben Sie im Dialogfeld Speichern unter den Namen Northwind ein, und

klicken Sie dann auf OK.

Page 91: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 1: Übersicht über SQL Server 49

� So erstellen Sie eine Abfrage mit Hilfe des Abfrage-Designers In diesem Verfahren verwenden Sie den Abfrage-Designer, um eine Abfrage zu erstellen, in der die Tabellen Products und Categories verknüpft werden. 1. Klicken Sie im Diagramm mit der rechten Maustaste auf Products, zeigen

Sie auf Aufgabe, und klicken Sie dann auf Tabelle öffnen.Dadurch wird ein neues Fenster geöffnet, dass alle Zeilen der Products-Tabelle anzeigt.

2. Klicken Sie auf der Symbolleiste auf das Symbol Diagrammbereich anzeigen/ausblenden.Dadurch wird das Tabellendiagramm der Products-Tabelle angezeigt.

3. Klicken Sie mit der rechten Maustaste auf einen freien Bereich des Diagrammbereichs, und klicken Sie dann auf Tabelle hinzufügen.

4. Doppelklicken Sie auf Categories, und klicken Sie dann auf Schließen.Dadurch wird die Categories-Tabelle zum Diagrammbereich hinzugefügt, und die Beziehungen zwischen der Categories-Tabelle und der Products-Tabelle werden angezeigt.

5. Klicken Sie auf der Symbolleiste auf das Symbol SQL-Bereichanzeigen/ausblenden.Dadurch wird das erstellte Transact-SQL-Skript angezeigt.

6. Wählen Sie in der Products-Tabelle die Kontrollkästchen ProductNameund UnitPrice aus, und wählen Sie in der Categories-Tabelle das Kontroll-kästchen CategoryName aus.

7. Klicken Sie in der Products-Tabelle auf UnitPrice, und klicken Sie auf der Symbolleiste auf das Symbol Absteigend sortieren.Beachten Sie die Änderungen des Transact-SQL-Skripts.

8. Löschen Sie im SQL-Bereich das Sternchen und das Komma in der SELECT-Anweisung.

9. Klicken Sie auf der Symbolleiste auf das Symbol Ausführen.Welches Produkt hat den höchsten Preis? Côte de Blaye; 263,5 ____________________________________________________________

____________________________________________________________

Der Abfrage-Designer wird als MMC-Snap-In (Microsoft Management Console) ausgeführt. Beachten Sie, dass jetzt drei MMC-Fenster aktiv sind: SQL Server Enterprise Manager, Datenbankdesigner und Abfrage-Designer.

Anmerkung

Page 92: Programmieren Einer Microsoft SQL Server 2000-Datenbank

50 Unterrichtseinheit 1: Übersicht über SQL Server

Lernzielkontrolle

� Informationen zu SQL Server

� SQL Server-Integration

� SQL Server-Datenbanken

� SQL Server-Sicherheit

� Arbeiten mit SQL Server

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

1. Sie haben in SQL Server ein neues Anmeldekonto für eine Windows 2000-Gruppe erstellt. Die Mitglieder dieser Gruppe sollen in der Lage sein, SQL Server zu verwenden. Welche zusätzlichen Sicherheitsaufgaben müssen Sie ausführen? Sie müssen die Windows 2000-Gruppe zur Datenbank hinzufügen, auf die die Benutzer zugreifen sollen, und dann müssen Sie Berechtigungen für die Datenbankobjekte erteilen, auf die die Benutzer zugreifen sollen. ____________________________________________________________

____________________________________________________________

2. Sie möchten Metadaten zu Objekten in einer SQL Server-Datenbank an-zeigen. Welche Methoden würden Sie verwenden? Sie können die Informationsschemasichten abfragen, gespeicherte Systemprozeduren ausführen oder Systemfunktionen verwenden. Sie können außerdem Systemtabellen direkt abfragen. Dies ist jedoch nicht ratsam, da sich Systemtabellen in künftigen Versionen des Produkts geändert haben können. ____________________________________________________________

____________________________________________________________

ThemaVertiefen Sie die Lernziele dieser Unterrichtseinheit, indem Sie die Kernpunkte wiederholen.

EinstiegDie Fragen zur Lernziel-kontrolle beziehen sich auf einige der Schlüssel-konzepte, die Inhalt dieser Unterrichtseinheit sind.

Gehen Sie anhand dieser Fragen die Themen der Unterrichtseinheit durch.

Klären Sie andere offene Fragen der Kursteilnehmer, bevor Sie fortfahren.

Page 93: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 1: Übersicht über SQL Server 51

3. Sie möchten auf zwei Tabellen verweisen, die sich in verschiedenen Daten-banken auf dem gleichen Server befinden. Aus der Inventory-Datenbank möchten Sie auf eine Tabelle in der Sales-Datenbank verweisen. Wie wür-den Sie in einer Abfrage auf die Tabelle in der Sales-Datenbank verweisen? Sie würden auf die Tabelle in der „Sales“-Datenbank mit Hilfe eines vollgekennzeichneten Namens verweisen. Sie könnten beispielsweise „Sales.dbo.Tabellenname“ oder „Sales.Tabellenname“ angeben. ____________________________________________________________

____________________________________________________________

Page 94: Programmieren Einer Microsoft SQL Server 2000-Datenbank

2 Unterrichtseinheit 1: Übersicht über SQL Server

This page is intentionally left blank.

Page 95: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 2: Übersicht über die SQL Server-Programmierung

Inhalt

Übersicht 1

Entwerfen der Anwendungsarchitektur einer Organisation 2

SQL Server-Programmierungstools 8

Transact-SQL (Programmiersprache) 11

Elemente von Transact-SQL 12

Zusätzliche Sprachelemente 20

Möglichkeiten zum Ausführen von Transact-SQL-Anweisungen 33

Empfohlene Methoden 44

Übungseinheit A: Übersicht über Transact-SQL 45

Lernzielkontrolle 53

Page 96: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Die in diesen Unterlagen enthaltenen Angaben und Daten können ohne vorherige Ankündigung geändert werden. Die in diesen Unterlagen genannten Firmen, Produkte, Menschen, Charaktere und/oder Daten sind frei erfunden und sollen keine wirklichen Individuen, Gesellschaften, Produkte oder Veranstaltungen darstellen, soweit nichts anderes angegeben ist. Die Benutzer/innen sind verpflichtet, sich an alle anwendbaren Urheberrechtsgesetze zu halten. Ohne ausdrückliche schriftliche Erlaubnis der Microsoft Corporation darf kein Teil dieser Unterlagen für irgendwelche Zwecke vervielfältigt oder übertragen werden, unabhängig davon, auf welche Art und Weise oder mit welchen Mitteln, elektronisch oder mechanisch, dies geschieht. Wenn auf dieses Dokument nur auf elektronischem Wege zugegriffen werden kann, sind Sie hiermit berechtigt, eine (1) Kopie zum persönlichen Gebrauch auszudrucken.

Microsoft Corporation kann Inhaber von Patenten oder Patentanträgen, Marken, Urheberrechten oder anderen gewerblichen Schutzrechten sein, die den Inhalt dieses Dokuments betreffen. Die Bereitstellung dieses Dokuments gewährt keinerlei Lizenzrechte an diesen Patenten, Marken, Urheberrechten oder anderen gewerblichen Schutzrechten, es sei denn, dies wurde ausdrücklich durch einen schriftlichen Lizenzvertrag mit der Microsoft Corporation vereinbart.

2000 Microsoft Corporation. Alle Rechte vorbehalten.

Microsoft, ActiveX, BackOffice, MS-DOS, PowerPoint, Visual Basic, Visual C++, Visual Studio, Windows und Windows NT sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern.

Andere in diesem Dokument aufgeführte Produkt- und Firmennamen sind möglicherweise Marken der jeweiligen Eigentümer.

Project Lead: Rich Rose Instructional Designers: Rich Rose, Cheryl Hoople, Marilyn McGill Instructional Software Design Engineers: Karl Dehmer, Carl Raebler, Rick Byham Technical Lead: Karl Dehmer Subject Matter Experts: Karl Dehmer, Carl Raebler, Rick Byham Graphic Artist: Kirsten Larson (Independent Contractor) Editing Manager: Lynette Skinner Editor: Wendy Cleary Copy Editor: Edward McKillop (S&T Consulting) Production Manager: Miracle Davis Production Coordinator: Jenny Boe Production Support: Lori Walker (S&T Consulting) Test Manager: Sid Benavente Courseware Testing: TestingTesting123 Classroom Automation: Lorrin Smith-Bates Creative Director, Media/Sim Services: David Mahlmann Web Development Lead: Lisa Pease CD Build Specialist: Julie Challenger Online Support: David Myka (S&T Consulting) Localization Manager: Rick Terek Operations Coordinator: John Williams Manufacturing Support: Laura King; Kathy Hershey Lead Product Manager, Release Management: Bo Galford Lead Product Manager, Data Base: Margo Crandall Group Manager, Courseware Infrastructure: David Bramble Group Product Manager, Content Development: Dean Murray General Manager: Robert Stewart

Page 97: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 2: Übersicht über die SQL Server-Programmierung iii

Hinweise für den Kursleiter In dieser Unterrichtseinheit erhalten die Kursteilnehmer eine Übersicht über die Anwendungsarchitektur auf Organisationsebene und Transact-SQL als Programmiersprache. Transact-SQL ist eine Datendefinitions-, Datenbearbei-tungs- und Datensteuerungssprache. Bei den Kursteilnehmern werden Kennt-nisse in Bezug auf ANSI-SQL und grundlegende Programmierkonzepte wie Funktionen, Operatoren, Variablen und Ablaufsteuerungsanweisungen, die im Microsoft® Official Curriculum (MOC)-Kurs 2316A, Abfragen von Microsoft SQL Server 2000 mit Hilfe von Transact-SQL, behandelt werden, vorausgesetzt. Den Kursteilnehmern werden darüber hinaus die verschiedenen Methoden zum Ausführen von Transact-SQL vermittelt.

In der Übungseinheit schreiben die Kursteilnehmer SELECT-Anweisungen, ändern eine Skriptdatei und verwenden Systemfunktionen.

Am Ende dieser Unterrichtseinheit werden die Kursteilnehmer in der Lage sein, die folgenden Aufgaben auszuführen:

� Beschreiben der Konzepte einer Anwendungsarchitektur auf Organisations-ebene.

� Beschreiben der primären Programmierungstools von Microsoft SQL Server™ 2000.

� Erläutern des Unterschieds zwischen den beiden primären Programmie-rungstools von SQL Server.

� Beschreiben der grundlegenden Elemente von Transact-SQL. � Beschreiben der Verwendung von lokalen Variablen, Operatoren, Funk-

tionen, Ablaufsteuerungsanweisungen und Kommentaren. � Beschreiben der verschiedenen Möglichkeiten zum Ausführen von

Transact-SQL-Anweisungen.

Unterlagen und Vorbereitung In diesem Abschnitt werden die erforderlichen Unterlagen und vorbereitenden Aufgaben erläutert, die nötig sind, um diese Unterrichtseinheit zu unterrichten.

Erforderliche Unterlagen Um diese Unterrichtseinheit zu unterrichten, benötigen Sie folgende Unterlagen:

� Die Microsoft PowerPoint®-Datei 2328A_02.ppt� Die Beispieldatei C:\Moc\2328A\Demo\D02_Ex.sql, die alle Beispiel-

skripts der Unterrichtseinheit enthält, soweit in der Unterrichtseinheit nichts anderes angegeben ist.

Präsentation:45 Minuten

Übungseinheit:30 Minuten

Page 98: Programmieren Einer Microsoft SQL Server 2000-Datenbank

iv Unterrichtseinheit 2: Übersicht über die SQL Server-Programmierung

Vorbereitende Aufgaben Zur Vorbereitung dieser Unterrichtseinheit gehen Sie folgendermaßen vor:

� Lesen Sie alle Unterlagen für diese Unterrichtseinheit. � Arbeiten Sie die Übungseinheit durch. � Bearbeiten Sie alle Vorführungen. � Machen Sie sich mit der Präsentation vertraut. � Gehen Sie alle relevanten Whitepaper auf der Kursleiter-CD durch.

Strategie für die Unterrichtseinheit Verwenden Sie die folgende Strategie, um diese Unterrichtseinheit zu präsentieren:

� Entwerfen der Anwendungsarchitektur einer Organisation Weisen Sie darauf hin, dass die Kursteilnehmer Anwendungen mit Hilfe logischer Schichten und Dienste entwerfen können. Betonen Sie, dass ein physischer Anwendungsentwurf von der Auswahl der Architektur und von der Art und Weise der Verteilung der Geschäftslogik auf Anwendungs-komponenten abhängig ist.

� SQL Server-Programmierungstools Geben Sie eine Einführung in SQL Query Analyzer. Führen Sie die Grund-funktionen von SQL Query Analyzer vor. Weisen Sie darauf hin, dass die Kursteilnehmer eine Abfrage ganz oder teilweise ausführen, die Abfrage-ergebnisse in einem Raster anzeigen und einen Ausführungsplan erstellen können.Geben Sie eine Übersicht über das Befehlszeilen-Dienstprogramm osql.Weisen Sie bei Fragen von Kursteilnehmern zum Dienstprogramm isqldarauf hin, dass das Dienstprogramm osql die Schnittstelle für Anwen-dungsprogrammierung (Application Programming Interface, API) ODBC (Open Database Connectivity), die mehr Funktionalität bietet, zum Her-stellen einer Verbindung mit SQL Server verwendet, während das Dienst-programm isql dazu die frühere DB-Library-API verwendet.

� Transact-SQL (Programmiersprache) Weisen Sie die Kursteilnehmer darauf hin, dass Transact-SQL die von SQL Server verwendete Programmiersprache ist. Da die Kursteilnehmer normalerweise mit den Prinzipien des Programmie-rens vertraut sein sollten, werden in dieser Unterrichtseinheit keine Grund-lagen zum Programmieren oder Schreiben von Anweisungen behandelt. Stattdessen wird eine Übersicht gegeben und besonders auf die wichtigsten Unterschiede zwischen Transact-SQL und ANSI SQL, der ISO-Sprache (International Organizationfor Standardization), eingegangen.

Page 99: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 2: Übersicht über die SQL Server-Programmierung v

� Elemente von Transact-SQL In diesem Abschnitt werden die Sprachelemente von Transact-SQL be-sprochen. Da die Kursteilnehmer bereits mit Programmierungsgrundlagen vertraut sein sollten, geben Sie eine Übersicht über DDL-Anweisungen (Data Definition Language, Datendefinitionssprache), DML-Anweisungen (Data Manipulation Language, Datenbearbeitungssprache) und DCL-Anweisungen (Data Control Language, Datensteuerungssprache), und erläutern Sie SQL Server-Objektnamen und die Richtlinien für das Benennen von Datenbankobjekten.

� Zusätzliche Sprachelemente Erläutern Sie lokale und Systemvariablen, die verschiedenen Operatoren und Funktionen, Sprachkonstrukte zur Ablaufsteuerung sowie Kommentar-zeichen. In der Unterrichtseinheit werden die wichtigsten Schlüsselwörter oder Klauseln behandelt, die die Kursteilnehmer im Allgemeinen verwen-den. Ausführliche Informationen zu weiteren Schlüsselwörtern erhalten die Kursteilnehmer in der SQL Server-Onlinedokumentation.

� Möglichkeiten zum Ausführen von Transact-SQL-Anweisungen Machen Sie die Kursteilnehmer mit den verschiedenen Möglichkeiten zum Ausführen von Transact-SQL-Anweisungen vertraut. Dazu zählen das dynamische Erstellen von Anweisungen, das Übergeben von Batches und das Ausführen von Skripts und Transaktionen. Führen Sie diese Verfahren nach Möglichkeit mit Hilfe von SQL Query Analyzer vor.

AnpassungsinformationenDieser Abschnitt beschreibt die Anforderungen zum Einrichten der Übungs-einheiten für eine Unterrichtseinheit sowie die Konfigurationsänderungen, die während der Übungseinheiten an den Kursteilnehmercomputern vorgenommen werden. Diese Informationen sollen Ihnen beim Replizieren oder Anpassen der Microsoft Official Curriculum-Courseware (MOC) helfen.

Die Übungseinheit in dieser Unterrichtseinheit hängt auch von der Schulungsraumkonfiguration ab, die im Abschnitt „Anpassungsinformationen“ am Ende des Dokuments Handbuch für das Einrichten von Schulungs-computern für Kurs 2328A, Programmieren einer Microsoft SQL Server 2000-Datenbank, angegeben ist.

Einrichten der Übungseinheit Für das Einrichten der Übungseinheit gibt es keine Anforderungen, die die Replikation oder die Anpassung betreffen.

Ergebnisse der Übungseinheit Auf den Kursteilnehmercomputern gibt es keine Konfigurationsänderungen, die die Replikation oder die Anpassung betreffen.

Wichtig

Page 100: Programmieren Einer Microsoft SQL Server 2000-Datenbank

vi Unterrichtseinheit 2: Übersicht über die SQL Server-Programmierung

This page is intentionally left blank.

Page 101: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 2: Übersicht über die SQL Server-Programmierung 1

Übersicht

� Entwerfen der Anwendungsarchitektur einer Organisation

� SQL Server-Programmierungstools

� Transact-SQL (Programmiersprache)

� Elemente von Transact-SQL

� Zusätzliche Sprachelemente

� Möglichkeiten zum Ausführen von Transact-SQL-Anweisungen

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Am Ende dieser Unterrichtseinheit werden Sie in der Lage sein, die folgenden Aufgaben auszuführen:

� Beschreiben der Konzepte einer Anwendungsarchitektur auf Organisations-ebene.

� Beschreiben der primären Programmierungstools von Microsoft®SQL Server™ 2000.

� Erläutern des Unterschieds zwischen den beiden primären Programmie-rungstools von SQL Server.

� Beschreiben der grundlegenden Elemente von Transact-SQL. � Beschreiben der Verwendung von lokalen Variablen, Operatoren, Funk-

tionen, Ablaufsteuerungsanweisungen und Kommentaren. � Beschreiben der verschiedenen Möglichkeiten zum Ausführen von

Transact-SQL-Anweisungen.

ThemaGeben Sie eine Übersicht über die Themen und Lern-ziele dieser Unterrichtsein-heit.

EinstiegIn dieser Unterrichtseinheit erhalten Sie Informationen über die Anwendungs-architektur auf Organi-sationsebene und Transact-SQL als Programmier-sprache.

Page 102: Programmieren Einer Microsoft SQL Server 2000-Datenbank

2 Unterrichtseinheit 2: Übersicht über die SQL Server-Programmierung

���� Entwerfen der Anwendungsarchitektur einer Organisation

� Identifizieren logischer Schichten

� Entwerfen physischer Schichten

� Zugreifen auf Daten

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

SQL Server ist häufig Bestandteil einer verteilten Anwendung. Der Entwurf einer SQL Server-Implementierung für eine Unternehmenslösung hängt von der Architekturauswahl ab und von der Art und Weise, wie die Logik auf die An-wendungen verteilt wird.

ThemaStellen Sie die Themen dieses Abschnitts vor.

EinstiegIn dieser Unterrichtseinheit erfahren Sie, wie Sie die Anwendungsarchitektur einer Organisation beschreiben.

Page 103: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 2: Übersicht über die SQL Server-Programmierung 3

Identifizieren logischer Schichten

Datendarstellung

Benutzerdefinierte Windows-Anwendungen

Webbrowser

Anwendungslogik

Benutzerdefinierte Komponenten Integrierte Anwendungen und DiensteGeschäftsregeln

Datenregeln

Datendienste

Datenzugriffs-logik

Daten-speicherung

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Die Anwendungsarchitektur einer Organisation besteht aus logischen Schichten. Dabei handelt es sich um die Schichten für die Datendarstellung, Anwendungslogik und Datendienste.

DatendarstellungDie Datendarstellungsschicht wird auch als Benutzerdienste bezeichnet und ermöglicht Benutzern das Durchsuchen und Bearbeiten von Daten. Die beiden wichtigsten Arten von Client-Anwendungen sind benutzerdefinierte Microsoft Windows®-Anwendungen und Webbrowser. Die Datendarstellungsschicht verwendet die von der Schicht für die Anwendungslogik bereitgestellten Dienste.

AnwendungslogikDiese Schicht enthält die Anwendungslogik, in der Regeln und Prozesse defi-niert werden. Sie ermöglicht Skalierbarkeit, d. h. es greifen nicht viele Clients direkt auf eine Datenbank zu (wobei jeder Client eine eigene Verbindung be-nötigt), sondern Clients können eine Verbindung mit Unternehmensdiensten herstellen, die ihrerseits wiederum eine Verbindung mit den Datenservern auf-bauen. Unternehmensdienste können benutzerdefinierte Komponenten oder integrierte Anwendungen und Dienste sein, wie z. B. Webdienste. Die Schicht für die Anwendungslogik kann auch Komponenten enthalten, die Transaktions-dienste, Messagingdienste oder Dienste zur Objekt- und Verbindungsverwal-tung verwenden.

DatendiensteDie Datendienste schließen die Datenzugriffslogik und Datenspeicherung ein. Diese Dienste können gespeicherte SQL Server-Prozeduren zum Verwalten des Datenverkehrs und der Datenintegrität auf dem Datenbankserver einschließen.

ThemaIdentifizieren Sie die logischen Schichten in der Anwendungsarchitektur einer Organisation.

EinstiegDie Anwendungsarchitektur einer Organisation besteht aus logischen Schichten.

Page 104: Programmieren Einer Microsoft SQL Server 2000-Datenbank

4 Unterrichtseinheit 2: Übersicht über die SQL Server-Programmierung

Entwerfen physischer Schichten

DatendiensteDatendarstellungApplication Logic

DatendiensteAnwendungslogik Datendarstellung

IIS Komponenten

Zweischichtenmodell

Mehrschichtenmodell

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Sie haben verschiedene Möglichkeiten, logische Schichten physisch in eine verteilte Umgebung einzubinden. Obwohl alle logischen Schichten auf einem einzigen Computer vorhanden sein können, ist es üblich, sie in einem Zwei-schichten- oder Mehrschichtenmodell zu verteilen. Dadurch können Sie Logik, Geschäftsregeln und Verarbeitung dort implementieren, wo sie am effektivsten sind.

Verwenden eines Zweischichtenmodells Wenn Sie dieses Modell verwenden, können Sie die Darstellung und die An-wendungslogik auf dem Client und die Datendienste auf einem Server imple-mentieren. Alternativ können Sie die Anwendungslogik in gespeicherten Pro-zeduren auf dem Server implementieren. Sie können sich auch für eine ge-mischte Lösung entscheiden, bei der die Anwendungslogik zwischen dem Client und dem Server aufgeteilt wird.

Zweischichtenentwürfe sind nicht so gebräuchlich wie Mehrschichtenentwürfe, was auf die zunehmende Verbreitung von Internetanwendungen zurückzuführen ist. Sie sind nicht genauso gut skalierbar und können auch nicht so leicht aufrechterhalten werden wie Mehrschichtenentwürfe.

ThemaErläutern Sie Möglichkeiten zum Integrieren logischer Schichten in physische Modelle.

EinstiegSie haben verschiedene Möglichkeiten, logische Schichten physisch in eine verteilte Umgebung einzubinden.

Page 105: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 2: Übersicht über die SQL Server-Programmierung 5

Verwenden eines Mehrschichtenmodells Das Mehrschichtenmodell, das auch als Drei- oder n-Schichtenmodell bezeich-net wird, ermöglicht Ihnen das Verteilen der Logik auf mehrere Anwendungen. Geschäftsregeln können vom Client oder von der Datenbank getrennt werden. Wenn dieses Modell im Internet angewendet wird, können Sie Darstellungs-dienste zwischen einem Browserclient und einem IIS-Webserver (Internet-Informationsdienste) aufteilen, sodass der Webserver die Webseiten formatiert, die vom Browser angezeigt werden.

Das Mehrschichtenmodell ist für Umgebungen mit sehr vielen Clients und vielen Anwendungen skalierbar, und Sie können die Arbeitsauslastung auf viele Computer verteilen. Ein Mehrschichtenmodell ist einfach zu verwalten, weil Sie eine Änderung an einer Geschäftsregel ohne Auswirkung auf andere Regeln vornehmen können. Außerdem werden bei einer Aktualisierung einer ASP (Aktive Server Page) auf einem Webserver automatisch alle Clients aktualisiert.

Page 106: Programmieren Einer Microsoft SQL Server 2000-Datenbank

6 Unterrichtseinheit 2: Übersicht über die SQL Server-Programmierung

Zugreifen auf Daten

Anwendungen und KomponentenAnwendungen und Komponenten BrowserBrowser

IISIIS

ActiveX Data Objects (ADO)ActiveX Data Objects (ADO)DatenKonsumenten

DatenProvider

Access Excel Benutzer-definierte Clients

OLE DB Daten Provider (Dienste)OLE DB Daten Provider (Dienste)

Cursor Abfrage-prozessoren

Geschäfts-dienste

OLE DB Daten Provider (Daten)OLE DB Daten Provider (Daten)

ODBC ExchangeActiveDirectoryJetSQL Server Excel Andere OLE DB-

Provider

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Microsoft-Technologien ermöglichen Ihnen das Zugreifen auf Unternehmens-daten über eine breite Palette vordefinierter oder benutzerdefinierter Clients, die eine Datenzugriffs-Programmierschnittstelle verwenden.

Verwenden vordefinierter Clients Sie können vordefinierte Clientanwendungen für den Zugriff auf Daten auf SQL Server verwenden. Die Datenabruflogik ist Bestandteil der Client-anwendung.

Microsoft Office 2000 schließt Microsoft Access und Microsoft Excel ein. In einer Mehrschichtenlösung verwenden Sie diese Anwendungen in erster Linie für Darstellungsdienste. Sie können sie jedoch auch für die Anwendungslogik und für Datendienste verwenden. Mit Hilfe dieser Anwendungen können Benutzer Daten vom Server anzeigen und Ad-hoc-Abfragen ausführen. Sie können sie zum Abrufen von SQL Server-Daten oder als Client in einem Mehr-schichtenmodell verwenden. Darüber hinaus können Sie Office 2000 als Ent-wicklungsumgebung zum Erstellen von Datenzugriffsanwendungen verwenden.

Microsoft Access und Microsoft Excel sind Beispiele für vordefinierte Clients mit einer Reihe von Funktionen. Sie können auch vordefinierte Clients ver-wenden, die nur Darstellungsdienste bieten, z. B. einen Browser, der mit IIS (Internet-Informationsdienste) kommuniziert.

Erstellen von benutzerdefinierten Clients Mit Hilfe einer Datenzugriffs-Programmierschnittstelle und einer Entwick-lungsumgebung, wie z. B. Microsoft Visual Studio®, Version 6.0, Enterprise Edition, können Sie benutzerdefinierte Clients erstellen.

ThemaErläutern Sie die verschie-denen Möglichkeiten, auf Daten zuzugreifen.

EinstiegSie können mit Hilfe von vordefinierten oder benutzerdefinierten Clients auf Unternehmensdaten zugreifen.

Page 107: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 2: Übersicht über die SQL Server-Programmierung 7

Bereitstellen eines universellen Datenzugriffs Benutzerdefinierte Clients müssen möglicherweise auf verschiedene Daten-quellen im Unternehmen zugreifen. MDAC (Microsoft Data Access Components) ist eine Schnittstelle, die eine Kommunikation mit verschiedenen Datenquellen ermöglicht. Verwenden Sie für diese Kommunikation die fol-genden MDAC-Komponenten:

� OLE DB. Eine Gruppe von Komponentendienste-Schnittstellen, die einen einheitlichen Zugriff auf Daten, die auf unterschiedlichen Informations-quellen gespeichert sind, bereitstellen. Mit OLE DB können Sie auf rela-tionale und nicht-relationale Datenquellen zugreifen.

� Microsoft ActiveX® Data Objects (ADO). Eine benutzerfreundliche Schnitt-stelle für Anwendungsprogrammierung (Application Programming Interface, API) für alle OLE DB-Datenprovider. Sie können ADO in sehr vielen Datenzugriffsanwendungs-Szenarien verwenden. OLE DB und ADO ermöglichen Ihnen das Erstellen von Datenkomponenten, die die von den Komponentendiensten bereitgestellten integrierten Dienste verwenden. ADO ermöglicht Ihnen Folgendes:

• Öffnen und Verwalten von Verbindungen.

• Erstellen von Ad-hoc-Abfragen.

• Ausführen von gespeicherten Prozeduren auf SQL Server.

• Abrufen von Ergebnissen und Verwenden von Cursorn.

• Zwischenspeichern von Abfrageergebnissen auf dem Client.

• Aktualisieren von Zeilen in der Datenbank.

• Schließen von Verbindungen.

Page 108: Programmieren Einer Microsoft SQL Server 2000-Datenbank

8 Unterrichtseinheit 2: Übersicht über die SQL Server-Programmierung

SQL Server-Programmierungstools

� SQL Query Analyzer

� Syntaxelemente werden automatisch farbig markiert

� Mehrere Abfragefenster

� Benutzerdefinierte Sichten von Resultsets

� Grafische Ausführungspläne

� Ausführen von Teilen eines Skripts

� „osql“ (Dienstprogramm)

� Befehlszeilen-Dienstprogramm

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

SQL Server 2000 bietet eine Reihe von Programmierungstools, darunter SQL Query Analyzer und das Dienstprogramm osql. SQL Query Analyzer ist eine Microsoft Windows-basierte Anwendung und osql ein Dienstprogramm, das von einer Befehlszeile aus ausgeführt werden kann.

SQL Query Analyzer Mit SQL Query Analyzer können Sie Abfrageanweisungen und -ergebnisse gleichzeitig anzeigen. Darüber hinaus können Sie SQL Query Analyzer zum Schreiben, Ändern und Speichern von Transact-SQL-Skripts verwenden.

SQL Query Analyzer stellt folgende Funktionen bereit:

� Benutzerdefiniertes Markieren von Syntaxelementen. Während Sie eine Abfrage schreiben, markiert SQL Query Analyzer Schlüsselwörter, Zeichenfolgen und andere Sprachelemente. Sie können angeben, wie diese Elemente angezeigt werden sollen.

� Mehrere Abfragefenster, jedes mit einer eigenen Verbindung. � Benutzerdefinierte Sichten von Resultsets. Sie können die Ergebnisse in der

Standardform für ein Resultset oder in einem Raster anzeigen, sodass Sie die Ergebnisse wie in einer Tabelle ändern können.

� Grafische Ausführungspläne, die beschreiben, wie SQL Server die Abfrage ausführt. Sie können den optimierten Ausführungsplan anzeigen und Ihre Syntax überprüfen.

� Die Fähigkeit, Teile eines Skripts auszuführen. Sie können Teile eines Skripts auswählen, und SQL Server führt dann nur diese Teile aus.

ThemaGeben Sie eine Übersicht über die Programmierungs-tools von SQL Server.

EinstiegSQL Server verfügt über viele Programmierungstools. Am häufigsten werden SQL Query Analyzer und das Dienstprogramm osqlverwendet.

Page 109: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 2: Übersicht über die SQL Server-Programmierung 9

„osql“ (Dienstprogramm) Mit dem Dienstprogramm osql können Sie Transact-SQL-Anweisungen, Systemprozeduren und Skriptdateien schreiben. Es verwendet ODBC (Open Database Connectivity), um mit dem Server zu kommunizieren. Sie können das Dienstprogramm direkt von der Betriebssystemebene mit den unten aufgeführ-ten Argumenten starten, wobei die Groß- und Kleinschreibung beachtet werden muss. Nachdem osql gestartet wurde, nimmt es Transact-SQL-Anweisungen an und sendet sie interaktiv an SQL Server. Die Ergebnisse werden von osqlformatiert und auf dem Bildschirm angezeigt. Beenden Sie osql mit den Befehlen QUIT oder EXIT.

osql -U login_id [-e] [-E] [-p] [-n] [-d db_name] [-q “query”] [-Q “query”][-c cmd_end] [-h headers] [-w column_width] [-s col_separator][-t time_out] [-m error_level] [-L] [-?] [-r {0 | 1}][-H wksta_name] [-P password] [-R][-S server_name] [-i input_file] [-o output_file] [-a packet_size][-b] [-O] [-l time_out]

Bei den Parametern in osql-Anweisungen wird zwischen Groß- und Kleinschreibung unterschieden.

In der folgenden Tabelle werden die am häufigsten verwendeten Argumente beschrieben.

Argument Beschreibung

-U login_id Der Benutzername. Bei Benutzernamen wird zwischen Groß- und Kleinschreibung unterschieden. Wird weder die Option -U noch -Pverwendet, verwendet SQL Server das aktuell angemeldete Benutzerkonto und fordert nicht zur Eingabe eines Kennwortes auf.

-E Verwendet eine vertraute Verbindung, statt ein Kennwort anzu-fordern.

-? Zeigt eine Syntaxzusammenfassung der osql-Optionen an.

-P password Ein vom Benutzer angegebenes Kennwort. Wenn die Option -P nicht verwendet wird, fordert osql zur Eingabe eines Kennwortes auf. Wenn die Option -P ohne Kennwort am Ende der Befehlszeile verwendet wird, verwendet osql das Standardkennwort (NULL). Bei Kennwörtern wird zwischen Groß- und Kleinschreibung unter-schieden. Wird weder die Option -U noch -P verwendet, verwendet SQL Server das aktuell angemeldete Benutzerkonto und fordert nicht zur Eingabe eines Kennwortes auf.

-S server_name Gibt den SQL Server an, mit dem die Verbindung hergestellt werden soll. server_name ist der Name des Servercomputers im Netzwerk. Diese Option ist erforderlich, wenn Sie osql von einem Remote-computer im Netzwerk aus ausführen.

-i input_file Identifiziert die Datei, die einen Batch mit Transact-SQL-Anweisun-gen oder gespeicherten Prozeduren enthält. Sie können auch das Kleiner-als-Zeichen (<) anstelle von -i verwenden.

Weitere Informationen Das Dienstprogramm isqlwird in diesem Kurs nicht behandelt, da es DB-Library verwendet, um mit dem Server zu kommunizieren, und Unicode-Datentypen nicht unterstützt.

Syntax

Anmerkung

Methodischer Hinweis Weisen Sie darauf hin, dass vor Argumenten entweder ein Gedankenstrich (-) oder ein Schrägstrich (/) stehen kann.

Page 110: Programmieren Einer Microsoft SQL Server 2000-Datenbank

10 Unterrichtseinheit 2: Übersicht über die SQL Server-Programmierung

(Fortsetzung) Argument Beschreibung

-o output_file Identifiziert die Datei, die die Ausgabe von osql empfängt. Sie können das Größer-als-Zeichen (>) anstelle von -o verwenden. Befindet sich die Eingabedatei im Unicode-Format, gilt dies auch für die Ausgabedatei, wenn Sie -o angeben. Befindet sie sich nicht im Unicode-Format, hat die Ausgabedatei das OEM-Format.

-b Gibt an, dass osql bei einem Fehler beendet wird und einen Microsoft MS-DOS® ERRORLEVEL-Wert zurückgibt. Für die DOS ERRORLEVEL-Variable wird der Wert 1 zurückgegeben, wenn der SQL Server-Fehler einen Schweregrad von 10 oder höher hat. Andernfalls wird der Wert 0 zurückgegeben. MS-DOS-Batchdateien können den Wert von DOS ERRORLEVEL testen und den Fehler entsprechend behandeln.

Page 111: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 2: Übersicht über die SQL Server-Programmierung 11

Transact-SQL (Programmiersprache)

� SQL Server-Implementierung der Eingangsstufe des ISO-Standards ANSI-SQL

� Kann von jedem mit der Eingangsstufe von ANSI-SQL-kompatiblen Produkt ausgeführt werden

� Enthält darüber hinaus einzigartige Funktionen

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Transact-SQL ist die SQL Server-Implementierung der Eingangsstufe (Entry Level) des ISO-Standards (International Standards Organization) ANSI-SQL. Die ANSI-SQL-kompatiblen Sprachelemente von Transact-SQL können von jedem mit der Eingangsstufe von ANSI-SQL-kompatiblen Produkt ausgeführt werden. Transact-SQL enthält darüber hinaus zusätzliche Sprachelemente, die für diese Sprache einzigartig sind.

Es wird empfohlen, Skripts zu schreiben, die ausschließlich Anwei-sungen im ANSI-SQL-Standard einschließen, um die Kompatibilität und Portabilität der Datenbank zu verbessern.

ThemaGeben Sie eine Übersicht über die SQL Server-Programmiersprache.

EinstiegBei Transact-SQL handelt es sich um eine Version der SQL-Programmiersprache, die ausschließlich in SQL Server verwendet wird.

Wichtig

Page 112: Programmieren Einer Microsoft SQL Server 2000-Datenbank

12 Unterrichtseinheit 2: Übersicht über die SQL Server-Programmierung

���� Elemente von Transact-SQL

� DCL-Anweisungen (Data Control Language)

� DDL-Anweisungen (Data Definition Language)

� DML-Anweisungen (Data Manipulation Language)

� SQL Server-Objektnamen

� Benennungsrichtlinien

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Beim Schreiben und Ausführen von Transact-SQL-Anweisungen verwenden Sie verschiedene Sprachelemente, mit denen ermittelt wird, wer die Daten anzeigen oder ändern, Objekte in der Datenbank erstellen und die Daten abfragen und ändern kann. Beachten Sie möglichst die Regeln für das Benennen von SQL Server-Objekten, und machen Sie sich mit den Benennungsrichtlinien für Datenbankobjekte vertraut.

ThemaGeben Sie eine Übersicht über die grundlegenden Elemente der Programmier-sprache Transact-SQL.

EinstiegBeim Schreiben und Aus-führen von Transact-SQL-Anweisungen verwenden Sie einige dieser Sprach-elemente.

Page 113: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 2: Übersicht über die SQL Server-Programmierung 13

DCL-Anweisungen (Data Control Language)

� Berechtigungen erteilen oder ändern

� GRANT

� DENY

� REVOKE

� Standardmäßig können nur die Rollen „sysadmin“,„dbcreator“, „db_owner“ und „db_securityadmin“ DCL-Anweisungen ausführen

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Sie verwenden DCL-Anweisungen, um die einem Datenbankbenutzer oder einer Rolle zugeordneten Berechtigungen zu ändern. In der folgenden Tabelle sind die DCL-Anweisungen erläutert.

Anweisung Beschreibung

GRANT Erstellt einen Eintrag im Sicherheitssystem, der es einem Benutzer ermöglicht, mit Daten zu arbeiten oder bestimmte Transact-SQL-Anweisungen auszuführen.

DENY Erstellt einen Eintrag im Sicherheitssystem, der eine Berechtigung eines Sicherheitskontos ablehnt und verhindert, dass der Benutzer, die Gruppe oder die Rolle die Berechtigung über die Gruppen- und Rollenmitglied-schaft erbt.

REVOKE Entfernt eine zuvor erteilte oder verweigerte Berechtigung.

Standardmäßig können Mitglieder der Rollen sysadmin, dbcreator, db_owneroder db_securityadmin DCL-Anweisungen ausführen.

In diesem Beispiel wird der public-Rolle die Berechtigung zum Abfragen der Products-Tabelle erteilt.

USE Northwind GRANT SELECT ON Products TO public

ThemaGeben Sie den Kursteilneh-mern eine Einführung in DCL-Anweisungen.

EinstiegDCL-Anweisungen steuern den Zugriff auf Datenbank-objekte und auf die Berech-tigung, bestimmte Anwei-sungen auszuführen.

Methodischer Hinweis Weitere Informationen zu DCL-Anweisungen finden Sie im Kurs 2322A, Ver-walten einer Microsoft SQL Server 2000-Daten-bank.

Beispiel

Page 114: Programmieren Einer Microsoft SQL Server 2000-Datenbank

14 Unterrichtseinheit 2: Übersicht über die SQL Server-Programmierung

DDL-Anweisungen (Data Definition Language)

� Definieren der Datenbankobjekte

� CREATE object_type object_name

� ALTER object_type object_name

� DROP object_type object_name

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

DDL-Anweisungen (Data Definition Language) definieren die Datenbank, in-dem Datenbanken, Tabellen und benutzerdefinierte Datentypen erstellt werden. Darüber hinaus können Sie mit DDL-Anweisungen Datenbankobjekte verwal-ten. Zu den DDL-Anweisungen zählen die folgenden:

� CREATE object_type object_name.� ALTER object_type object_name.� DROP object_type object_name.

Standardmäßig können nur Mitglieder der Rollen sysadmin, dbcreator,db_owner oder db_ddladmin DDL-Anweisungen ausführen. Im Allgemeinen wird empfohlen, keinen anderen Konten das Erstellen von Datenbankobjekten zu ermöglichen. Wenn Benutzer eigene Objekte in Datenbanken erstellen, muss jeder Objektbesitzer jedem Benutzer dieser Objekte die entsprechenden Berech-tigungen erteilen. Wegen des enormen Verwaltungsaufwands sollte dies ver-mieden werden. Durch das Beschränken der Anweisungsberechtigungen auf diese Rollen können darüber hinaus auch Probleme mit dem Objektbesitz ver-mieden werden. Solche Probleme können auftreten, wenn ein Objektbesitzer aus einer Datenbank entfernt wurde oder wenn der Besitzer einer gespeicherten Prozedur oder Sicht nicht der Besitzer der zugrunde liegenden Tabellen ist.

ThemaGeben Sie den Kursteil-nehmern eine Einführung in DDL-Anweisungen.

EinstiegDDL-Anweisungen definie-ren eine Datenbank, indem Datenbanken, Tabellen und benutzerdefinierte Daten-typen erstellt werden.

Page 115: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 2: Übersicht über die SQL Server-Programmierung 15

Wenn Objekte von mehreren Benutzerkonten erstellt werden, können die Rollen sysadmin und db_owner die SETUSER-Funktion verwenden, um die Identität anderer Benutzer anzunehmen, oder die gespeicherte Systemprozedur sp_changeobjectowner, um den Besitzer eines Objekts zu ändern.

Das folgende Skript erstellt in der ClassNorthwind-Datenbank eine Tabelle mit dem Namen Client. Die Tabelle enthält die Spalten CustomerID,Company, Contact und Phone.

USE ClassNorthwind CREATE TABLE Client (CustomerID int, Company varchar(40),Contact varchar(30), Phone char(12) )

Beispiel

Page 116: Programmieren Einer Microsoft SQL Server 2000-Datenbank

16 Unterrichtseinheit 2: Übersicht über die SQL Server-Programmierung

DML-Anweisungen (Data Manipulation Language)

� Verwenden Sie beim Arbeiten mit Daten in der Datenbank Folgendes:

� SELECT

� INSERT

� UPDATE

� DELETE

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

DML-Anweisungen arbeiten mit den Daten in der Datenbank. Mit Hilfe von DML-Anweisungen können Sie Daten ändern oder Informationen abrufen. Zu den DML-Anweisungen zählen die folgenden:

� SELECT � INSERT � UPDATE � DELETE

Standardmäßig können nur Mitglieder der Rollen sysadmin, dbcreator,db_owner und db_datawriter DML-Anweisungen ausführen.

In diesem Beispiel werden die Kategorie-ID, der Produktname, die Product ID und der Stückpreis der Produkte in der Northwind-Datenbank abgerufen.

SELECT CategoryID, ProductName, CategoryID, ProductID, UnitPriceFROM Northwind..Products

ThemaGeben Sie den Kursteil-nehmern eine Einführung in DML-Anweisungen.

EinstiegDML-Anweisungen arbeiten mit den Daten in der Datenbank.

Beispiel

Page 117: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 2: Übersicht über die SQL Server-Programmierung 17

SQL Server-Objektnamen

� Standardmäßige Bezeichner

� Das erste Zeichen muss ein alphabetisches Zeichen sein� Andere Zeichen können Buchstaben, Zahlen oder Symbole

sein� Bezeichnernamen, die mit einem Symbol beginnen, werden in

besonderen Fällen verwendet

� Begrenzte Bezeichner� Verwenden, wenn Namen eingebettete Leerzeichen enthalten� Verwenden, wenn reservierte Wörter Teile von Namen sind� In Klammern ([ ]) oder Anführungszeichen (" ") setzen

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

SQL Server stellt eine Reihe standardmäßiger Benennungsregeln für Objekt-bezeichner bereit sowie eine Methode zum Verwenden von Trennzeichen für Bezeichner, die nicht dem Standard entsprechen. Es wird empfohlen, beim Benennen von Objekten möglichst die Standardzeichen für Bezeichner zu verwenden.

Standardmäßige Bezeichner Standardmäßige Bezeichner können zwischen einem und 128 Zeichen ent-halten, darunter Buchstaben, Symbole (_, @, oder #) und Zahlen. Standard-mäßige Bezeichner dürfen keine eingebetteten Leerzeichen enthalten. Beachten Sie die folgenden Regeln, wenn Sie Bezeichner verwenden:

� Das erste Zeichen muss ein alphabetisches Zeichen sein (a-z oder A-Z). � Nach dem ersten Zeichen kann ein Bezeichner Buchstaben, Zahlen oder

eines der Symbole @, $, # oder _ einschließen. � Bezeichnernamen, die mit einem Symbol beginnen, werden in besonderen

Fällen verwendet:

• Ein mit dem Zeichen @ beginnender Bezeichner steht für eine lokale Variable oder einen lokalen Parameter.

• Ein mit einem Nummernzeichen (#) beginnender Bezeichner steht für eine temporäre Tabelle oder Prozedur.

• Ein mit einem doppelten Nummernzeichen (##) beginnender Bezeichner steht für ein globales temporäres Objekt.

Namen für temporäre Objekte sollten einschließlich Num-mernzeichen (#) oder doppeltem Nummernzeichen (##) eine Länge von 116 Zeichen nicht überschreiten, da SQL Server an temporäre Objekte ein internes numerisches Suffix vergibt.

ThemaStellen Sie die Regeln zum Benennen von SQL Server-Objekten (Regeln für Be-zeichner) vor.

EinstiegSQL Server stellt eine Reihe standardmäßiger Benen-nungsregeln für Objekt-bezeichner bereit sowie eine Methode zum Verwenden von Trennzeichen für Bezeichner, die nicht dem Standard entsprechen.

Methodischer Hinweis Führen Sie vor, wie SQL Server Query Analyzer die Anweisungselemente automatisch farbcodiert, um reservierte Wörter, Zeichen-folgen usw. anzuzeigen.

Anmerkung

Page 118: Programmieren Einer Microsoft SQL Server 2000-Datenbank

18 Unterrichtseinheit 2: Übersicht über die SQL Server-Programmierung

Begrenzte Bezeichner Wenn ein Bezeichner alle Regeln für das Format von Bezeichnern erfüllt, kön-nen Sie ihn mit oder ohne Trennzeichen verwenden. Ein Bezeichner, der eine oder mehrere Regeln für das Format von Bezeichnern nicht erfüllt, muss immer begrenzt sein.

Sie können begrenzte Bezeichner in folgenden Situationen verwenden:

� Namen enthalten eingebettete Leerzeichen. � Reservierte Wörter werden für Objektnamen oder Teile von Objektnamen

verwendet.

Sie müssen begrenzte Bezeichner in Klammern oder Anführungszeichen setzen, wenn Sie sie in Transact-SQL-Anweisungen verwenden.

� Bezeichner in Klammern werden durch eckige Klammern ([ ]) begrenzt: SELECT * FROM [Blanks In Table Name]

Trennzeichen in Klammern können, unabhängig vom Status der SET QUOTED_IDENTIFIER-Option, immer verwendet werden.

� Bezeichner in Anführungszeichen werden durch Anführungszeichen ("") begrenzt: SELECT * FROM "Blanks in Table Name"

Bezeichner in Anführungszeichen können Sie nur verwenden, wenn die SET QUOTED_IDENTIFIER-Option aktiviert ist.

Anmerkung

Page 119: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 2: Übersicht über die SQL Server-Programmierung 19

Benennungsrichtlinien

� Verwenden aussagekräftiger Namen, wenn möglich� Verwenden kurzer Namen� Verwenden einer klaren und einfachen Benennungs-

konvention� Auswählen eines Bezeichners, der den Objekttyp

deutlich erkennen lässt� Sichten� Gespeicherte Prozeduren

� Verwenden von eindeutigen Objekt- und Benutzernamen

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Richtlinien für das Benennen von Datenbankobjekten sind wichtig, da mit Hilfe der Richtlinien der Objekttyp identifiziert und die Problembehandlung sowie das Debuggen erleichtert werden kann. Beim Benennen von Datenbankobjekten sollten Sie Folgendes beachten:

� Verwenden aussagekräftiger Namen, wenn möglich. Geben Sie zum Beispiel einer Spalte, die Kundennamen enthält, den Namen Chr_Name_Of_Customer. Das Präfix Chr im Spaltennamen bezeichnet einen character-Datentyp.

� Verwenden kurzer Namen. Der Spaltenname Chr_Name_Of_Customer ist zwar sehr aussagekräftig, Sie können ihn jedoch auf Name oder Chr_Name abkürzen.

� Verwenden einer klaren und einfachen Benennungskonvention. Entscheiden Sie, was in Ihrer Situation am sinnvollsten ist, und achten Sie auf Einheitlichkeit. Vermeiden Sie zu komplexe Benennungskonventionen, weil sie schwer zu behalten sind. Sie können beispielsweise die Vokale ent-fernen, wenn ein Objektname einem Schlüsselwort ähneln soll (z. B. eine gespeicherte Prozedur für Sicherungen mit dem Namen Bckup).

� Auswählen eines Bezeichners, der den Objekttyp deutlich erkennen lässt (insbesondere bei Sichten und gespeicherten Prozeduren). Systemadministratoren verwechseln häufig Sichten mit Tabellen, was zu unerwarteten Problemen führen kann. Wenn Sie z. B. eine Sicht erstellen, die zwei Tabellen miteinander verknüpft, können Sie diese Sicht SoldViewnennen.

� Verwenden von eindeutigen Objekt- und Benutzernamen. Vermeiden Sie es beispielsweise, eine Sales-Tabelle und eine sales-Rolle in derselben Datenbank zu erstellen.

ThemaStellen Sie empfohlene Benennungsrichtlinien vor.

EinstiegRichtlinien für das Be-nennen von Datenbank-objekten sind wichtig, da mit Hilfe der Richtlinien der Objekttyp identifiziert und die Problembehandlung sowie das Debuggen erleichtert werden kann. Beim Benennen von Datenbankobjekten sollten Sie Folgendes beachten...

Page 120: Programmieren Einer Microsoft SQL Server 2000-Datenbank

20 Unterrichtseinheit 2: Übersicht über die SQL Server-Programmierung

���� Zusätzliche Sprachelemente

� Lokale Variablen

� Operatoren

� Funktionen

� Beispiele für Funktionen

� Sprachkonstrukte zur Ablaufsteuerung

� Kommentare

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Zu den zusätzlichen Elementen von Transact-SQL zählen lokale Variablen, Operatoren, Funktionen, Ablaufsteuerungsanweisungen und Kommentare.

ThemaGeben Sie eine Übersicht über zusätzliche Sprach-elemente von Transact-SQL.

EinstiegZu den zusätzlichen Elementen von Transact-SQL zählen…

Page 121: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 2: Übersicht über die SQL Server-Programmierung 21

Lokale Variablen

� Benutzerdefiniert mit DECLARE-Anweisung

� Wert mit SET- oder SELECT-Anweisung zugewiesen

DECLARE @vLastName char(20),@vFirstName varchar(11)

SET @vLastName = 'Dodsworth'SELECT @vFirstName = FirstName

FROM Northwind..EmployeesWHERE LastName = @vLastName

PRINT @vFirstName + ' ' + @vLastNameGO

DECLARE @vLastName char(20),@vFirstName varchar(11)

SET @vLastName = 'Dodsworth'SELECT @vFirstName = FirstName

FROM Northwind..EmployeesWHERE LastName = @vLastName

PRINT @vFirstName + ' ' + @vLastNameGO

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Variablen sind Sprachelemente mit zugewiesenen Werten. Lokale Variablen können in Transact-SQL verwendet werden.

Sie definieren eine lokale Variable in einer DECLARE-Anweisung und weisen ihr dann mit der SET- oder SELECT-Anweisung einen Anfangswert zu. Ver-wenden Sie die SET-Anweisung, wenn Sie den gewünschten Wert kennen. Ver-wenden Sie die SELECT-Anweisung, wenn Sie den gewünschten Wert in einer Tabelle suchen müssen. Nachdem Sie den Wert für die Variable festgelegt haben, können Sie die Variable in der Anweisung, dem Batch oder der Prozedur verwenden, in der oder in dem sie deklariert wurde. Bei einem Batch handelt es sich um eine Gruppe von Transact-SQL-Anweisungen, die gemeinsam über-geben und als Gruppe ausgeführt werden. Eine lokale Variable wird mit einem @-Zeichen vor dem Namen angezeigt.

DECLARE {@local_variable data_type} [,...n]

SET @local_variable_name = expression

Im folgenden Beispiel werden zwei Variablen deklariert. Zum Festlegen des Wertes für die @vLastName-Variable wird die SET-Anweisung und zum Suchen des Wertes für die @vFirstName-Variable die SELECT-Anweisung verwendet. Anschließend werden beide Variablen ausgedruckt.

DECLARE @vLastName char(20), @vFirstName varchar(11) SET @vLastName = 'Dodsworth' SELECT @vFirstName = FirstName FROM Northwind..Employees WHERE LastName = @vLastName PRINT @vFirstName + ' ' + @vLastName GO

Anne Dodsworth

ThemaDefinieren Sie eine Variable, und erläutern Sie, wie sie verwendet wird.

EinstiegMit Hilfe der DECLARE-Anweisung deklarieren Sie lokale Variablen im Hauptteil eines Batches oder einer Prozedur, und mit einer SET- oder SELECT-An-weisung weisen Sie ihnen Werte zu.

Methodischer Hinweis Führen Sie dies mit Hilfe von SQL Query Analyzer vor.

Syntax

Beispiel

Ergebnis

Page 122: Programmieren Einer Microsoft SQL Server 2000-Datenbank

22 Unterrichtseinheit 2: Übersicht über die SQL Server-Programmierung

Operatoren

� Typen von Operatoren

� Arithmetisch

� Vergleich

� Verkettung von Zeichenfolgen

� Logisch

� Rangfolgenebenen von Operatoren

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Bei Operatoren handelt es sich um Symbole, die mathematische Berechnungen, Zeichenfolgenverkettungen und Vergleiche zwischen Spalten, Konstanten und Variablen durchführen. Sie können sie miteinander kombinieren und in Such-bedingungen verwenden. Beim Kombinieren von Operatoren ergibt sich die Reihenfolge, in der sie von SQL Server verarbeitet werden, aus einer vor-definierten Rangfolge.

{constant | column_name | function | (subquery)}[{arithmetic_operator | string_operator | AND | OR | NOT}

{constant | column_name | function | (subquery)}…]

Typen von Operatoren SQL Server unterstützt vier Typen von Operatoren: arithmetische Operatoren, Vergleichsoperatoren, Operatoren für die Verkettung von Zeichenfolgen und logische Operatoren.

ArithmetischArithmetische Operatoren führen Berechnungen mit numerischen Spalten oder Konstanten durch. Transact-SQL unterstützt multiplikative Operatoren, ein-schließlich Multiplikation (*), Division (/) und Modulo (%) - der ganzzahlige Rest nach einer ganzzahligen Division -, sowie die Addition (+) und Subtraktion (-) additiver Operatoren.

ThemaZeigen Sie, wie Operatoren zum Ändern von Resultsets verwendet werden können.

EinstiegMit Operatoren können Sie Berechnungen durchführen oder Werte vergleichen.

Teilsyntax

Methodischer Hinweis Transact-SQL unterstützt auch bitweise Operatoren. Sie werden hier nicht be-handelt, da sie nur sehr selten verwendet werden.

Page 123: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 2: Übersicht über die SQL Server-Programmierung 23

VergleichVergleichsoperatoren vergleichen zwei Ausdrücke. Sie können Variablen, Spalten und Ausdrücke desselben Typs miteinander vergleichen. Die folgende Tabelle enthält eine Übersicht der Vergleichsoperatoren von Transact-SQL.

Operator Bedeutung

= Gleich

> Größer als

< Kleiner als

>= Größer als oder gleich

<= Kleiner als oder gleich

<> Ungleich

Verkettung von Zeichenfolgen Der Operator für die Verkettung von Zeichenfolgen (+) verkettet Zeichen-folgenwerte. Zeichenfolgenfunktionen ermöglichen alle sonstigen Zeichen-folgenbearbeitungen.

LogischDie logischen Operatoren AND, OR und NOT verbinden Suchbedingungen in WHERE-Klauseln.

Rangfolgenebenen von OperatorenWenn Sie mehrere Operatoren (logische oder arithmetische) verwenden, um Ausdrücke zu kombinieren, verarbeitet SQL Server die Operatoren gemäß ihrer Rangfolge, wodurch der Ergebniswert beeinflusst werden kann. Die folgende Tabelle enthält eine Übersicht über die Rangfolgenebene von Operatoren (die Ebenen sind nach Rangfolge absteigend sortiert).

Typ Operator Symbol

Gruppierung Primäre Gruppierung

( )

Arithmetisch Multiplikativ * / %

Arithmetisch Additiv - +

Andere Verkettung von Zeichenfolgen

+

Logische Operatoren

NOT NOT

Logische Operatoren

AND AND

Logische Operatoren

OR OR

SQL Server verarbeitet zunächst den am tiefsten geschachtelten Ausdruck. Wenn darüber hinaus alle arithmetischen Operatoren in einem Ausdruck die-selbe Rangfolgenebene haben, werden sie von links nach rechts ausgewertet.

Methodischer Hinweis Weisen Sie darauf hin, dass sich die Rangfolgenebene der logischen Operatoren von anderen Programmier-sprachen unterscheidet.

Page 124: Programmieren Einer Microsoft SQL Server 2000-Datenbank

24 Unterrichtseinheit 2: Übersicht über die SQL Server-Programmierung

Funktionen

� Aggregatfunktionen

� Skalarfunktionen

� Rowsetfunktionen

SELECT *FROM OPENQUERY(OracleSvr, 'SELECT ENAME, EMPNO FROM SCOTT.EMP')

SELECT *FROM OPENQUERY(OracleSvr, 'SELECT ENAME, EMPNO FROM SCOTT.EMP')

SELECT AVG (UnitPrice) FROM ProductsSELECT AVG (UnitPrice) FROM Products

SELECT DB_NAME() AS 'database'SELECT DB_NAME() AS 'database'

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Transact-SQL stellt viele Funktionen bereit, die Daten zurückgeben. Funk-tionen besitzen Eingabeparameter und geben Werte zurück, die in Ausdrücken verwendet werden können. Die Programmiersprache Transact-SQL stellt drei Funktionstypen zur Verfügung: Aggregatfunktionen, Skalarfunktionen und Rowsetfunktionen.

AggregatfunktionenAggregatfunktionen verarbeiten eine Auflistung von Werten, geben aber einen einzelnen zusammenfassenden Wert zurück.

In diesem Beispiel wird der Durchschnittswert der UnitPrice-Spalte für alle Produkte in der Products-Tabelle ermittelt.

SELECT AVG(UnitPrice) FROM Products

Products

28.8663

(1 row(s) affected)

ThemaGeben Sie eine Übersicht über die in SQL Server verfügbaren Funktionen.

EinstiegTransact-SQL stellt viele Funktionen bereit, die Daten zurückgeben, darunter…

Methodischer Hinweis Weisen Sie die Kursteilneh-mer darauf hin, dass sie Funktionen überall dort verwenden können, wo ein Ausdruck in einer SELECT-Anweisung zulässig ist.

Beispiel 1

Ergebnis

Page 125: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 2: Übersicht über die SQL Server-Programmierung 25

Skalarfunktionen Skalarfunktionen verarbeiten einen einzelnen Wert und geben dann einen einzelnen Wert zurück. Sie können diese Funktionen auf alle gültigen Aus-drücke anwenden. Die folgende Tabelle enthält eine Übersicht über die Kategorien, in die Skalarfunktionen guppiert werden können.

Funktionskategorie Beschreibung

Konfiguration Gibt Informationen zur aktuellen Konfiguration zurück.

Cursor Gibt Informationen zu Cursorn zurück.

Datum und Zeit Verarbeitet einen Datums- und Zeiteingabewert und gibt einen Zeichenfolgenwert, einen numerischen Wert oder einen Datums- und Zeitwert zurück.

Mathematisch Führt eine Berechnung auf der Grundlage von Eingabewerten durch, die als Parameter für die Funktion bereitgestellt werden, und gibt dann einen numerischen Wert zurück.

Metadaten Gibt Informationen zur Datenbank und den Datenbankobjekten zurück.

Sicherheit Gibt Informationen zu Benutzern und Rollen zurück.

Zeichenfolge Verarbeitet den Eingabewert einer Zeichenfolge (char oder varchar) und gibt eine Zeichenfolge oder einen numerischen Wert zurück.

System Führt Operationen aus und gibt Informationen zu Werten, Objekten und Einstellungen in SQL Server zurück.

Statistische Systemfunktion

Gibt statistische Informationen zum System zurück.

Text und Image Verarbeitet einen Text- oder Imageeingabewert bzw. eine Text-oder Imagespalte und gibt Informationen zum Wert zurück.

Dieses Beispiel einer Metadatenfunktion gibt den Namen der aktuell verwendeten Datenbank zurück.

SELECT DB_NAME() AS 'database'

Datenbank

Northwind

(1 row(s) affected)

RowsetfunktionenRowsetfunktionen können wie Tabellenverweise in einer Transact-SQL-An-weisung verwendet werden.

In diesem Beispiel wird eine verteilte Abfrage ausgeführt, um Informationen aus der EMP-Tabelle abzurufen.

SELECT *FROM OPENQUERY(OracleSvr, 'SELECT ENAME, EMPNO FROM SCOTT.EMP')

Beispiel 2

Ergebnis

Beispiel 3

Page 126: Programmieren Einer Microsoft SQL Server 2000-Datenbank

26 Unterrichtseinheit 2: Übersicht über die SQL Server-Programmierung

Beispiele für Funktionen

SELECT 'ANSI:' AS Region, CONVERT(varchar(30), GETDATE(), 102) AS Style

UNIONSELECT 'European:', CONVERT(varchar(30), GETDATE(), 113)UNIONSELECT 'Japanese:', CONVERT(varchar(30), GETDATE(), 111)

SELECT 'ANSI:' AS Region, CONVERT(varchar(30), GETDATE(), 102) AS Style

UNIONSELECT 'European:', CONVERT(varchar(30), GETDATE(), 113)UNIONSELECT 'Japanese:', CONVERT(varchar(30), GETDATE(), 111)

Ergebnis

ANSI:ANSI:

European:European:Japanese:Japanese:

StyleStyleStyle11

112000.03.222000.03.22

22 Mar 2000 14:20:00:01022 Mar 2000 14:20:00:010

2000/03/222000/03/22

RegionRegion

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Funktionen werden häufig zum Konvertieren von Datumsangaben aus dem Format eines Landes in das eines anderen Landes verwendet.

Verwenden Sie die CONVERT-Funktion mit der Formatoption, um Datumsformate zu ändern und das Datumsformat zu ermitteln, das zurück-gegeben wird.

Dieses Beispiel zeigt, wie Datumsangaben in unterschiedliche Formate kon-vertiert werden können.

SELECT 'ANSI:' AS Region, CONVERT (varchar(30), GETDATE(), 102) AS Style UNIONSELECT 'European:', CONVERT(varchar(30), GETDATE(), 113) UNIONSELECT 'Japanese:', CONVERT(varchar(30), GETDATE(), 111)

Region Style

ANSI: 2000.03.22 European: 22 Mar 2000 14:20:00:010 Japanese: 2000/03/22

ThemaFühren Sie einige der all-gemeinen Verwendungs-möglichkeiten von Funk-tionen vor.

EinstiegFunktionen werden häufig zum Konvertieren von Datumsangaben aus dem Format eines Landes in das eines anderen Landes verwendet.

Methodischer Hinweis Weisen Sie auf die Format-optionen im Thema „CONVERT“ in der SQL Server-Online-dokumentation hin.

Anmerkung

Beispiel 1

Ergebnis

Page 127: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 2: Übersicht über die SQL Server-Programmierung 27

In diesem Beispiel wird die DATEFORMAT-Option der SET-Anweisung ver-wendet, um Datumsangaben für die Dauer einer Verbindung zu formatieren. Diese Einstellung wird nur für die Interpretation von Zeichenfolgen, die in Datumsangaben konvertiert werden, verwendet und hat keine Auswirkung auf die Anzeige von Datumswerten.

SET DATEFORMAT dmy GODECLARE @vdate datetime SET @vdate = '29/11/00' SELECT @vdate

2000-11-29 00:00:00.000

(1 row(s) affected)

In diesem Beispiel werden der aktuelle Benutzername und die Anwendung zurückgegeben, die der Benutzer für die aktuelle Sitzung oder Verbindung verwendet. Der Benutzer ist in diesem Beispiel ein Mitglied der sysadmin-Rolle.

USE Northwind SELECT user_name(), app_name()

dbo MS SQL Query Analyzer

(1 row(s) affected)

In diesem Beispiel wird ermittelt, ob in der FirstName-Spalte der Employees-Tabelle der Northwind-Datenbank NULL-Werte zugelassen sind.

Das Ergebnis 0 (FALSE) bedeutet, dass keine NULL-Werte zugelassen sind, und das Ergebnis 1 (TRUE) bedeutet, dass NULL-Werte zugelassen sind. Beachten Sie, dass die OBJECT_ID-Funktion in die COLUMNPROPERTY-Funktion eingebettet ist. Dadurch können Sie den Wert für object id der Employees-Tabelle abrufen.

USE Northwind SELECT COLUMNPROPERTY(OBJECT_ID('Employees'), 'FirstName', 'AllowsNull')

0

(1 row(s) affected)

Beispiel 2

Ergebnis

Beispiel 3

Ergebnis

Beispiel 4

Ergebnis

Page 128: Programmieren Einer Microsoft SQL Server 2000-Datenbank

28 Unterrichtseinheit 2: Übersicht über die SQL Server-Programmierung

Sprachkonstrukte zur Ablaufsteuerung

� Anweisungsebene

� BEGIN…END-Blöcke

� IF…ELSE-Blöcke

� WHILE-Konstrukte

� Zeilenebene

� CASE-Ausdruck

IF USER_NAME() <> 'dbo'BEGINRAISERROR('Must be sysadminto Perform Operation',10, 1)RETURN

ENDELSE

DBCC CHECKDB(Northwind)

IF USER_NAME() <> 'dbo'BEGINRAISERROR('Must be sysadminto Perform Operation',10, 1)RETURN

ENDELSE

DBCC CHECKDB(Northwind)

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Transact-SQL enthält mehrere Sprachkonstrukte, durch die der Ablauf der Logik in einer Anweisung gesteuert wird. Darüber hinaus enthält es den CASE-Ausdruck, der es Ihnen ermöglicht, in einer SELECT- oder UPDATE-Anweisung in jeweils einer Zeile Bedingungslogik zu verwenden.

AnweisungsebeneMit den folgenden Sprachkonstrukten können Sie den Ablauf der Logik in einem Skript steuern:

Diese Elemente schließen eine Reihe von Transact-SQL-Anweisungen ein, sodass sie von SQL Server als Einheit behandelt werden.

Diese Elemente geben an, dass SQL Server die erste Alternative ausführen soll, wenn eine bestimmte Bedingung erfüllt ist. Andernfalls soll SQL Server die zweite Alternative ausführen.

Durch diese Elemente wird eine Anweisung wiederholt ausgeführt, solange die angegebene Bedingung erfüllt ist. Mit den Anwei-sungen BREAK und CONTINUE wird die Ausführung der Anweisungen innerhalb einer WHILE-Schleife gesteuert.

ThemaGeben Sie den Kursteil-nehmern eine Einführung in die Sprachkonstrukte von Transact-SQL, die die Verarbeitung von An-weisungen steuern.

EinstiegTransact-SQL unterstützt Sprachkonstrukte, die den Ablauf der Logik in Anweisungen steuern.

BEGIN…END-Blöcke

IF…ELSE-Blöcke

WHILE-Konstrukte

Page 129: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 2: Übersicht über die SQL Server-Programmierung 29

In diesem Beispiel wird ermittelt, ob für einen Kunden noch Bestellungen offen sind, bevor dieser Kunde aus der Kundenliste gelöscht wird.

USE Northwind IF EXISTS (SELECT OrderID FROM Orders WHERE CustomerID = 'Frank') PRINT '*** Customer cannot be deleted ***' ELSE BEGIN DELETE Customers WHERE CustomerID = 'Frank' PRINT '*** Customer deleted ***' END

ZeilenebeneEin CASE-Ausdruck listet Prädikate auf, weist jedem Prädikat einen Wert zu und testet dann jedes Prädikat. Wenn der Ausdruck den Wert TRUE zurückgibt, gibt der CASE-Ausdruck den Wert in der WHEN-Klausel zurück. Wenn der Ausdruck den Wert FALSE zurückgibt und eine ELSE-Klausel angegeben wurde, gibt SQL Server den Wert in der ELSE-Klausel zurück. Ein CASE-Aus-druck kann in jedem Ausdruck verwendet werden.

CASE expression {WHEN expression THEN result} [,…n][ELSE result]END

Beispiel 1

Syntax

Page 130: Programmieren Einer Microsoft SQL Server 2000-Datenbank

30 Unterrichtseinheit 2: Übersicht über die SQL Server-Programmierung

Im folgenden Beispiel wird der Lagerbestand von Produkten in der Products-Tabelle überprüft, und es werden Meldungen über die verfügbaren und die bestellten Mengen sowie die Information, dass ein Produkt nicht mehr geführt wird, zurückgegeben.

SELECT ProductID, 'Product Inventory Status' = CASE WHEN (UnitsInStock < UnitsOnOrder AND Discontinued = 0) THEN 'Negative Inventory - Order Now!' WHEN ((UnitsInStock-UnitsOnOrder) < ReorderLevel AND Discontinued = 0) THEN 'Reorder level reached- Place Order' WHEN (Discontinued = 1) THEN '***Discontinued***' ELSE 'In Stock' END FROM Northwind..Products

ProductID Product Inventory Status

1 In Stock 2 Negative Inventory - Order Now! 3 Negative Inventory - Order Now! 4 In Stock 5 ***Discontinued*** 6 In Stock 7 In Stock 8 In Stock 9 ***Discontinued*** 10 In Stock 11 Negative Inventory - Order Now! 12 In Stock 13 Reorder level reached - Place Order ...(77 row(s) affected)

Beispiel

Ergebnis

Page 131: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 2: Übersicht über die SQL Server-Programmierung 31

Kommentare

� Inline-Kommentare

� Blockkommentare

SELECT ProductName,(UnitsInStock + UnitsOnOrder) AS Max -- Berechnet Inventar, SupplierIDFROM Products

SELECT ProductName,(UnitsInStock + UnitsOnOrder) AS Max -- Berechnet Inventar, SupplierIDFROM Products

/*** Dieser Code ruft alle Zeilen der Tabelle products ab ** und zeigt den Einheitspreis, den Einheitspreis um 10%** erhöht und den Name des Produktes an. */SELECT UnitPrice, (UnitPrice * 1.1), ProductName FROM Products

/* ** Dieser Code ruft alle Zeilen der Tabelle products ab ** und zeigt den Einheitspreis, den Einheitspreis um 10%** erhöht und den Name des Produktes an. */SELECT UnitPrice, (UnitPrice * 1.1), ProductName FROM Products

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Kommentare sind nicht auszuführende Textzeichenfolgen, die in Anweisungen platziert sind und die von der Anweisung ausgeführte Aktion beschreiben oder eine oder mehrere Zeilen der Anweisung deaktivieren. Sie können Kommentare auf zwei Arten verwenden - in derselben Zeile wie die Anweisung (Inline) oder als Block.

Inline-KommentareSie können Inline-Kommentare mit Hilfe von zwei Bindestrichen (--) erstellen, mit denen ein Kommentar von einer Anweisung abgegrenzt wird. Transact-SQL ignoriert Text, der rechts von den Kommentarzeichen steht. Darüber hinaus können Sie dieses Kommentarzeichen verwenden, um Zeilen einer Anweisung zu deaktivieren.

In diesem Beispiel wird in einem Inline-Kommentar erklärt, welche Art von Berechnung durchgeführt wird.

SELECT ProductName ,(UnitsInStock + UnitsOnOrder) AS Max -- Berechnet Inventar , SupplierID FROM Products

In diesem Beispiel wird eine zweite Gruppe von Inline-Kommentaren, erkenn-bar an dem zweiten Bindestrichpaar (--), dazu verwendet, die Ausführung eines Abschnitts (SupplierID) einer Anweisung zu verhindern.

SELECT ProductName ,(UnitsInStock + UnitsOnOrder) AS Max -- Berechnet Inventar-- , SupplierID FROM Products

ThemaGeben Sie den Kursteil-nehmern eine Einführung in die allgemeine Verwendung von Kommentaren.

EinstiegKommentare sind nicht aus-zuführende Zeichenfolgen, die Sie in eine Anweisung einfügen können, um die Anweisung zu kommen-tieren oder Teile davon während des Testens zu deaktivieren.

Beispiel 1

Beispiel 2

Page 132: Programmieren Einer Microsoft SQL Server 2000-Datenbank

32 Unterrichtseinheit 2: Übersicht über die SQL Server-Programmierung

BlockkommentareSie können Kommentarblocks mit mehreren Zeilen erstellen, indem Sie ein Kommentarzeichen (/*) am Anfang des Kommentartextes platzieren, dann die Kommentare eingeben und den Kommentar mit einem abschließenden Kom-mentarzeichen (*/) beenden.

Mit diesem Kommentarkennzeichner können Sie eine oder mehrere Zeilen umfassende Kommentare oder Kommentarüberschriften erstellen - beschrei-benden Text, der die nachfolgenden Anweisungen dokumentiert. Kommentar-überschriften schließen häufig den Namen des Verfassers, das Datum der Er-stellung und letzten Änderung des Skripts, sowie Versionsinformationen und eine Beschreibung der von der Anweisung ausgeführten Aktion ein.

Blockkommentare können keine GO-Anweisung enthalten.

Dieses Beispiel zeigt eine Kommentarüberschrift, die mehrere Zeilen umfasst. Durch die beiden Sterne (**) vor jeder Zeile wird die Lesbarkeit verbessert.

/*** Dieser Code ruft alle Zeilen der Tabelle products ab** und zeigt den Einheitspreis, den Einheitspreis um 10% ** erhöht und den Name des Produktes an. */

SELECT UnitPrice, (UnitPrice * 1.1), ProductName FROM Products

Sie sollten im gesamten Skript Kommentare platzieren, sodass die von den Anweisungen ausgeführten Aktionen beschrieben werden. Dies ist be-sonders wichtig, wenn auch andere Personen das Skript überprüfen oder imple-mentieren müssen.

Dieser Abschnitt eines Skripts ist in Kommentarzeichen gesetzt, damit er nicht ausgeführt wird. Dies kann beim Debuggen oder bei der Fehlerbehandlung in einer Skriptdatei hilfreich sein.

/*DECLARE @v1 int SET @v1 = 0 WHILE @v1 < 100 BEGIN SELECT @v1 = (@v1 + 1) SELECT @v1 END */

Anmerkung

Beispiel 3

Anmerkung

Beispiel 4

Page 133: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 2: Übersicht über die SQL Server-Programmierung 33

���� Möglichkeiten zum Ausführen von Transact-SQL-Anweisungen

� Dynamisches Erstellen von Anweisungen

� Verwenden von Batches

� Verwenden von Skripts

� Verwenden von Transaktionen

� Verwenden von XML

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Sie können Transact-SQL-Anweisungen ausführen, indem Sie Anweisungen dynamisch erstellen oder Batches, Skripts und Transaktionen verwenden. Darüber hinaus können Sie XML (Extensible Markup Language) verwenden, um Daten auf Webseiten darzustellen.

ThemaGeben Sie eine Übersicht über die Möglichkeiten zum Ausführen von Transact-SQL-Anweisungen.

EinstiegTransact-SQL-Anweisungen können auf verschiedene Arten ausgeführt werden.

Page 134: Programmieren Einer Microsoft SQL Server 2000-Datenbank

34 Unterrichtseinheit 2: Übersicht über die SQL Server-Programmierung

Dynamisches Erstellen von Anweisungen

� Verwenden von EXECUTE mit Zeichenfolgenliteralenund Variablen

� Verwenden, falls der Variablenwert während der Ausführungszeit zugewiesen werden muss

� Jede Variable und temporäre Tabelle bleibt nur während der Ausführung bestehen

DECLARE @dbname varchar(30), @tblname varchar(30)SET @dbname = 'Northwind'SET @tblname = 'Products'

EXECUTE('USE ' + @dbname + ' SELECT * FROM '+ @tblname)

DECLARE @dbname varchar(30), @tblname varchar(30)SET @dbname = 'Northwind'SET @tblname = 'Products'

EXECUTE('USE ' + @dbname + ' SELECT * FROM '+ @tblname)

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Sie können Anweisungen dynamisch erstellen, sodass sie zu dem Zeitpunkt erstellt werden, an dem SQL Server ein Skript ausführt.

Zum dynamischen Erstellen einer Anweisung wird die EXECUTE-Anweisung mit einer Reihe von Zeichenfolgenliteralen und Variablen verwendet, die zur Ausführungszeit aufgelöst werden.

Dynamisch erstellte Anweisungen sind hilfreich, wenn SQL Server den Wert der Variable beim Ausführen der Anweisung zuweisen soll. Sie können z. B. eine dynamische Anweisung erstellen, die für eine Reihe von Datenbankobjekten die gleiche Aktion ausführt.

EXECUTE ({@str_var | 'tsql_string'} + [{@str_var | 'tsql_string'}...]})

Optionen werden dynamisch festgelegt, und die Variablen und temporären Tabellen, die Sie dynamisch erstellen, bleiben nur für die Dauer bestehen, die SQL Server benötigt, um die Anweisung auszuführen.

Bei der EXECUTE-Anweisung sollten die folgenden Aspekte beachtet werden:

� Die EXECUTE-Anweisung führt aus Zeichenfolgen bestehende Anweisun-gen in einem Transact-SQL-Batch aus. Da es sich hierbei um Zeichen-folgenliterale handelt, müssen Sie an den entsprechenden Stellen Leer-zeichen hinzufügen, damit die Zeichenfolgen richtig verkettet werden.

� Die EXECUTE-Anweisung kann ein Zeichenfolgenliteral, eine lokale Variable oder eine Verkettung von beidem einschließen.

� Alle Elemente in der EXECUTE-Zeichenfolge müssen aus Zeichendaten bestehen, und Sie müssen alle numerischen Daten konvertieren, bevor Sie die EXECUTE-Anweisung verwenden.

� Sie können zum Erstellen der Zeichenfolge für die Ausführung keine Funk-tionen verwenden.

ThemaErläutern Sie den Kursteil-nehmern die dynamische Ausführung von Anwei-sungen.

EinstiegSie können Anweisungen dynamisch erstellen, sodass sie zu dem Zeitpunkt erstellt werden, an dem SQL Server ein Skript ausführt.

Syntax

Page 135: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 2: Übersicht über die SQL Server-Programmierung 35

� Sie können alle gültigen Transact-SQL-Anweisungen dynamisch erstellen, dies gilt auch für Funktionen.

� EXECUTE-Anweisungen können geschachtelt werden.

Dieses Beispiel zeigt, wie Sie eine dynamisch ausgeführte Anweisung ver-wenden können, um einen anderen Datenbankkontext anzugeben als den, in dem Sie sich gerade befinden, und wie Sie anschließend mit der Anweisung alle Spalten und Zeilen aus einer angegebenen Tabelle auswählen In diesem Bei-spiel bleibt der Wechsel des Datenbankkontextes zur Northwind-Datenbank nur für die Dauer der Abfrage bestehen. Der aktuelle Datenbankkontext bleibt unverändert.

Mit Hilfe einer gespeicherten Prozedur kann der Benutzer die Datenbank- und Tabelleninformationen als Parameter an die Anweisung übergeben und dann eine bestimmte Tabelle in einer Datenbank abfragen.

DECLARE @dbname varchar(30), @tablename varchar(30) SET @dbname = 'Northwind' SET @tablename = 'Products'

EXECUTE ('USE ' + @dbname + ' SELECT ProductName FROM ' + @tablename)

ProductName

ChaiChangAniseed Syrup

Dieses Beispiel zeigt, wie Sie mit einer dynamisch ausgeführten Anweisung eine Datenbankoption für die Dauer der Anweisung ändern können. Die folgende Anweisung gibt die Anzahl der betroffenen Zeilen nicht zurück.

EXECUTE ('SET NOCOUNT ON '+ 'SELECT LastName, ReportsTo FROM Employees WHERE ReportsTo IS NULL')

LastName ReportsTo

Fuller NULL

Beispiel 1

Ergebnis

Beispiel 2

Ergebnis

Page 136: Programmieren Einer Microsoft SQL Server 2000-Datenbank

36 Unterrichtseinheit 2: Übersicht über die SQL Server-Programmierung

Verwenden von Batches

� Eine oder mehrere Transact-SQL-Anweisungen werden zusammen übergeben

� Definieren eines Batches mit Hilfe der GO-Anweisung

� Batchverarbeitung bei SQL Server

� Anweisungen, die nicht im selben Batch verwendet werden können

� CREATE PROCEDURE

� CREATE VIEW

� CREATE TRIGGER

� CREATE RULE

� CREATE DEFAULT

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Eine oder mehrere Anweisungen können auch in einem Batch übergeben werden.

Eine oder mehrere Transact-SQL-Anweisungen werden zusammen übergebenBatches können interaktiv oder als Teil eines Skripts ausgeführt werden. Ein Skript kann mehrere Batches mit Transact-SQL-Anweisungen einschließen.

Definieren eines Batches mit Hilfe der GO-Anweisung Verwenden Sie eine GO-Anweisung, um das Ende eines Batches anzugeben. Die GO-Anweisung ist keine allgemein gültige Transact-SQL-Anweisung, sondern wird nur von SQL Query Analyzer und dem Dienstprogramm osqlakzeptiert. Auf ODBC- oder OLE DB-APIs basierende Anwendungen erzeugen einen Syntaxfehler, wenn sie versuchen, eine GO-Anweisung auszuführen.

Batchverarbeitung bei SQL Server Die Anweisungen werden von SQL Server in einem Batch gemeinsam opti-miert, kompiliert und ausgeführt. Die Anweisungen müssen jedoch nicht als wiederherstellbare Arbeitseinheit ausgeführt werden.

Der Gültigkeitsbereich von benutzerdefinierten Variablen ist auf einen Batch beschränkt, nach einer GO-Anweisung kann daher nicht auf eine dieser Variablen verwiesen werden.

Wenn ein Syntaxfehler in einem Batch vorhanden ist, wird keine der Anweisungen in diesem Batch ausgeführt. Die Ausführung beginnt mit dem folgenden Batch.

ThemaGeben Sie den Kursteil-nehmern eine Einführung in die Verwendung von Batches.

EinstiegBei einem Batch handelt es sich um eine Gruppe von Transact-SQL-Anweisun-gen, die gemeinsam über-geben und als Gruppe ausgeführt werden.

Anmerkung

Page 137: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 2: Übersicht über die SQL Server-Programmierung 37

Anweisungen, die nicht im selben Batch verwendet werden können SQL Server muss bestimmte Anweisungen zur Objekterstellung innerhalb ihrer Batches in einem Skript ausführen, da die Objekte unterschiedlich definiert sind. Jede der im Folgenden aufgeführten Anweisungen wird definiert, indem ein Objektdefinitionsheader gefolgt von dem Schlüsselwort AS eingefügt wird (AS zeigt an, dass eine oder mehrere Anweisungen folgen). Die Objektdefini-tionen sind durch die GO-Anweisung begrenzt; SQL Server erkennt das Ende der Objektdefinition, wenn die GO-Anweisung erreicht wird.

� CREATE PROCEDURE � CREATE VIEW � CREATE TRIGGER � CREATE RULE � CREATE DEFAULT

Wenn Sie mehrere nicht kombinierbare Anweisungen verwenden möchten, müssen Sie mehrere Batches übergeben, wie das folgende Skript zeigt.

CREATE DATABASE ... CREATE TABLE ... GO

CREATE VIEW1 ... GOCREATE VIEW2 ... GO

Das folgende Beispiel zeigt einen fehlerhaften Batch. Fügen Sie eine GO-An-weisung vor jede CREATE TRIGGER-Anweisung ein, damit er ordnungs-gemäß ausgeführt wird.

CREATE DATABASE ... CREATE TABLE ... CREATE TRIGGER ... CREATE TRIGGER ... GO

Dieses Beispiel zeigt, wie Sie die Anweisungen aus Beispiel 2 gruppieren können, sodass sie ordnungsgemäß ausgeführt werden.

CREATE DATABASE ... CREATE TABLE ... GO

CREATE TRIGGER ... GO

CREATE TRIGGER ... GO

Beispiel 1

Beispiel 2

Beispiel 3

Page 138: Programmieren Einer Microsoft SQL Server 2000-Datenbank

38 Unterrichtseinheit 2: Übersicht über die SQL Server-Programmierung

Verwenden von Skripts

� Enthält gespeicherte Anweisungen

� Kann mit jedem Text-Editor geschrieben werden

� Speichern mit der Dateinamenerweiterung SQL

� Ausführen mit SQL Query Analyzer oder demDienstprogramm „osql“

� Verwenden, um Datenbankobjekte neu zu erstellen oderum Anweisungen wiederholt auszuführen

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

In den meisten Fällen werden Skripts zum Ausführen von Transact-SQL-An-weisungen verwendet. Ein Skript besteht aus einer oder mehreren Transact-SQL-Anweisungen, die als Datei gespeichert sind.

Sie können Skripts in SQL Query Analyzer oder mit einem beliebigen Text-Editor, wie z. B. Notepad, erstellen und speichern. Speichern Sie die Skriptdatei mit der Dateinamenerweiterung SQL.

Sie können die Skriptdatei in SQL Query Analyzer oder mit dem Dienst-programm osql (oder einem anderen Abfragetool) öffnen und ausführen.

Gespeicherte Skripts sind sehr hilfreich, wenn Sie Datenbanken oder Daten-objekte neu erstellen oder wenn Sie eine Gruppe von Anweisungen wiederholt ausführen müssen.

Formatieren Sie Transact-SQL-Anweisungen so, dass andere sie gut lesen können. Verwenden Sie Einzüge, um Beziehungsebenen anzuzeigen.

ThemaGeben Sie eine Einführung in die Verwendung von Skripts zum Ausführen von Transact-SQL-Anwei-sungen.

EinstiegIn den meisten Fällen wer-den Skripts zum Ausführen von Transact-SQL-Anwei-sungen verwendet.

Page 139: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 2: Übersicht über die SQL Server-Programmierung 39

Verwenden von Transaktionen

� Werden wie Batches verarbeitet

� Datenintegrität ist gewährleistet

� Änderungen in der Datenbank werden entweder zusammen ausgeführt, oder es wird ein Rollback für die Änderungen ausgeführt

BEGIN TRANSACTIONUPDATE savings SET amount = (amount - 100)WHERE custid = 78910… <Rollback transaction if error>

UPDATE checking SET amount = (amount + 100)WHERE custid = 78910… <Rollback transaction if error>

COMMIT TRANSACTION

BEGIN TRANSACTIONUPDATE savings SET amount = (amount - 100)WHERE custid = 78910… <Rollback transaction if error>

UPDATE checking SET amount = (amount + 100)WHERE custid = 78910… <Rollback transaction if error>

COMMIT TRANSACTION

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Transaktionen bestehen, ähnlich wie Batches, aus Anweisungsgruppen, die als Gruppe übergeben werden. SQL Server behandelt Transaktionen jedoch als eine einzige Arbeitseinheit, und die Transaktion ist als Ganzes erfolgreich oder schlägt als Ganzes fehl. Dadurch wird die Datenintegrität gewährleistet. Trans-aktionen können mehrere Batches umfassen.

Beginnen Sie eine Transaktion mit einer BEGIN TRANSACTION-Anweisung, und beenden Sie sie mit einer COMMIT TRANSACTION- oder ROLLBACK TRANSACTION-Anweisung.

Wird für eine Transaktion ein Commit ausgeführt, macht SQL Server die Ände-rungen an der Transaktion zu permanenten Änderungen. Wenn für eine Trans-aktion ein Rollback ausgeführt wird, stellt SQL Server für alle von der Trans-aktion betroffenen Zeilen wieder den Zustand vor Ausführung der Transaktion her.

BEGIN TRANSACTION

COMMIT / ROLLBACK TRANSACTION

ThemaGeben Sie den Kursteil-nehmern eine Einführung in die Verwendung von Transaktionen.

EinstiegTransaktionen werden wie Batches verarbeitet, es gibt jedoch einige wichtige Unterschiede…

Methodischer Hinweis Die in den Beispielen in diesem Abschnitt verwende-ten Tabellen Savings und Checking sind fiktiv.

Teilsyntax

Page 140: Programmieren Einer Microsoft SQL Server 2000-Datenbank

40 Unterrichtseinheit 2: Übersicht über die SQL Server-Programmierung

Im folgenden Beispiel werden 100 $ vom Sparkonto des Kunden mit der Num-mer 78910 abgebucht und 100 $ dem Girokonto des Kunden gutgeschrieben. Der Kunde hat 100 $ vom Sparkonto auf das Girokonto überwiesen.

BEGIN TRANSACTION UPDATE savings SET balance = (amount – 100) WHERE custid = 78910 IF @@ERROR <> 0 BEGIN RAISERROR ('Transaction not completed due to savings account problem.', 16, -1) ROLLBACK TRANSACTION END UPDATE checking SET balance = (amount + 100) WHERE custid = 78910 IF @@ERROR <> 0 BEGIN RAISERROR ('Transaction not completed due to checking account problem.', 16, -1) ROLLBACK TRANSACTION END COMMIT TRANSACTION

Beispiel

Page 141: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 2: Übersicht über die SQL Server-Programmierung 41

Verwenden von XML

� Formatieren von Daten im Client Browser

� Angeben der FOR XML AUTO-Option

� Angeben der FOR XML RAW-Option

� Identifizieren von Einschränkungen beim Verwenden der FOR XML-Klausel

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

XML ist eine Programmiersprache, die Webentwickler verwenden können, um Daten aus einer SQL Server-Datenbank auf Webseiten darzustellen.

Formatieren von Daten im Client Browser Beim Verwenden der FOR XML-Klausel in der SELECT-Anweisung gibt SQL Server Folgendes zurück:

� Das Ergebnis einer Abfrage als Zeichenfolge. � Die Attribute der Daten, z. B. Spalten- und Tabellennamen, als Tags. Ein

Client Browser kann diese Tags anschließend zum Formatieren der zurück-gegebenen Daten verwenden.

Angeben der FOR XML AUTO-Option Sie können die FOR XML AUTO-Option angeben, um Abfrageergebnisse in einem standardisierten Format zurückzugeben.

Jede Tabelle in der FROM-Klausel, für die mindestens eine Spalte in der SELECT-Klausel aufgelistet ist, wird als XML-Element dargestellt. Ein Element enthält sowohl Daten als auch Attribute, die die Daten beschreiben.

ThemaGeben Sie eine Übersicht über XML, und erläutern Sie, wie eine Abfrage wohlgeformte XML-Daten zurückgeben kann.

EinstiegXML ist eine Programmiersprache, die Webentwickler verwenden können, um Daten aus einer SQL Server-Datenbank auf Webseiten darzustellen.

Page 142: Programmieren Einer Microsoft SQL Server 2000-Datenbank

42 Unterrichtseinheit 2: Übersicht über die SQL Server-Programmierung

In diesem Beispiel werden drei Spalten aus zwei verknüpften Tabellen aus-gewählt. Beachten Sie, dass in den Ergebnissen alle Spalten in einer einzigen Textzeichenfolge zusammengefasst werden.

SELECT Orders.OrderID, Shippers.CompanyName, Orders.CustomerID FROM Orders JOIN Shippers ON Orders.shipvia = Shippers.ShipperID WHERE OrderID < 10250 FOR XML AUTO

XML_F52E2B61-18A1-11d1-B105-00805F49916B--------------------------------------------<Orders OrderID="10248" CustomerID="VINET"> <Shippers CompanyName="Federal Shipping"/> </Orders><Orders OrderID="10249" CustomerID="TOMSP"> <Shippers CompanyName="Speedy Express"/> </Orders>

SQL Server sortiert das Resultset neu und gruppiert Spalten nach Tabellennamen.

Angeben der FOR XML RAW-Option In bestimmten Fällen wünschen Webentwickler keine automatische Forma-tierung. Sie können die RAW-Option angeben, um jede einzelne Zeile im Resultset in ein XML-Element mit einer generischen Bezeichnerzeile als Element-Tag zu transformieren.

Vergleichen Sie das Ergebnis in diesem Beispiel mit dem in Beispiel 1. Dieses Beispiel gibt dieselben Daten zurück, jedoch in einer stärker generisch ausge-richteten Formatierung. Beachten Sie, dass die Tabellen keine Namen haben und die Spalten nicht nach Tabellennamen gruppiert sind.

SELECT Orders.OrderID, Shippers.CompanyName, Orders.CustomerID FROM Orders JOIN Shippers ON Orders.shipvia = Shippers.ShipperID WHERE OrderID < 10250 FOR XML RAW

XML_F52E2B61-18A1-11d1-B105-00805F49916B----------------------------------------<row OrderID="10248" CompanyName="Federal Shipping" CustomerID="VINET"/> <row OrderID="10249" CompanyName="Speedy Express" CustomerID="TOMSP"/>

Beispiel 1

Ergebnis

Anmerkung

Beispiel 2

Ergebnis

Page 143: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 2: Übersicht über die SQL Server-Programmierung 43

Identifizieren von Einschränkungen beim Verwenden der FOR XML-Klausel Eine SELECT-Anweisung mit einer FOR XML-Klausel formatiert die Ausgabe für den SQL Server-Client neu. Aufgrund dieser Änderungen können Sie eine Abfrageausgabe im XML-Format nicht als Eingabe für weitere SQL Server-Verarbeitungen verwenden.

Ausgaben im XML-Format können Sie in den folgenden Fällen nicht ver-wenden:

� Bei einer geschachtelten SELECT-Anweisung. � Bei einer SELECT INTO-Anweisung. � Bei einer COMPUTE BY-Klausel. � Bei gespeicherten Prozeduren, die in einer INSERT-Anweisung aufgerufen

werden. � Bei einer Sichtdefinition oder einer benutzerdefinierten Funktion, die ein

Rowset zurückgibt.

Page 144: Programmieren Einer Microsoft SQL Server 2000-Datenbank

44 Unterrichtseinheit 2: Übersicht über die SQL Server-Programmierung

Empfohlene Methoden

Verwenden Sie ANSI SQL-SyntaxVerwenden Sie ANSI SQL-Syntax

Behalten Sie die Geschäftslogik als gespeicherte Prozedurenauf dem ServerBehalten Sie die Geschäftslogik als gespeicherte Prozedurenauf dem Server

Speichern Sie Anweisungen als Skripts, und fügen Sieaussagekräftige Kommentare hinzuSpeichern Sie Anweisungen als Skripts, und fügen Sieaussagekräftige Kommentare hinzu

Formatieren Sie Transact-SQL-Anweisungen so, dass anderesie gut lesen könnenFormatieren Sie Transact-SQL-Anweisungen so, dass anderesie gut lesen können

Wählen Sie eine geeignete BenennungskonventionWählen Sie eine geeignete Benennungskonvention

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Die folgenden empfohlenen Methoden sollen Sie beim Erstellen fehlerfreier Skripts in Transact-SQL unterstützen:

� Behalten Sie die Geschäftslogik als gespeicherte Prozeduren auf dem Server.

� Verwenden Sie ANSI SQL-Syntax, um sicherzustellen, dass die Skripts möglichst kompatibel und übertragbar sind.

� Wählen Sie eine geeignete Benennungskonvention, und achten Sie auf Einheitlichkeit bei der Vergabe von Namen.

� Speichern Sie Anweisungen als Skripts, und fügen Sie aussagekräftige Kommentare hinzu.

� Formatieren Sie Transact-SQL-Anweisungen so, dass andere sie gut lesen können. Verwenden Sie Einzüge, um Beziehungsebenen anzuzeigen.

Zusätzliche Informationen zu den folgenden Themen erhalten Sie in der SQL Server-Onlinedokumentation.

Thema Suchbegriff

Transact-SQL-Variablen Variablen

Funktionen Funktionen

Tipps zu Transact-SQL transact-sql

Transact-SQL-Konventionen transact-sql

Empfehlungen zur SQL Syntax "SQL-Syntax"

Vorbereiten von Anweisungen "Vorbereiten von Anweisungen"

Dienstprogramm osql osql

Reservierte Schlüsselwörter Schlüsselwörter

Zwischenspeichern von Ad-hoc-Batches "OLE DB", ODBC

Verwenden von XML "SELECT (T-SQL)"

ThemaStellen Sie die empfohlenen Methoden zum Program-mieren mit Transact-SQL vor.

EinstiegIm Folgenden werden empfohlene Methoden für die Programmierung mit Transact-SQL beschrieben.

Page 145: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 2: Übersicht über die SQL Server-Programmierung 45

Übungseinheit A: Übersicht über Transact-SQL

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

LernzieleAm Ende dieser Übungseinheit werden Sie in der Lage sein, die folgenden Aufgaben auszuführen:

� Schreiben grundlegender SELECT-Anweisungen, die sortierte und einge-schränkte Resultsets zurückgeben.

� Ändern und Ausführen eines Skripts. � Ausführen eines Skripts mit dem Dienstprogramm osql.� Verwenden von Systemfunktionen zum Abrufen von Systeminformationen.

VoraussetzungenUm diese Übungseinheit zu bearbeiten, benötigen Sie Folgendes:

� Die Skriptdateien für diese Übungseinheit, die sich in C:\Moc\2328A\Labfiles\L02 befinden.

� Die Antwortdateien für diese Übungseinheit, die sich in C:\Moc\2328A\Labfiles\L02\Answers befinden.

Weitere Informationen Sollten Sie beim Ausführen von Dateien Hilfe benötigen, suchen Sie in der Hilfe von SQL Query Analyzer nach „Ausführen einer Abfrage“.

Daneben sind die folgenden Informationsquellen verfügbar:

� Das Northwind-Datenbankschema. � Die Microsoft SQL Server-Onlinedokumentation.

ThemaGeben Sie eine Einführung in die Übungseinheit.

EinstiegIn dieser Übungseinheit schreiben Sie SELECT-Anweisungen, ändern eine Skriptdatei und verwenden Systemfunktionen.

Erläutern Sie die Lernziele der Übungseinheit.

Page 146: Programmieren Einer Microsoft SQL Server 2000-Datenbank

46 Unterrichtseinheit 2: Übersicht über die SQL Server-Programmierung

SzenarioDer Aufbau des Schulungsraumes soll die Organisation des weltweit agieren-den Handelsunternehmens Northwind Traders widerspiegeln. Das Unternehmen hat den fiktiven Domänennamen nwtraders.msft. Der primäre DNS-Server für nwtraders.msft ist der Kursleitercomputer, dessen IP-Adresse (Internetproto-koll) 192.168.x.200 lautet (wobei x die zugewiesene Schulungsraumnummer ist). Der Name des Kursleitercomputers ist London.

Die folgende Tabelle stellt den Benutzernamen, den Computernamen und die IP-Adresse für jeden Kursteilnehmercomputer in der fiktiven Domäne nwtraders.msft bereit. Suchen Sie den Ihrem Computer zugewiesenen Benutzernamen und notieren Sie ihn.

Benutzername Computername IP-Adresse

SQLAdmin1 Vancouver 192.168.x.1

SQLAdmin2 Denver 192.168.x.2

SQLAdmin3 Perth 192.168.x.3

SQLAdmin4 Brisbane 192.168.x.4

SQLAdmin5 Lisbon 192.168.x.5

SQLAdmin6 Bonn 192.168.x.6

SQLAdmin7 Lima 192.168.x.7

SQLAdmin8 Santiago 192.168.x.8

SQLAdmin9 Bangalore 192.168.x.9

SQLAdmin10 Singapore 192.168.x.10

SQLAdmin11 Casablanca 192.168.x.11

SQLAdmin12 Tunis 192.168.x.12

SQLAdmin13 Acapulco 192.168.x.13

SQLAdmin14 Miami 192.168.x.14

SQLAdmin15 Auckland 192.168.x.15

SQLAdmin16 Suva 192.168.x.16

SQLAdmin17 Stockholm 192.168.x.17

SQLAdmin18 Moscow 192.168.x.18

SQLAdmin19 Caracas 192.168.x.19

SQLAdmin20 Montevideo 192.168.x.20

SQLAdmin21 Manila 192.168.x.21

SQLAdmin22 Tokyo 192.168.x.22

SQLAdmin23 Khartoum 192.168.x.23

SQLAdmin24 Nairobi 192.168.x.24

Veranschlagte Zeit für die Übungseinheit: 30 Minuten

Page 147: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 2: Übersicht über die SQL Server-Programmierung 47

Übung 1 Schreiben grundlegender SELECT-Anweisungen

In dieser Übung schreiben Sie verschiedene Anweisungen, die Zeilen aus der Products-Tabelle der Northwind-Datenbank zurückgeben.

� So schreiben Sie eine SELECT-Anweisung, die sortierte Daten zurückgibt

Mit diesem Verfahren schreiben Sie eine Anweisung, die alle Zeilen und Spal-ten aus der Products-Tabelle zurückgibt und die Ergebnisse in aufsteigender Reihenfolge nach der ProductName-Spalte sortiert. C:\Moc\2328A\Labfiles\L02\Answers\Basica.sql enthält ein vollständiges Skript für dieses Verfahren. 1. Melden Sie sich mit Hilfe der Informationen in der folgenden Tabelle an der

Schulungsraumdomäne nwtraders an.

Option Eingabe

Benutzername SQLAdminx (wobei x die Ihrem Computernamen zugewiesene Nummer ist, wie in der Schulungsraumdomäne nwtraders.msftfestgelegt)

Kennwort password

2. Öffnen Sie SQL Query Analyzer, und melden Sie sich, wenn Sie dazu aufgefordert werden, über die Windows-Authentifizierung am (lokalen) Server an. Sie sind berechtigt, sich an SQL Server anzumelden und SQL Server zu verwalten, da Sie als SQLAdminx angemeldet und damit Mitglied der lokalen Gruppe der Administratoren von Microsoft Windows 2000 sind. Alle Mitglieder dieser Gruppe werden automatisch der SQL Server-Rolle sysadmin zugeordnet.

3. Klicken Sie in der Liste DB auf Northwind.4. Schreiben Sie eine SELECT-Anweisung, die alle Zeilen und Spalten aus der

Products-Tabelle zurückgibt und die Ergebnisse in aufsteigender Reihen-folge nach der ProductName-Spalte sortiert. Sie können die gespeicherte Systemprozedur sp_help in der Products-Tabelle ausführen, um die korrekten Spaltennamen abzufragen. SELECT * FROM Products ORDER BY ProductName

Page 148: Programmieren Einer Microsoft SQL Server 2000-Datenbank

48 Unterrichtseinheit 2: Übersicht über die SQL Server-Programmierung

� So schreiben Sie eine SELECT-Anweisung, die eingeschränkte Daten zurückgibt

In diesem Verfahren schreiben Sie eine Anweisung, die Produkte aus einer be-stimmten Kategorie abruft. • Schreiben Sie eine SELECT-Anweisung, die alle Produkte in der Kategorie

(CategoryID) 4 aus der Products-Tabelle abruft. Sie können die gespeicherte Systemprozedur sp_help in der Products-Tabelle ausführen, um die korrekten Spaltennamen abzufragen. SELECT * FROM Products WHERE CategoryID = 4

Weitere Informationen zur SELECT-Anweisung (und allen Transact-SQL-Anweisungen und Systemtabellen) erhalten Sie, indem Sie im Abfrage-fenster das Schlüsselwort SELECT auswählen und dann die Tastenkombination UMSCHALT+F1 zum Öffnen der SQL Server-Onlinedokumentation drücken. Doppelklicken Sie unter SELECT auf den Untereintrag Klausel.

Tipp

Page 149: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 2: Übersicht über die SQL Server-Programmierung 49

Übung 2 Ändern einer Skriptdatei

In dieser Übung ändern und speichern Sie eine einfache Skriptdatei und führen sie dann aus.

� So ändern Sie eine Skriptdatei In diesem Verfahren führen Sie ein Skript aus, das Fehler enthält. Mit Hilfe der von SQL Server zurückgegebenen Fehlerinformationen führen Sie Änderungen am Skript durch, sodass es ordnungsgemäß ausgeführt wird. Danach speichern Sie das Skript und führen es aus. 1. Öffnen Sie C:\Moc\2328A\Labfiles\L02\Sample_Script.sql, überprüfen

Sie die Datei, und führen Sie sie dann aus. Beim Ausführen dieser Datei erhalten Sie Fehlermeldungen. Diese Fehler wurden absichtlich eingebaut. C:\Moc\2328A\Labfiles\L02\Answers\Sample_Script.sql enthält ein vollständiges Skript für dieses Verfahren.

2. Fügen Sie Kommentarzeichen vor dem Skriptnamen und der Beschreibung ein, damit sie nicht ausgeführt werden. /*** Sample_Script.sql**** Dieses Skript erstellt die Sample1-Tabelle und die ** Sample_View-Sicht. Nachdem die Objekte erstellt sind, ** werden fünf Zeilen in die Sample1-Tabelle eingefügt ** und dann abgefragt. ** Dieses Skript sollte in der Northwind-Datenbank ** ausgeführt werden. ***/

3. Fügen Sie eine Anweisung hinzu, die angibt, dass das Skript im Kontext der Northwind-Datenbank ausgeführt wird. USE Northwind

4. Schließen Sie Markierungen für das Ende des Batches (GO-Anweisungen) an den richtigen Stellen innerhalb des Skripts ein. Es sind nur zwei zusätz-liche Batchmarkierungen erforderlich. GOCREATE VIEW Sample_View AS SELECT cust_no, lname FROM Sample1 GO

5. Speichern Sie das Skript, und führen Sie es dann aus.

Page 150: Programmieren Einer Microsoft SQL Server 2000-Datenbank

50 Unterrichtseinheit 2: Übersicht über die SQL Server-Programmierung

� So führen Sie eine Skriptdatei mit Hilfe des Dienstprogramms „osql“ aus

In diesem Verfahren führen Sie eine Skriptdatei mit Hilfe des Dienstprogramms osql aus.

1. Öffnen Sie ein Fenster mit einer Eingabeaufforderung. 2. Geben Sie den folgenden Befehl ein, um

C:\Moc\2328A\Labfiles\L02\Sample_Script2.sql auszuführen. Überprüfen Sie, ob der Pfad richtig ist. osql /E /i "c:\moc\2328A\labfiles\L02\Sample_Script2.sql"

Schreiben Sie den Befehl in eine einzige Zeile. Anmerkung

Page 151: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 2: Übersicht über die SQL Server-Programmierung 51

Übung 3 Verwenden von Systemfunktionen

In dieser Übung sammeln Sie Systeminformationen mit Hilfe von Systemfunk-tionen.

� So ermitteln Sie die Serverprozess-ID In diesem Verfahren beobachten Sie die aktuelle Serveraktivität und ermitteln die Aktivität, die durch Ihre Sitzung generiert wird.

1. Führen Sie die gespeicherte Systemprozedur sp_who aus. SQL Server zeigt alle Aktivitäten auf dem Server an.

2. Um zu ermitteln, welche Aktivität Ihre ist, können Sie die folgende Anwei-sung ausführen: SELECT @@spid

SQL Server gibt die Serverprozess-ID (SPID) Ihres Prozesses in den Ergebnissen zurück.

3. Führen Sie die gespeicherte Systemprozedur sp_who erneut aus, wobei Sie Ihre SPID als zusätzlichen Parameter verwenden. (In der folgenden Anwei-sung steht n für Ihre SPID.) EXEC sp_who n

SQL Server zeigt die Aktivität für Ihre Serverprozess-ID an.

� So rufen Sie Umgebungsinformationen ab Mit diesem Verfahren ermitteln Sie, welche Version von SQL Server ausge-führt wird, und Sie rufen Informationen über die Verbindung, den Datenbank-kontext und den Server ab. Sie führen diese Aufgaben mit Hilfe von System-funktionen aus. 1. Führen Sie die folgende Anweisung aus:

SELECT @@version

2. Führen Sie die folgende Anweisung aus: SELECT USER_NAME(), DB_NAME(), @@servername

Page 152: Programmieren Einer Microsoft SQL Server 2000-Datenbank

52 Unterrichtseinheit 2: Übersicht über die SQL Server-Programmierung

� So rufen Sie Metadaten ab In diesem Verfahren führen Sie mehrere Abfragen aus, die Metadaten von be-stimmten Datenbankobjekten zurückgeben, indem Informationsschemasichten verwendet werden. Zur Erinnerung: INFORMATION_SCHEMA ist ein vordefinierter Datenbankbenutzer, der alle Informationsschemasichten besitzt. 1. Führen Sie die folgende Anweisung aus, um eine Liste aller benutzerdefi-

nierten Tabellen einer Datenbank zurückzugeben: USE Northwind SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE'

2. Führen Sie die folgende Anweisung aus, um die Primärschlüssel- und Fremdschlüsselspalten für die Orders-Tabelle zurückzugeben: SELECT * FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE WHERE TABLE_NAME = 'Orders'

Für welche Spalte ist ein Primärschlüssel definiert? OrderID ____________________________________________________________

____________________________________________________________

Page 153: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 2: Übersicht über die SQL Server-Programmierung 53

Lernzielkontrolle

� Entwerfen der Anwendungsarchitektur einer Organisation

� SQL Server-Programmierungstools

� Transact-SQL (Programmiersprache)

� Elemente von Transact-SQL

� Zusätzliche Sprachelemente

� Möglichkeiten zum Ausführen von Transact-SQL-Anweisungen

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

1. Sie entwerfen eine Mehrschichtenanwendung mit einer Webschnittstelle. Diese Anwendung muss regelmäßig eine Datenbanktabelle aktualisieren. Wie und wo sollten Sie die Logik zum Ausführen der Aktualisierung implementieren? Sie erreichen voraussichtlich die bestmögliche Leistung, wenn Sie eine gespeicherte Prozedur zum Ausführen der Aktualisierung auf dem SQL Server erstellen. Sie rufen diese gespeicherte Prozedur von einer Komponente der mittleren Schicht auf.

2. Erläutern Sie den Unterschied zwischen einem Batch und einem Skript. Ein Batch ist eine Gruppe von Transact-SQL-Anweisungen, die zusammen übergeben, auf Syntaxfehler überprüft und als Gruppe ausgeführt werden. Ein Skript ist eine Gruppe von Transact-SQL-Anweisungen, die als Datei gespeichert ist.

ThemaVertiefen Sie die Lernziele dieser Unterrichtseinheit, indem Sie die Kernpunkte wiederholen.

EinstiegDie Fragen zur Lernziel-kontrolle beziehen sich auf einige der Schlüsselkon-zepte, die Inhalt dieser Unterrichtseinheit sind.

Page 154: Programmieren Einer Microsoft SQL Server 2000-Datenbank

54 Unterrichtseinheit 2: Übersicht über die SQL Server-Programmierung

3. Welche Vorteile hat eine Transaktion gegenüber einem Batch oder einem Skript? Eine Transaktion wird als eine einzelne Arbeitseinheit ausgeführt. Bei einem Transaktionsfehler kann für die Transaktion als Einheit ein Rollback ausgeführt werden, sodass die Daten in einem konsistenten Zustand bleiben.

4. Wenn Sie Bedingungslogik in ein Skript einschließen möchten, welche Art von Sprachelement können Sie verwenden? Geben Sie möglichst viele Beispiele für die Schlüsselwörter von Sprachelementen an. Schlüsselwörter für die Ablaufsteuerung. Beispiele sind BEGIN...END, IF...ELSE, RETURN, WHILE, BREAK und CONTINUE.

Page 155: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Inhalt

Übersicht 1

Erstellen von Datenbanken 2

Erstellen von Dateigruppen 11

Verwalten von Datenbanken 14

Einführung in Datenstrukturen 25

Empfohlene Methoden 32

Übungseinheit A: Erstellen und Verwalten von Datenbanken 33

Lernzielkontrolle 39

Unterrichtseinheit 3: Erstellen und Verwalten von Datenbanken

Page 156: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Die in diesen Unterlagen enthaltenen Angaben und Daten können ohne vorherige Ankündigung geändert werden. Die in diesen Unterlagen genannten Firmen, Produkte, Menschen, Charaktere und/oder Daten sind frei erfunden und sollen keine wirklichen Individuen, Gesellschaften, Produkte oder Veranstaltungen darstellen, soweit nichts anderes angegeben ist. Die Benutzer/innen sind verpflichtet, sich an alle anwendbaren Urheberrechtsgesetze zu halten. Ohne ausdrückliche schriftliche Erlaubnis der Microsoft Corporation darf kein Teil dieser Unterlagen für irgendwelche Zwecke vervielfältigt oder übertragen werden, unabhängig davon, auf welche Art und Weise oder mit welchen Mitteln, elektronisch oder mechanisch, dies geschieht. Wenn auf dieses Dokument nur auf elektronischem Wege zugegriffen werden kann, sind Sie hiermit berechtigt, eine (1) Kopie zum persönlichen Gebrauch auszudrucken.

Microsoft Corporation kann Inhaber von Patenten oder Patentanträgen, Marken, Urheberrechten oder anderen gewerblichen Schutzrechten sein, die den Inhalt dieses Dokuments betreffen. Die Bereitstellung dieses Dokuments gewährt keinerlei Lizenzrechte an diesen Patenten, Marken, Urheberrechten oder anderen gewerblichen Schutzrechten, es sei denn, dies wurde ausdrücklich durch einen schriftlichen Lizenzvertrag mit der Microsoft Corporation vereinbart.

2000 Microsoft Corporation. Alle Rechte vorbehalten.

Microsoft, ActiveX, BackOffice, MS-DOS, PowerPoint, Visual Basic, Visual C++, Visual Studio, Windows und Windows NT sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern.

Andere in diesem Dokument aufgeführte Produkt- und Firmennamen sind möglicherweise Marken der jeweiligen Eigentümer.

Project Lead: Rich Rose Instructional Designers: Rich Rose, Cheryl Hoople, Marilyn McGill Instructional Software Design Engineers: Karl Dehmer, Carl Raebler, Rick Byham Technical Lead: Karl Dehmer Subject Matter Experts: Karl Dehmer, Carl Raebler, Rick Byham Graphic Artist: Kirsten Larson (Independent Contractor) Editing Manager: Lynette Skinner Editor: Wendy Cleary Copy Editor: Edward McKillop (S&T Consulting) Production Manager: Miracle Davis Production Coordinator: Jenny Boe Production Support: Lori Walker (S&T Consulting) Test Manager: Sid Benavente Courseware Testing: TestingTesting123 Classroom Automation: Lorrin Smith-Bates Creative Director, Media/Sim Services: David Mahlmann Web Development Lead: Lisa Pease CD Build Specialist: Julie Challenger Online Support: David Myka (S&T Consulting) Localization Manager: Rick Terek Operations Coordinator: John Williams Manufacturing Support: Laura King; Kathy Hershey Lead Product Manager, Release Management: Bo Galford Lead Product Manager, Data Base: Margo Crandall Group Manager, Courseware Infrastructure: David Bramble Group Product Manager, Content Development: Dean Murray General Manager: Robert Stewart

Page 157: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 3: Erstellen und Verwalten von Datenbanken iii

Hinweise für den Kursleiter Diese Unterrichtseinheit gibt den Kursteilnehmern eine Beschreibung, wie eine Datenbank erstellt wird, wie Datenbankoptionen festgelegt und Dateigruppen erstellt werden und wie eine Datenbank und das Transaktionsprotokoll ver-waltet werden. Weiter wird behandelt, wie Speicherplatz reserviert wird und wie das Transaktionsprotokoll Datenänderungen aufzeichnet.

Dieser Kurs basiert auf der Northwind-Datenbank. Das Schema für die Northwind-Datenbank befindet sich in Anhang A. In den Übungs-einheiten wird eine vergleichbare Version der Northwind-Datenbank mit dem Namen ClassNorthwind verwendet.

In der Übungseinheit definieren die Kursteilnehmer die ClassNorthwind-Datenbank, ändern sie, und legen dann eine Option fest, um das Transaktions-protokoll zu löschen.

Am Ende dieser Unterrichtseinheit werden die Kursteilnehmer in der Lage sein, die folgenden Aufgaben auszuführen:

� Erstellen einer Datenbank. � Erstellen einer Dateigruppe. � Verwalten einer Datenbank. � Beschreiben von Datenstrukturen.

Unterlagen und Vorbereitung In diesem Abschnitt werden die erforderlichen Unterlagen und vorbereitenden Aufgaben erläutert, die nötig sind, um diese Unterrichtseinheit zu unterrichten.

Erforderliche Unterlagen Um diese Unterrichtseinheit zu unterrichten, benötigen Sie folgende Unterlagen:

� Die Microsoft® PowerPoint®-Datei 2328A_03.ppt� Die Beispieldatei C:\Moc\2328A\Demo\D03_Ex.sql, die alle Beispiel-

skripts der Unterrichtseinheit enthält, soweit in der Unterrichtseinheit nichts anderes angegeben ist.

Vorbereitende Aufgaben Zur Vorbereitung dieser Unterrichtseinheit gehen Sie folgendermaßen vor:

� Lesen Sie alle Unterlagen für diese Unterrichtseinheit. � Arbeiten Sie die Übungseinheit durch. � Machen Sie sich mit der Vorführung der animierten Folien vertraut.

Präsentation:30 Minuten

Übungseinheit:30 Minuten

Anmerkung

Page 158: Programmieren Einer Microsoft SQL Server 2000-Datenbank

iv Unterrichtseinheit 3: Erstellen und Verwalten von Datenbanken

Sonstige Aktivitäten In diesem Abschnitt werden Verfahren bereitgestellt, mit denen interaktive Aktivitäten zum Anzeigen und Überprüfen von Informationen implementiert werden, wie Spiele oder Übungen mit Rollenspielen.

Anzeigen der PowerPoint-Animationen Alle Animationen sind durch ein Hyperlinksymbol in der unteren linken Ecke der Folie gekennzeichnet.

� So zeigen Sie die Folie „Arbeitsweise des Transaktionsprotokolls“ an 1. Zeigen Sie die Folie mit dem Thema an, die den ersten Schritt anzeigt, bei

dem die Anwendung die Datenänderung initiiert. 2. Fahren Sie mit der nächsten Animation fort, in der der nächste Schritt zeigt,

wie betroffene Datenseiten von der Festplatte in den Arbeitsspeicher (den so genannten Puffercache) geladen werden. Erklären Sie, dass betroffene Datenseiten von der Festplatte in den Arbeits-speicher geladen werden, sofern sich die Seiten nicht aufgrund einer früheren Abfrage bereits im Puffercache befinden.

3. Fahren Sie mit der nächsten Animation fort, in der jede Datenänderung bei ihrer Durchführung im Protokoll aufgezeichnet wird. Erklären Sie, dass die Änderung immer zuerst im Transaktionsprotokoll auf-gezeichnet und auf der Festplatte gespeichert wird, bevor sie anschließend in der Datenbank vorgenommen wird. Weisen Sie darauf hin, dass diese Art des Protokolls als Write-Ahead-Protokoll (Vorausschreiben-Protokoll) bezeichnet wird.

4. Fahren Sie mit der nächsten Animation fort, in der der nächste Schritt den Prüfpunktprozess zeigt, bei dem alle abgeschlossenen Transaktionen in die Datenbank auf Festplatte gespeichert werden Erklären Sie, dass dieser Vorgang regelmäßig wiederholt wird.

� So zeigen Sie die Folie „Seiten für die Tabellen- und Index-verfolgung“ an

Diese Animation zeigt, wie Microsoft SQL Server™ 2000 beim Erstellen einer Tabelle Seiten zuweist.

1. Zeigen Sie die Folie mit dem Thema an, und weisen Sie darauf hin, dass zwei gemischte Blöcke und zwei einheitliche Blöcke vorhanden sind.

2. Fahren Sie mit der nächsten Animation fort, in der die IAM-Seite (Index Allocation Map, Indexreservierungstabelle) und eine Datenseite erstellt werden. Erklären Sie kurz, dass die IAM-Seite einen Verweis auf die Datenseite enthält.

3. Fahren Sie mit der nächsten Animation fort, in der weitere sieben Daten-seiten zugewiesen werden. Erklären Sie kurz, dass die IAM-Seite auch einen Verweis auf diese sieben Datenseiten enthält.

4. Fahren Sie mit der nächsten Animation fort, in der ein einheitlicher Block zugewiesen wird. Schließen Sie mit der Erklärung ab, dass von diesem Zeit-punkt an nur einheitliche Blöcke zugewiesen werden und dass die IAM-Seite eine Bitmap enthält, die jeden Block identifiziert.

Page 159: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 3: Erstellen und Verwalten von Datenbanken v

Strategie für die Unterrichtseinheit Verwenden Sie die folgende Strategie, um diese Unterrichtseinheit zu präsentieren:

� Erstellen von Datenbanken Beschreiben Sie den Vorgang des Erstellens einer Datenbank. Erläutern Sie, wie Datenbankoptionen festgelegt werden. Gehen Sie die gespeicherten Systemprozeduren durch, die Informationen über Datenbankoptionen anzeigen.

� Erstellen von Dateigruppen Geben Sie eine Übersicht über das Konzept der Dateigruppen. Beschreiben Sie, welche Dateigruppentypen es gibt und wie die Größe der Standarddatei-gruppe festgelegt wird. Gehen Sie die gespeicherten Systemprozeduren durch, die Informationen über Dateigruppen anzeigen.

� Verwalten von Datenbanken Beschreiben und vergleichen Sie drei Methoden zum Überwachen der Größe von Daten- und Protokolldateien: Konfigurieren der Dateien, sodass sie automatisch vergrößert werden, Manuelles Vergrößern der Dateigröße und Hinzufügen von sekundären Dateien. Erläutern Sie, wie eine Datenbank verkleinert und gelöscht wird.

� Einführung in Datenstrukturen Geben Sie den Kursteilnehmern eine Einführung in Seiten und Blöcke. Weisen Sie darauf hin, dass Daten in Blöcken verwaltet werden, und dass es gemischte Blöcke gibt, damit kleine Tabellen effizient verwaltet werden können. Erläutern Sie die verschiedenen Seitentypen, ohne die Diskussion zu sehr zu vertiefen.

AnpassungsinformationenDieser Abschnitt beschreibt die Anforderungen zum Einrichten der Übungs-einheiten für eine Unterrichtseinheit sowie die Konfigurationsänderungen, die während der Übungseinheiten an den Kursteilnehmercomputern vorgenommen werden. Diese Informationen sollen Ihnen beim Replizieren oder Anpassen der Microsoft Official Curriculum-Courseware (MOC) helfen.

Die Übungseinheit in dieser Unterrichtseinheit hängt auch von der Schulungsraumkonfiguration ab, die im Abschnitt „Anpassungsinformationen“ am Ende des Dokuments Handbuch für das Einrichten von Schulungs-computern für Kurs 2328A, Programmieren einer Microsoft SQL Server 2000-Datenbank, angegeben ist.

Einrichten der Übungseinheit Für das Einrichten der Übungseinheit gibt es keine Anforderungen, die die Replikation oder die Anpassung betreffen.

Ergebnisse der Übungseinheit Auf den Kursteilnehmercomputern gibt es keine Konfigurationsänderungen, die die Replikation oder die Anpassung betreffen.

Wichtig

Page 160: Programmieren Einer Microsoft SQL Server 2000-Datenbank

vi Unterrichtseinheit 3: Erstellen und Verwalten von Datenbanken

Page 161: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 3: Erstellen und Verwalten von Datenbanken 1

Übersicht

� Erstellen von Datenbanken

� Erstellen von Dateigruppen

� Verwalten von Datenbanken

� Einführung in Datenstrukturen

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Diese Unterrichtseinheit beschreibt, wie eine Datenbank erstellt wird, wie Datenbankoptionen festgelegt und Dateigruppen erstellt werden und wie eine Datenbank und das Transaktionsprotokoll verwaltet werden. Es wird darüber hinaus beschrieben, wie Microsoft® SQL Server™ 2000 Daten speichert.

Am Ende dieser Unterrichtseinheit werden Sie in der Lage sein, die folgenden Aufgaben auszuführen:

� Erstellen einer Datenbank. � Erstellen einer Dateigruppe. � Verwalten einer Datenbank. � Beschreiben von Datenstrukturen.

ThemaGeben Sie eine Übersicht über die Themen und Lern-ziele dieser Unterrichts-einheit.

EinstiegIn dieser Unterrichtseinheit lernen Sie, wie Daten-banken und Dateigruppen erstellt werden, und wie SQL Server Daten speichert.

Page 162: Programmieren Einer Microsoft SQL Server 2000-Datenbank

2 Unterrichtseinheit 3: Erstellen und Verwalten von Datenbanken

���� Erstellen von Datenbanken

� Definieren von Datenbanken

� Arbeitsweise des Transaktionsprotokolls

� Festlegen von Datenbankoptionen

� Abrufen von Datenbankinformationen

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Dieser Abschnitt beschreibt, wie Datenbanken erstellt, Datenbankoptionen festgelegt und Datenbankinformationen abgerufen werden. Er beschreibt darüber hinaus die Arbeitsweise des Transaktionsprotokolls.

ThemaErläutern Sie, wie eine Datenbank erstellt wird.

EinstiegDieser Abschnitt beschreibt, wie Datenbanken erstellt werden.

Page 163: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 3: Erstellen und Verwalten von Datenbanken 3

Definieren von Datenbanken

CREATE DATABASE SampleON

PRIMARY ( NAME=SampleData, FILENAME='c:\Programme\..\..\Data\Sample.mdf', SIZE=10MB,MAXSIZE=15MB,FILEGROWTH=20%)

LOG ON ( NAME=SampleLog, FILENAME= 'c:\Programme\..\..\Data\Sample.ldf', SIZE=3MB,MAXSIZE=5MB,FILEGROWTH=1MB)

COLLATE SQL_Latin1_General_Cp1_CI_AS

CREATE DATABASE SampleON

PRIMARY ( NAME=SampleData, FILENAME='c:\Programme\..\..\Data\Sample.mdf', SIZE=10MB,MAXSIZE=15MB,FILEGROWTH=20%)

LOG ON ( NAME=SampleLog, FILENAME= 'c:\Programme\..\..\Data\Sample.ldf', SIZE=3MB,MAXSIZE=5MB,FILEGROWTH=1MB)

COLLATE SQL_Latin1_General_Cp1_CI_AS

� Beim Erstellen einer Datenbank wird Folgendes definiert: � Der Name der Datenbank� Die Größe der Datenbank� Die Dateien, in denen sich die Datenbank befindet

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Sie können eine Datenbank definieren, indem Sie SQL Server Enterprise Manager oder die Transact-SQL-Anweisung CREATE DATABASE in SQL Query Analyzer verwenden. Beim Definieren einer Datenbank wird ebenfalls ein Transaktionsprotokoll für diese Datenbank angelegt.

Informationen zu den einzelnen Datenbanken von SQL Server sind in der sysdatabases-Tabelle der master-Datenbank gespeichert. Sie müssen daher, wenn Sie eine Datenbank mit Transact-SQL definieren, die master-Datenbank verwenden.

Zur Definition einer Datenbank muss der Name der Datenbank angegeben und die Größe sowie der Speicherort der Datenbankdateien festgelegt werden. Die neue Datenbank ist nach ihrer Erstellung zunächst ein Duplikat der model-Datenbank. Sämtliche Optionen und Einstellungen der model-Datenbank werden in die neue Datenbank kopiert.

Sie sollten die master-Datenbank nach dem Erstellen, Ändern oder Löschen einer Datenbank stets sichern.

ThemaErläutern Sie, wie eine Datenbank definiert wird.

EinstiegSie können eine Datenbank definieren, indem Sie SQL Server Enterprise Manager verwenden oder Transact-SQL-Anweisungen ausführen.

Methodischer Hinweis Führen Sie die zwei Ver-fahren der Datenbank-definition mit Hilfe von SQL Server Enterprise Manager vor.

Wichtig

Page 164: Programmieren Einer Microsoft SQL Server 2000-Datenbank

4 Unterrichtseinheit 3: Erstellen und Verwalten von Datenbanken

CREATE DATABASE database_name[ON { [PRIMARY] (NAME = logical_file_name, FILENAME = 'os_file_name' [, SIZE = size] [, MAXSIZE = {max_sizeUNLIMITED}] [, FILEGROWTH = growth_increment] ) } [,...n]][LOG ON { ( NAME = logical_file_name, FILENAME = 'os_file_name' [, SIZE = size] [, MAXSIZE = {max_sizeUNLIMITED}] [, FILEGROWTH = growth_increment] ) } [,...n]][COLLATE collation_name]

Bei der Datenbankerstellung können Sie die folgenden Parameter festlegen:

Mit diesem Parameter werden die Dateien in der primären Datei-gruppe angegeben. Die primäre Dateigruppe enthält alle Systemtabellen der Datenbank. Außerdem enthält sie alle Objekte, die nicht Benutzerdateigruppen zugewiesen sind. Jede Datenbank verfügt über eine primäre Datendatei. Die primäre Datendatei bildet den Ausgangspunkt der Datenbank und zeigt auf die übrigen Dateien in der Datenbank. Die empfohlene Dateinamenerweiterung für primäre Datendateien ist MDF. Wenn Sie das Schlüsselwort PRIMARY nicht angeben, ist die erste in der Anweisung aufgeführte Datei automatisch die primäre Datei.

Mit diesem Parameter werden der Betriebssystem-Dateiname und der Pfad für die Datei angegeben. Der Pfad von os_file_name muss einen Ordner auf dem Server enthalten, auf dem SQL Server installiert ist.

Mit diesem Parameter wird die Größe der Daten- oder Protokolldatei angegeben. Größenangaben sind sowohl in MB (Standardwert) als auch in KB möglich. Die Mindestgröße für die Daten- bzw. die Protokolldatei beträgt 512 KB. Die für die primäre Datendatei angegebene Größe darf nicht unter der Größe der Primärdatei der model-Datenbank liegen. Wenn eine Daten- oder Protokolldatei hinzugefügt wird, beträgt der Standardwert 1 MB.

Mit diesem Parameter wird die maximale Größe angegeben, die die Datei annehmen darf. Größenangaben sind sowohl in MB (Standard) als auch in KB möglich. Wenn Sie keine Größe angeben, kann die Dateigröße so weit zu-nehmen, bis der Datenträger voll ist.

Mit diesem Parameter wird die Schrittweite für die Ver-größerung der Datei angegeben. Die FILEGROWTH-Einstellung für eine Datei darf die MAXSIZE-Einstellung nicht überschreiten. Durch den Wert 0 wird an-gezeigt, dass die Datei nicht vergrößert wird. Der Wert kann in MB (Standard), in KB oder als ein Prozentsatz (%) angegeben werden. Der Standardwert, wenn FILEGROWTH nicht definiert wird, beträgt 10 %, und der Minimalwert beträgt 64 KB (ein Block). Die angegebene Größe wird auf die nächsten 64 KB auf- bzw. abgerundet.

Syntax

PRIMARY

FILENAME

SIZE

MAXSIZE

Zum Festlegen der Datei-vergrößerung gibt es drei Möglichkeiten: in MB, in KB oder mit einem Prozentsatz. Der Prozentsatz bezieht sich nur auf die Dateiver-größerung, nicht auf die maximale Größe.

FILEGROWTH

Page 165: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 3: Erstellen und Verwalten von Datenbanken 5

Dieser Parameter gibt die Standardsortierung für die Datenbank an. Die Regeln der Sortierung schließen ein, welche Zeichen für eine Sprache oder ein Alphabet verwendet werden.

Im folgenden Beispiel wird eine Datenbank mit dem Namen Sample mit einer 10 MB großen primären Datendatei und einer 3 MB großen Protokolldatei in einer Standardinstanz von SQL Server erstellt.

CREATE DATABASE Sample ON PRIMARY ( NAME=SampleData, FILENAME='c:\Programme\ Microsoft SQL Server\MSSQL\Data\Sample.mdf', SIZE=10MB, MAXSIZE=15MB, FILEGROWTH=20%)LOG ON ( NAME=SampleLog, FILENAME='c:\Programme\ Microsoft SQL Server\MSSQL\Data\Sample.ldf', SIZE=3MB, MAXSIZE=5MB, FILEGROWTH=1MB) COLLATE SQL_Latin1_General_Cp1_CI_AS

COLLATION

Beispiel

Methodischer Hinweis Weisen Sie darauf hin, dass der Dateipfad variiert, wenn anstelle der Standardinstanz von SQL Server eine be-nannte Instanz verwendet wird.

Page 166: Programmieren Einer Microsoft SQL Server 2000-Datenbank

6 Unterrichtseinheit 3: Erstellen und Verwalten von Datenbanken

Arbeitsweise des Transaktionsprotokolls

Datenträger

Die Änderung wird im Transaktionsprotokoll auf dem Datenträger gespeichert

Die Änderung wird im Transaktionsprotokoll auf dem Datenträger gespeichert

333

Die Datenseiten werden im Puffercache gesucht oder in diesen eingelesen und geändert

Die Datenseiten werden im Puffercache gesucht oder in diesen eingelesen und geändert

222

Puffercache

Datenträger

Prüfpunkt schreibt die ausgeführtenTransaktionen in die Datenbank

Prüfpunkt schreibt die ausgeführtenTransaktionen in die Datenbank

444

Die Anwendung initiierteine Datenänderung

Die Anwendung initiierteine Datenänderung

111

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

SQL Server zeichnet jede Transaktion in einem Transaktionsprotokoll auf, um die Datenbankkonsistenz aufrecht zu erhalten und die Wiederherstellung zu unterstützen. Das Protokoll ist ein Speicherbereich, in dem Datenbankänderun-gen automatisch nachverfolgt werden. SQL Server zeichnet Änderungen im Protokoll auf dem Datenträger bei ihrer Durchführung auf, also bevor sie in die Datenbank geschrieben werden.

Die Protokollierung wird in folgenden Schritten durchgeführt:

1. Die Anwendung initiiert eine Datenänderung. 2. Wenn eine Änderung ausgeführt wird, werden die betroffenen Datenseiten

von der Festplatte in den Puffercache geladen, sofern sich die Seiten nicht aufgrund einer früheren Abfrage bereits im Puffercache befinden.

3. Jede Datenänderung wird bei ihrer Durchführung im Protokoll aufgezeich-net. Die Änderung wird immer zuerst in das Protokoll aufgenommen und auf dem Datenträger gespeichert, bevor sie anschließend in der Datenbank vorgenommen wird. Diese Art des Protokolls wird als Write-Ahead-Proto-koll (Vorausschreiben-Protokoll) bezeichnet.

4. Alle abgeschlossenen Transaktionen werden vom immer wiederkehrenden Prüfpunktprozess in der Datenbank auf dem Datenträger gespeichert.

Bei einem Systemfehler sorgt das automatische Wiederherstellungsverfahren mit Hilfe des Transaktionsprotokolls dafür, dass für alle Transaktionen, für die ein Commit ausgeführt wurde, ein Rollforward und für unvollständige Transaktionen ein Rollback durchgeführt wird.

Mit Hilfe von Transaktionsmarkierungen im Protokoll werden während der automatischen Wiederherstellung Anfang und Ende einer Transaktion ermittelt. Eine Transaktion gilt als abgeschlossen, wenn für die BEGIN TRANSACTION-Markierung eine entsprechende COMMIT TRANSACTION-Markierung vorhanden ist. Bei Auftreten eines Prüfpunkts werden die Datenseiten auf den Datenträger geschrieben.

ThemaBeschreiben Sie, wie das Transaktionsprotokoll arbeitet.

EinstiegDas Transaktionsprotokoll zeichnet Datenänderungen bei ihrer Durchführung auf.

Methodischer Hinweis Diese Folie enthält Animationen. Im Abschnitt „Hinweise für den Kursleiter“ finden Sie Informationen zum Navigieren durch diese Folie.

Page 167: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 3: Erstellen und Verwalten von Datenbanken 7

Festlegen von Datenbankoptionen

� Festlegen von Datenbankoptionen durchVerwenden von:

� SQL Server Enterprise Manager

� ALTER DATABASE-Anweisung

� Kategorien der Datenbankoptionen:

� Automatische Optionen

� Cursoroptionen

� Wiederherstellungsoptionen

� SQL-Optionen

� Statusoptionen

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Nachdem Sie eine Datenbank erstellt haben, können Sie die Datenbankoptionen mit SQL Server Enterprise Manager oder der ALTER DATABASE-Anweisung festlegen.

Sie können zwar mehrere Datenbankoptionen gleichzeitig konfigurieren, dies ist aber immer nur für jeweils eine Datenbank möglich. Um Optionen für sämt-liche neue Datenbanken zu ändern, müssen Sie die model-Datenbank bearbeiten.

In der folgenden Tabelle sind einige der häufiger verwendeten Optionen auf-geführt.

Kategorie der Datenbankoption Datenbankoption Beschreibung

Automatische Optionen

AUTO_CREATE_STATISTICS Erstellt automatisch fehlende Statistiken, die eine Abfrage für die Optimierung benötigt. Die Standard-einstellung ist ON.

AUTO_UPDATE_STATISTICS Aktualisiert automatisch veraltete Statistiken, die eine Abfrage für die Optimierung benötigt. Die Standardeinstellung ist ON.

Cursoroptionen CURSOR_CLOSE_ON_COMMIT Schließt automatisch geöffnete Cursor, wenn ein Commit für die Transaktion ausgeführt wird. Die Standardeinstellung ist OFF, wobei die Cursor geöffnet bleiben.

CURSOR_DEFAULT LOCAL | GLOBAL

CURSOR_DEFAULT LOCAL schränkt den Gültigkeitsbereich des Cursors ein. Der Bereich ist lokal zu dem Batch, zu der gespeicherten Prozedur oder zu dem Trigger, in dem bzw. in der der Cursor erstellt wurde. CURSOR_DEFAULT GLOBAL ist die Standardeinstellung. Der Gültigkeitsbereich des Cursors ist global zu der Verbindung.

ThemaStellen Sie einige konfigu-rierbare Datenbankoptionen vor.

EinstiegFür die meisten Daten-banken können eine Reihe von Optionen festgelegt werden.

Page 168: Programmieren Einer Microsoft SQL Server 2000-Datenbank

8 Unterrichtseinheit 3: Erstellen und Verwalten von Datenbanken

(Fortsetzung) Kategorie der Datenbankoption Datenbankoption Beschreibung

Wieder-herstellungs-optionen

RECOVERY FULL |BULK_LOGGED | SIMPLE

FULL stellt vollständige Wiederherstellbarkeit bei Daten-trägerfehlern bereit. Dies ist der Standard. BULK_LOGGED kommt mit weniger Speicherplatz für das Protokoll aus, da nur minimal protokolliert wird, birgt aber ein höheres Offen-legungsrisiko. SIMPLE stellt die Datenbank nur bis zur letzten vollständigen oder differenziellen Datenbank-sicherung wieder her.

TORN_PAGE_DETECTION Ermöglicht SQL Server das Erkennen von unvollständigen E/A-Operationen, die durch Stromausfälle oder System-ausfälle verursacht wurden. Die Standardeinstellung ist ON.

SQL-Optionen ANSI_NULL_DEFAULT Ermöglicht dem Benutzer, die Standardeinstellung für die NULL-Zulässigkeit in der Datenbank zu steuern. Die Standardeinstellung bei SQL Server 2000 ist NOT NULL.

ANSI_NULLS Ist diese Option auf ON festgelegt, werden alle Vergleiche mit einem NULL-Wert als NULL (unbekannt) ausgewertet. Ist diese Option auf OFF festgelegt, werden Vergleiche von Nicht-Unicode-Werten mit NULL-Werten als TRUE ausgewertet, wenn beide Werte NULL sind. Der Standard-wert für die Datenbankoption ANSI_NULLS ist OFF.

Statusoptionen READ_ONLY | READ_WRITE

Definiert eine Datenbank als schreibgeschützt - verwenden Sie diese Option zum Festlegen der Sicherheit von Decision Support-Datenbanken - oder lässt wieder Lese-/Schreiboperationen in der Datenbank zu.

SINGLE_USER |RESTRICTED_USER |MULTI_USER

SINGLE_USER ermöglicht jeweils einem Benutzer, eine Verbindung zur Datenbank herzustellen. Alle anderen Benutzerverbindungen werden unterbrochen. RESTRICTED_USER ermöglicht nur Mitgliedern der festen Datenbankrolle db_owner und der festen Serverrollen dbcreator und sysadmin, eine Verbindung zur Datenbank herzustellen. MULTI_USER ermöglicht allen Benutzern mit den entsprechenden Berechtigungen, eine Verbindung zur Datenbank herzustellen. MULTI_USER ist die Standardeinstellung.

Page 169: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 3: Erstellen und Verwalten von Datenbanken 9

Abrufen von Datenbankinformationen

� Bestimmen von Datenbankeigenschaften mit Hilfe derDATABASEPROPERTYEX-Funktion

� Verwenden von gespeicherten Systemprozeduren, um Informationen zu Datenbanken und Datenbank-parametern anzuzeigen

� sp_helpdb

� sp_helpdb database_name

� sp_spaceused [objname]

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Sie können Datenbankeigenschaften mit Hilfe der DATABASEPROPERTYEX-Funktion ermitteln.

SELECT DATABASEPROPERTYEX (database, property)

In der folgenden Tabelle sind einige Datenbankeigenschaften aufgeführt.

Collation IsFulltextEnabled

IsAnsiNullDefault IsInStandBy

IsAnsiNullsEnabled IsNullConcat

IsAnsiPaddingEnabled IsQuotedIdentifiersEnabled

IsAnsiWarningsEnabled IsRecursiveTriggersEnabled

IsArithmeticAbortEnabled Recovery

IsAutoCreateStatistics Status

IsAutoShrink Updateability

IsAutoUpdateStatistics UserAccess

IsCloseCursorsOnCommitEnabled Version

ThemaListen Sie die verschiede-nen Möglichkeiten zum Abrufen von Datenbank-informationen auf.

EinstiegEs gibt mehrere Möglich-keiten, Datenbank-informationen abzurufen.

Syntax

Methodischer Hinweis Führen Sie vor, wie Daten-bankinformationen unter SQL Server Enterprise Manager angezeigt werden.

Page 170: Programmieren Einer Microsoft SQL Server 2000-Datenbank

10 Unterrichtseinheit 3: Erstellen und Verwalten von Datenbanken

In der folgenden Tabelle sind die gebräuchlichsten gespeicherten System-prozeduren aufgeführt, mit denen Informationen zu den Datenbanken und Datenbankparametern angezeigt werden können.

GespeicherteSystemprozedur Beschreibung

sp_helpdb Führt alle auf einem Server vorhandenen Datenbanken auf, wobei der Datenbankname, die Größe, der Be-sitzer, die ID, das Erstellungsdatum und die Optionen aufgeführt werden.

sp_helpdb database_name Gibt Informationen über die angegebene Datenbank aus, wobei der Datenbankname, die Größe, der Be-sitzer, die ID, das Erstellungsdatum und die Optionen aufgeführt werden. Außerdem wird eine Liste der Daten- und Protokolldateien ausgegeben.

sp_spaceused [objname] Gibt den Speicherplatz an, den eine Datenbank oder ein Datenbankobjekt verwendet.

Page 171: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 3: Erstellen und Verwalten von Datenbanken 11

Erstellen von Dateigruppen

Northwind-Datenbank

DEFAULT-Dateigruppe OrderHistoryGroup

sys...sys...sys...sys...sys...sys...

sysuserssysuserssysuserssysobjectssysobjectssysobjects

.........OrdersOrdersOrders

CustomersCustomersCustomersProductsProductsProducts

OrdHistYear2OrdHistYear2OrdHistYear2OrdHistYear1OrdHistYear1OrdHistYear1

Northwind.mdfNorthwind.mdf

C:\ D:\

Ordhist1.ndfOrdhist1.ndfOrdhist2.ndfOrdhist2.ndf Northwind.IdfNorthwind.Idf

E:\

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Wenn Ihre Hardwareinstallation über mehrere Laufwerke verfügt, können Sie bestimmte Objekte und Dateien unterschiedlichen Datenträgern zuordnen, wobei Sie die Datenbankdateien in Dateigruppen zusammenfassen. Datei-gruppen sind benannte Auflistungen von Dateien. SQL Server schließt standardmäßig eine Dateigruppe ein. Sie können mit Hilfe der CREATE DATABASE- oder ALTER DATABASE-Anweisung weitere Dateigruppen erstellen.

Bei Verwendung von Dateigruppen haben Sie die Möglichkeit, bestimmte Ob-jekte einer bestimmten Datei zuzuweisen. In der Abbildung werden die Dateien Ordhist1.ndf und Ordhist2.ndf auf einem separaten Datenträger gespeichert, um so Dateien, die häufig abgefragt werden, von den Dateien zu trennen, die umfangreichen Änderungen unterworfen sind, und so Datenträgerkonflikte zu reduzieren.

Systemadministratoren haben auch die Möglichkeit, anstelle ganzer Daten-banken nur einzelne Dateien bzw. Dateigruppen zu sichern und wiederher-zustellen. Das Sichern von Dateien oder Dateigruppen ist für umfangreiche Datenbanken unbedingt erforderlich, um über eine effiziente Sicherungs- und Wiederherstellungsstrategie zu verfügen.

ThemaStellen Sie das Konzept der Dateigruppen vor.

EinstiegDateigruppen bestehen aus einer oder mehreren Dateien mit einem überge-ordneten Namen, die ge-meinsam verwaltet werden und auf die gemeinsam zugegriffen werden kann.

Page 172: Programmieren Einer Microsoft SQL Server 2000-Datenbank

12 Unterrichtseinheit 3: Erstellen und Verwalten von Datenbanken

Allgemeine Aspekte bei der Verwendung von Dateigruppen Die Verwendung von Dateigruppen gehört zu den fortgeschrittenen Datenbank-entwicklungstechniken. Um die günstigste Anordnung der Tabellen und Indizes in den Dateigruppen ermitteln zu können, müssen Sie über die Struktur Ihrer Datenbank, die Daten, Transaktionen und Abfragen sehr genau Bescheid wissen. Oftmals kann mit Hilfe der Striping-Funktionen von RAID-Systemen (Redundant Array of Inexpensive Disks) eine ähnliche Verbesserung der Systemleistung erzielt werden, wie beim Einsatz von Dateigruppen, wobei Sie sich den zusätzlichen Aufwand für das Definieren und Verwalten der Datei-gruppen ersparen.

Protokolldateien können keiner Dateigruppe angehören. Der Speicherplatz in Protokolldateien wird unabhängig vom Speicherplatz in Datendateien verwaltet.

DateigruppentypenUnter SQL Server können die beiden folgenden Typen von Dateigruppen verwendet werden:

� Die primäre Dateigruppe, die die Systemtabellen in der primären Datendatei enthält.

� Benutzerdefinierte Dateigruppen, d. h. alle Dateigruppen, die mit dem Schlüsselwort FILEGROUP definiert werden.

Festlegen der Standarddateigruppe Wenn Sie eine Datenbank erstellen, dient die primäre Dateigruppe automatisch als DEFAULT-Dateigruppe (Standarddateigruppe). Die Standarddateigruppe empfängt alle neuen Tabellen, Indizes und Dateien, für die keine Dateigruppe angegeben wird. Wenn die Datenbank mehrere Dateigruppen enthält, wird empfohlen, die Standarddateigruppe in eine der benutzerdefinierten Datei-gruppen zu ändern. So kann verhindert werden, dass die primäre Dateigruppe, die die Systemtabellen enthält, versehentlich von einer Benutzertabelle belegt wird.

Festlegen der Größe der primären Standarddateigruppe Wenn die Standarddateigruppe weiter als primäre Dateigruppe dient, ist die korrekte Größenfestlegung für die Standarddateigruppe sehr wichtig. Wenn in der Dateigruppe kein Speicherplatz mehr verfügbar ist, können Sie keine neuen Informationen zu den Systemtabellen hinzufügen. Wenn eine benutzerdefinierte Dateigruppe über zu wenig Speicherplatz verfügt, sind davon nur die Benutzer-dateien betroffen, die dieser Dateigruppe explizit zugewiesen werden.

Methodischer Hinweis Weisen Sie darauf hin, dass man bei der Organisation einer Datenbank auch zu viel tun kann. Die Imple-mentierung von RAID-Ver-fahren ist für Programme oftmals günstiger als die Verwendung von Datei-gruppen.

Anmerkung

Page 173: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 3: Erstellen und Verwalten von Datenbanken 13

Im folgenden Beispiel wird in der Northwind-Datenbank eine benutzer-definierte Dateigruppe erstellt und dieser Dateigruppe eine sekundäre Daten-datei hinzugefügt.

ALTER DATABASE Northwind ADD FILEGROUP OrderHistoryGroup GO

ALTER DATABASE Northwind ADD FILE ( NAME = 'OrdHistYear1', FILENAME = 'c:\Programme\

Microsoft SQL Server\MSSQL\Data\OrdHist1.ndf, SIZE = 5MB),

TO FILEGROUP OrderHistoryGroup GO

Anzeigen von Dateigruppeninformationen Informationen über Dateigruppen sind mit Hilfe von Funktionen, wie z. B. FILE_NAME, FILE_ID, FILE_PROPERTY, FILEGROUP_NAME, FILEGROUP_ID und FILEGROUP_PROPERTY, verfügbar. Die in der folgenden Tabelle aufgeführten gespeicherten Systemprozeduren zeigen ebenfalls Informationen über Dateigruppen an.

Gespeicherte Systemprozedur Beschreibung

sp_helpfile [[@filename =] 'name'] Gibt die physischen Namen und Attribute der Dateien zurück, die der aktuellen Datenbank zugeordnet sind. Mit dieser gespeicherten Systemprozedur können Sie die Namen der Dateien ermitteln, die mit dem Server ver-bunden oder von ihm getrennt werden sollen.

sp_helpfilegroup[[@filegroupname =]'filegroup_name']

Gibt die Namen und Attribute von Dateigruppen zurück, die der aktuellen Datenbank zugeordnet sind.

Beispiel

Page 174: Programmieren Einer Microsoft SQL Server 2000-Datenbank

14 Unterrichtseinheit 3: Erstellen und Verwalten von Datenbanken

���� Verwalten von Datenbanken

� Überwachen der Größe von Daten- und Protokolldateien

� Überwachen und Erweitern eines Transaktions-protokolls

� Verkleinern von Datenbanken und Dateien

� Löschen von Datenbanken

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Wenn sich der Umfang Ihrer Daten ändert, können Sie die Datenbank sowohl automatisch als auch manuell vergrößern bzw. verkleinern. Wenn Sie eine Datenbank nicht länger benötigen, können Sie sie zusammen mit allen zuge-hörigen Dateien löschen.

ThemaGeben Sie eine Übersicht über dieses Thema.

EinstiegIn diesem Abschnitt lernen Sie, wie Datenbanken und Transaktionsprotokolle verwaltet werden.

Methodischer Hinweis Fragen Sie die Kursteil-nehmer, ob sie mit den Themen dieses Abschnitts vertraut sind. Ist das der Fall, können Sie diesen Abschnitt allgemein unter-richten oder ganz über-springen.

Page 175: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 3: Erstellen und Verwalten von Datenbanken 15

Überwachen der Größe von Daten- und Protokolldateien

ALTER DATABASE SampleMODIFY FILE (NAME = 'SampleLog',SIZE = 15MB)

GO

ALTER DATABASE Sample

ADD FILE

(NAME = SampleData2,

FILENAME=‚c:\Programme\..\..\Data\Sample2.ndf',

SIZE=15MB,MAXSIZE=20MB)

GO

ALTER DATABASE SampleMODIFY FILE (NAME = 'SampleLog',SIZE = 15MB)

GO

ALTER DATABASE Sample

ADD FILE

(NAME = SampleData2,

FILENAME=‚c:\Programme\..\..\Data\Sample2.ndf',

SIZE=15MB,MAXSIZE=20MB)

GO

� Automatische Dateivergrößerung� Vergrößerung von Datenbankdateien� Hinzufügen sekundärer Datenbankdateien

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Wenn die Größe der Datendateien zunimmt oder umfangreichere Daten-änderungen durchgeführt werden, müssen die Daten- und Protokolldateien eventuell vergrößert werden. Die Größe der Datenbank kann mit SQL Server Enterprise Manager sowie mit Hilfe der ALTER DATABASE-Anweisung verwaltet werden. Die ALTER DATABASE-Anweisung kann nur innerhalb der master-Datenbank ausgeführt werden.

Sie haben folgende Möglichkeiten, die Datenbankgröße zu kontrollieren:

� Konfigurieren Sie die Datenbank- und Protokolldateien so, dass sie bei Bedarf automatisch vergrößert werden.

� Erhöhen oder vermindern Sie manuell den Wert für die aktuelle oder die maximale Größe der bestehenden Datenbank- und Protokolldateien.

� Fügen Sie manuell sekundäre Datenbank- und Protokolldateien hinzu.

Automatische Dateivergrößerung Sie können die Option für die automatische Dateivergrößerung entweder mit Hilfe der ALTER DATABASE-Anweisung oder mit SQL Server Enterprise Manager definieren, sodass die Datenbankdateien bei Bedarf automatisch um einen bestimmten Wert vergrößert werden. Wenn Sie die automatische Datei-vergrößerung definieren, entfällt der für die manuelle Datenbankvergrößerung erforderliche Verwaltungsaufwand.

Sie können für jede Datei die Anfangsgröße, die maximale Größe und die Schrittweite für die Vergrößerung festlegen. Obwohl die Dateivergrößerung in MB oder KB angegeben werden kann, sollten Sie sie als Prozentsatz angeben. Ist keine Maximalgröße angegeben, so kann die Datei vergrößert werden, bis der gesamte verfügbare Speicherplatz auf dem Datenträger belegt ist.

ThemaErläutern Sie, wie die Ver-größerung von Daten- und Protokolldateien überwacht wird.

EinstiegEs gibt mehrere Möglich-keiten, die Größe einer Datenbank zu kontrollieren.

Page 176: Programmieren Einer Microsoft SQL Server 2000-Datenbank

16 Unterrichtseinheit 3: Erstellen und Verwalten von Datenbanken

Wenn Sie die automatische Dateivergrößerung bei mehreren Dateien einsetzen, verwendet SQL Server eine proportionale Füllstrategie über alle Dateien einer Dateigruppe. So wie Daten in die Dateigruppe geschrieben werden, schreibt SQL Server in jede Datei der Dateigruppe einen Anteil, der proportional zum freien Speicherplatz in der Datei ist, anstatt zuerst in die erste Datei zu schreiben, bis diese voll ist, und dann in die nächste Datei zu schreiben.

Für eine optimale Systemleistung sollten Sie wie folgt vorgehen:

� Reservieren Sie eine ausreichende Anfangsgröße für die Datenbank und das Protokoll, um das häufige Aktivieren der automatischen Vergrößerung zu vermeiden.

� Legen Sie eine maximale Größe für Datendateien fest, wenn mehrere Daten-banken vorhanden sind.

� Legen Sie die Schrittweite für die Vergrößerung der Daten- und Protokoll-dateien so groß fest, dass das häufige Aktivieren der automatischen Ver-größerung vermieden wird. Wenn das Protokoll beispielsweise um 40 MB täglich zunimmt, legen Sie die Schrittweite für die automatische Vergrößerung auf 50 MB oder 100 MB fest - und nicht etwa auf 1 MB.

Vergrößerung von Datenbankdateien Wenn Sie für eine Datei keine Konfiguration für die automatische Vergröße-rung vornehmen, kann die Größe dennoch geändert werden. Wenn Sie als Schrittweite für die Vergrößerung den Wert 0 (Null) angeben, wird eine automatische Vergrößerung verhindert.

Hinzufügen sekundärer Datenbankdateien Sie können eine Datenbank auch vergrößern, indem Sie sekundäre Datenbank-dateien erstellen. Verwenden Sie sekundäre Datenbankdateien, um Daten-dateien auf verschiedenen physischen Datenträgern zu verteilen, wenn Sie nicht die Datenaufteilung von RAID-Systemen nutzen.

ALTER DATABASE database{ ADD FILE < filespec > [ ,...n ] [ TO FILEGROUP filegroup_name ]| ADD LOG FILE < filespec > [ ,...n ]| REMOVE FILE logical_file_name [ WITH DELETE ] | ADD FILEGROUP filegroup_name| REMOVE FILEGROUP filegroup_name| MODIFY FILE < filespec > | MODIFY NAME = new_dbname| MODIFY FILEGROUP filegroup_name {filegroup_property | NAME = new_filegroup_name } | SET < optionspec > [ ,...n ] [ WITH < termination > ] | COLLATE < collation_name >}

Teilsyntax

Page 177: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 3: Erstellen und Verwalten von Datenbanken 17

Im folgenden Beispiel wird die aktuelle Protokollgröße erhöht und eine sekundäre Datendatei zur Sample-Datenbank hinzugefügt.

ALTER DATABASE Sample MODIFY FILE (NAME = 'SampleLog', SIZE = 15MB) GO

ALTER DATABASE Sample ADD FILE (NAME = 'SampleData2' , FILENAME='c:\Programme\ Microsoft SQL Server\MSSQL\Data\Sample2.ndf', SIZE=15MB , MAXSIZE=20MB)GO

Beispiel

Page 178: Programmieren Einer Microsoft SQL Server 2000-Datenbank

18 Unterrichtseinheit 3: Erstellen und Verwalten von Datenbanken

Überwachen und Erweitern eines Transaktionsprotokolls

� Überwachen des Protokolls

� Überwachen von Situationen, die eine erhöhte Protokollaktivität zur Folge haben

� Laden von großen Datenmengen in eine indizierteTabelle

� Große Transaktionen

� Durchführen von protokollierten Operationen mit Text-oder Bilddaten

� Protokollvergrößerung bei Bedarf

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Wenn die Größe einer Datenbank zunimmt oder umfangreichere Daten-änderungen durchgeführt werden, muss eventuell das Transaktionsprotokoll vergrößert werden.

Überwachen des Protokolls Planen Sie die Größe des Protokolls sorgfältig, damit Ihnen hierfür stets aus-reichend Speicherplatz zur Verfügung steht. Sie sollten das Protokoll regel-mäßig überprüfen, um den optimalen Zeitpunkt für eine Vergrößerung ermitteln zu können.

Wenn für Ihr Transaktionsprotokoll nicht mehr genügend Speicher-platz zur Verfügung steht, können keine Transaktionen aufgezeichnet werden und SQL Server lässt keine Änderung Ihrer Datenbank mehr zu.

Sie können das Transaktionsprotokoll mit SQL Server Enterprise Manager, mit der DBCC SQLPERF (LOGSPACE)-Anweisung oder mit dem Microsoft Windows® 2000-Systemmonitor überwachen.

Die Transaktionsprotokolle einzelner Datenbanken können mit Hilfe von Leistungsindikatoren des Objekts SQLServer:Datenbanken vom System-monitor überwacht werden. Einige dieser Indikatoren sind in der folgenden Tabelle aufgeführt.

Leistungsindikator Anzeige

Geleerte Protokollbytes/Sekunde Anzahl der Bytes im Protokollpuffer, wenn der Puffer geleert wird

Protokollleerungen/Sekunde Anzahl der Protokollleerungen pro Sekunde

Ausstehende Protokoll-leerungen/Sekunde

Anzahl der Commits, die auf eine Protokoll-leerung warten

Prozentsatz des verwendeten Protokolls

Prozentsatz des beanspruchten Platzes in dem verwendeten Protokoll

ThemaZeigen Sie, wie der Trans-aktionsprotokollspeicher überwacht und vergrößert wird.

EinstiegPlanen Sie sorgfältig, damit stets ausreichend Protokoll-speicherplatz zur Verfügung steht.

Achtung

Methodischer Hinweis Zeigen Sie, wie das Proto-koll mit dem Systemmonitor überwacht wird.

Page 179: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 3: Erstellen und Verwalten von Datenbanken 19

(Fortsetzung) Leistungsindikator Anzeige

Protokolldatei(en) Größe (KB) Kumulierte Größe aller Protokolldateien in der Datenbank

Protokollcache-Trefferquote Prozentsatz der Lesevorgänge im Protokoll-cache, die durch den Protokollcache aufgelöst werden konnten

Überwachen von Situationen, die eine erhöhte Protokollaktivität zur Folge haben Eine erhöhte Aktivität des Transaktionsprotokolls kann beispielsweise durch folgende Situationen verursacht werden:

� Wenn Informationen in eine Tabelle geladen werden, die Indizes enthält. SQL Server protokolliert alle Einfügungen und Indexänderungen. Wenn Daten in Tabellen ohne Indizes geladen werden, protokolliert SQL Server nur Blockreservierungen.

� Wenn mit einer einzelnen Transaktion in einer Tabelle zahlreiche Änder-ungen (INSERT-, UPDATE- und DELETE-Anweisungen) durchgeführt werden. Dies ist normalerweise dann der Fall, wenn in der Anweisung eine WHERE-Klausel fehlt, oder wenn die WHERE-Klausel zu allgemein ist, sodass eine große Anzahl von Datensätzen betroffen ist.

� Wenn in einer Tabelle Text- oder Imagedaten hinzugefügt oder geändert werden.

Protokollvergrößerung bei Bedarf Sie können das Transaktionsprotokoll mit SQL Server Enterprise Manager oder unter Verwendung der ALTER DATABASE-Anweisung vergrößern.

Page 180: Programmieren Einer Microsoft SQL Server 2000-Datenbank

20 Unterrichtseinheit 3: Erstellen und Verwalten von Datenbanken

Verkleinern von Datenbanken und Dateien

� Verkleinern einer gesamten Datenbank

� Verkleinern einer Datendatei in der Datenbank

� Automatisches Verkleinern einer Datenbank

� Stellen Sie die autoshrink-Datenbankoption auf TRUE ein

DBCC SHRINKDATABASE (Sample_Data, 25)DBCC SHRINKDATABASE (Sample_Data, 25)

DBCC SHRINKFILE (Sample, 10)DBCC SHRINKFILE (Sample, 10)

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Wenn zu viel Speicherplatz reserviert wurde, oder wenn weniger Speicher als geplant benötigt wird, können Sie entweder die gesamte Datenbank oder einige ihrer Datendateien verkleinern.

Verkleinern einer gesamten Datenbank Sie können eine gesamte Datenbank entweder mit SQL Server Enterprise Manager oder mit Hilfe der SHRINKDATABASE-Anweisung des Datenbank-prüfprogramms (Database Consistency Checker, DBCC) verkleinern. Hierdurch werden alle Datendateien in der Datenbank verkleinert.

SQL Server verkleinert Protokolldateien unter Verwendung einer verzögerten Verkleinerungsoperation, und zwar so, als wären alle Protokolldateien in einem zusammenhängenden Protokollpool zusammengefasst. Die Protokolldateien werden zurückgesetzt, nachdem das Protokoll abgeschnitten wurde. SQL Server versucht, die abgeschnittenen Protokolldateien so weit wie möglich auf die gewünschte Größe zu reduzieren.

DBCC SHRINKDATABASE (database_name [, target_percent][,{NOTRUNCATE | TRUNCATEONLY}])

In der folgenden Tabelle werden die DBCC SHRINKDATABASE-Optionen beschrieben.

Option Beschreibung

target_percent Legt den gewünschten Prozentsatz des freien Speicherplatzes fest, der in der Datenbank verbleiben soll, nachdem SQL Server die Datenbank verkleinert hat.

NOTRUNCATE Bewirkt, dass SQL Server den freigegebenen Festplatten-speicher in den Datenbankdateien beibehält. Standardmäßig wird der freigegebene Speicherplatz dem Betriebssystem wieder zur Verfügung gestellt.

ThemaZeigen Sie, wie eine Daten-bank verkleinert wird.

EinstiegSie können eine ganze Datenbank oder nur bestimmte Dateien in einer Datenbank verkleinern.

Syntax

Page 181: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 3: Erstellen und Verwalten von Datenbanken 21

(Fortsetzung)Option Beschreibung

TRUNCATEONLY Bewirkt, dass der gesamte ungenutzte Speicherplatz in der Datendatei an das Betriebssystem freigegeben wird, und verkleinert die Datei auf den letzten reservierten Block. Damit wird die Dateigröße reduziert, ohne Daten zu verschieben. Es wird nicht versucht, Zeilen aus nicht reservierten Seiten zu verschieben. SQL Server ignoriert target_percent, wenn Sie diese Option verwenden.

In diesem Beispiel wird die Datei Sample_Data so weit verkleinert, dass der freie Speicherplatz 25 % beträgt.

DBCC SHRINKDATABASE (Sample_Data, 25)

Wenn in dem vorherigen Beispiel die Sample-Datenbankdatei 6 MB Daten enthält, beträgt die neue Größe der Datenbank 8 MB (6 MB Daten + 2 MB freier Speicherplatz).

SQL Server sorgt dafür, dass die Größe des von den Daten beleg-ten Speicherplatzes beim Verkleinern von Dateien nicht unterschritten werden kann. Auch die mit dem Parameter SIZE der CREATE DATABASE-Anwei-sung festgelegte Größe kann nicht unterschritten werden.

Verkleinern einer Datendatei in der Datenbank Sie können eine Datendatei in einer Datenbank mit SQL Server Enterprise Manager oder durch Ausführen der DBCC-Anweisung SHRINKFILE verkleinern.

DBCC SHRINKFILE ({file_name |file_id} [, target_size][, { EMPTYFILE | NOTRUNCATE | TRUNCATEONLY}])

In der folgenden Tabelle werden die DBCC SHRINKFILE-Optionen beschrieben.

Option Beschreibung

target_size Legt die gewünschte Größe für die Datendatei in MB als Ganzzahl fest. Wenn nichts angegeben wird, wird die Größe von DBCC SHRINKFILE so weit wie möglich reduziert.

EMPTYFILE Verlagert alle Daten aus der angegebenen Datei in andere Dateien in derselben Dateigruppe. Es können auch künftig keine weiteren Daten in der Datei, auf die EMPTYFILE angewendet wird, gespeichert werden. Verwenden Sie diese Option, um die Datei mit Hilfe der ALTER DATABASE-Anweisung zu löschen.

In diesem Beispiel wird die sample-Datendatei auf 10 MB verkleinert.

DBCC SHRINKFILE (Sample, 10)

Beispiel

Anmerkung

Syntax

Beispiel

Page 182: Programmieren Einer Microsoft SQL Server 2000-Datenbank

22 Unterrichtseinheit 3: Erstellen und Verwalten von Datenbanken

Automatisches Verkleinern einer Datenbank Das automatische Verkleinern ist nicht standardmäßig aktiviert. Indem Sie die autoshrink-Datenbankoption auf TRUE einstellen, können Sie nicht belegten Speicherplatz mit Hilfe einer Datenbankoption automatisch wieder zur Verfü-gung zu stellen. Sie können diese Option auch mit SQL Server Enterprise Manager ändern.

Berücksichtigen Sie beim Verkleinern einer Datenbank oder Datendatei die folgenden Punkte und Richtlinien:

� Nach der Verkleinerung muss die Datenbank noch größer sein als die model-Datenbank oder die in der Datenbank bzw. Datendatei enthaltenen Daten.

� Bevor Sie eine Datenbank oder Datendatei verkleinern, sollten Sie die betreffende Datenbank und die master-Datenbank sichern.

� Die DBCC-Anweisungen SHRINKDATABASE und SHRINKFILE werden verzögert ausgeführt, sodass die Datenbank- bzw. Dateigröße eventuell nicht sofort reduziert wird.

� Mit der Anweisung DBCC SHRINKFILE kann die Datenbank unter die bei Erstellung oder Änderung angegebene Größe verkleinert werden, jedoch nicht unter die Größe, die für die aktuellen Daten erforderlich ist.

Page 183: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 3: Erstellen und Verwalten von Datenbanken 23

Löschen von Datenbanken

DROP DATABASE Northwind, pubsDROP DATABASE Northwind, pubs

� Vorgehensweise beim Löschen einer Datenbank

� SQL Server Enterprise Manager

� DROP DATABASE-Anweisung

� Beschränkungen für das Löschen von Datenbanken

� Während des Wiederherstellens

� Wenn ein Benutzer mit der Datenbank verbunden ist

� Wenn die Datenbank als Teil der Replikation publiziert wird

� Wenn es sich um eine Systemdatenbank handelt

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Wenn Sie eine Datenbank nicht mehr benötigen, können Sie sie löschen. Beim Löschen einer Datenbank werden die Datenbank und alle Datenträgerdateien gelöscht, die die Datenbank verwendet.

Vorgehensweise beim Löschen einer Datenbank Sie können Datenbanken entweder mit SQL Server Enterprise Manager oder mit Hilfe der DROP DATABASE-Anweisung löschen.

DROP DATABASE database_name [,…n]

Im folgenden Beispiel werden mit einer Anweisung mehrere Datenbanken gelöscht.

DROP DATABASE Northwind, pubs

Berücksichtigen Sie beim Löschen von Datenbanken die folgenden Punkte und Richtlinien:

� Wenn Sie SQL Server Enterprise Manager verwenden, können Sie immer nur jeweils eine Datenbank löschen.

� Mit Transact-SQL können mehrere Datenbanken gleichzeitig gelöscht werden.

� Nach dem Löschen einer Datenbank verfügen sämtliche Benutzernamen, denen diese Datenbank als Standarddatenbank zugewiesen war, nicht mehr über eine Standarddatenbank.

Führen Sie nach dem Löschen einer Datenbank stets eine Sicherung der master-Datenbank durch.

ThemaErläutern Sie, wie eine Datenbank gelöscht wird.

EinstiegLöschen Sie eine Daten-bank nur, wenn Sie ganz sicher sind, dass Sie diese nicht mehr benötigen.

Syntax

Beispiel

Anmerkung

Page 184: Programmieren Einer Microsoft SQL Server 2000-Datenbank

24 Unterrichtseinheit 3: Erstellen und Verwalten von Datenbanken

Beschränkungen für das Löschen von Datenbanken Für das Löschen von Datenbanken gelten folgende Beschränkungen. Die folgenden Datenbanken können nicht gelöscht werden:

� Datenbanken, die zum aktuellen Zeitpunkt wiederhergestellt werden. � Datenbanken, die geöffnet sind, weil durch einen Benutzer Lese- bzw.

Schreibvorgänge durchgeführt werden. � Datenbanken, deren Tabellen für die SQL Server-Replikation publiziert

werden. � Eine Systemdatenbank.

Methodischer Hinweis Weisen Sie darauf hin, dass die master-, model- und tempdb-Datenbanken unter SQL Server nicht gelöscht werden können, das Löschen der msdb-Systemdatenbank aber möglich ist.

Page 185: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 3: Erstellen und Verwalten von Datenbanken 25

���� Einführung in Datenstrukturen

� Art der Datenspeicherung

� Seitentypen und Blocktypen

� Seiten für die Speicherplatzverwaltung

� Seiten für die Tabellen- und Indexverfolgung

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Dieser Abschnitt beschreibt die Datenstrukturen, die SQL Server zum Speichern von Daten verwendet.

ThemaGeben Sie eine Einführung in Datenstrukturen.

EinstiegIn diesem Abschnitt lernen Sie die Datenstrukturen von SQL Server kennen.

Page 186: Programmieren Einer Microsoft SQL Server 2000-Datenbank

26 Unterrichtseinheit 3: Erstellen und Verwalten von Datenbanken

Art der Datenspeicherung

DatenbankDatenbank

Block (8 zusammen-hängende Seitenà 8 KB)

Seite (8 KB)

Tabellen,Indizes

Daten

Maximale Zeilengröße = 8.060 Byte

Daten (Datei)MDF oder NDF

Protokoll (Datei)LDF

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Wenn Sie eine Datenbank erstellen, sollten Sie wissen, auf welche Weise die Daten in SQL Server gespeichert werden, damit Sie den für die Datenbank erforderlichen Speicherplatz berechnen und zuweisen können. Berücksichtigen Sie hinsichtlich des Speicherplatzes die folgenden Punkte und Richtlinien:

� Jede Datenbank besteht aus einer primären Datendatei, die mit der Datei-namenerweiterung MDF identifiziert wird, und einer oder mehreren Trans-aktionsprotokolldateien mit der Dateinamenerweiterung LDF. Darüber hinaus kann eine Datenbank auch über sekundäre Datendateien verfügen. Diese werden mit der Dateinamenerweiterung NDF identifiziert. Diese physischen Dateien besitzen sowohl Betriebssystemdateinamen als auch logische Dateinamen, die Sie beide in Transact-SQL-Anweisungen ver-wenden können.

� Bei der Erstellung einer Datenbank wird in diese eine Kopie der model-Datenbank, die die Systemtabellen enthält, aufgenommen. Die Mindest-größe einer Datenbank muss größer oder gleich der Größe der model-Datenbank sein.

� SQL Server speichert, liest und schreibt Daten in zusammenhängenden Datenblöcken von jeweils 8 KB, die als Seiten bezeichnet werden. Das heißt also, dass in einer Datenbank 128 Seiten pro MB gespeichert werden können.

� Zeilen können nicht seitenübergreifend gespeichert werden. Daher beträgt der maximale Umfang einer einzigen Zeile, abzüglich des für die Verwaltung erforderlichen Platzes, 8.060 Byte.

ThemaErläutern Sie die Struktur der Datenbanken.

EinstiegWenn Sie eine Datenbank erstellen, sollten Sie wissen, wie die Daten von SQL Server gespeichert werden.

Methodischer Hinweis Es ist sehr wichtig, die maximale Größe von Zeilen und Blöcken zu kennen, wenn Sie eine Datenbank entwerfen oder eine Kapazitätsplanungdurchführen möchten.

Da Zeilen nicht seiten-übergreifend gespeichert werden können, belegt beispielsweise eine einzige Zeile von 4.035 Byte eine ganze 8.060-Byte-Seite.

Page 187: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 3: Erstellen und Verwalten von Datenbanken 27

� Alle Seiten werden in Blöcken gespeichert. Ein Block besteht aus acht zusammenhängenden Seiten, bzw. 64 KB. Folglich können in einer Daten-bank 16 Blöcke pro MB gespeichert werden.

� In Transaktionsprotokolldateien werden alle Informationen gespeichert, die für die Wiederherstellung einer Datenbank im Falle eines Systemfehlers er-forderlich sind. Die Standardgröße des Transaktionsprotokolls beträgt 25 % der Größe der Datendateien. Diese Zahl sollte jedoch nur als Anhaltspunkt dienen und kann entsprechend den Anforderungen Ihrer Anwendung an-gepasst werden.

Page 188: Programmieren Einer Microsoft SQL Server 2000-Datenbank

28 Unterrichtseinheit 3: Erstellen und Verwalten von Datenbanken

Seitentypen und Blocktypen

EinheitlicheBlöcke

FreierSpeicherplatz

GemischterBlock

� Seitentypen� Seiten, auf denen die Speicherplatzreservierung

verfolgt wird� Seiten, die Benutzer- und Indexdaten enthalten

� Blocktypen

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Seiten und Blöcke sind die primären Datenstrukturen in der physischen SQL Server-Datenbank.

Seitentypen SQL Server verwendet mehrere Seitentypen: bestimmte Seiten verfolgen die Speicherplatzreservierung nach, andere Seiten enthalten Benutzer- und Index-daten. Die Seiten, auf denen die Speicherplatzreservierung nachverfolgt wird, enthalten dicht gepackte Informationen. Dadurch kann SQL Server diese Seiten effizient im Speicher behalten, um die Nachverfolgung zu vereinfachen.

BlocktypenSQL Server verwendet zwei Blocktypen:

� Blöcke, die Seiten aus mindestens zwei Objekten enthalten, werden als gemischte Blöcke bezeichnet. Jede Tabelle fängt als gemischter Block an. Gemischte Blöcke werden vor allem für Seiten verwendet, die die Speicher-platzreservierung nachverfolgen und kleine Objekte enthalten.

� Blöcke, deren acht Seiten alle für ein einziges Objekt reserviert sind, werden als einheitliche Blöcke bezeichnet. Sie werden verwendet, wenn Tabellen oder Indizes mehr als 64 KB Speicherplatz benötigen.

ThemaStellen Sie die Seiten- und Blocktypen vor.

EinstiegSpeicherplatzreservierungen in der Datenbank erfolgen überwiegend in Einheiten von acht Seiten, den Blöcken.

Page 189: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 3: Erstellen und Verwalten von Datenbanken 29

Seiten für die Speicherplatzverwaltung

000 111 222 333 44 55 66 77

DateiheaderPFS

GAMSGAM

Seitennummer

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Der erste Block jeder Datei ist ein gemischter Block, der eine Dateiheaderseite und drei Reservierungsseiten enthält. SQL Server reserviert diesen gemischten Block, wenn die primäre Datei erstellt wird, und verwendet die Seiten intern.

DateiheaderseiteDie Dateiheaderseite enthält die Dateiattribute, wie z. B. den Namen der besitzenden Datenbank, die zugehörige Dateigruppe, die Mindestgröße und die Schrittweite für die Vergrößerung. Sie ist die erste Seite in jeder Datei (Seite 0).

PFS-Seite Die PFS-Seite (Page Free Space) ist eine Reservierungsseite, die Informationen zum freien Speicherplatz enthält, der auf den Seiten einer Datei verfügbar ist. Seite 1 jeder Datei ist eine PFS-Seite. SQL Server fügt bei Bedarf weitere PFS-Seiten hinzu.

Jede PFS-Seite kann 8.000 zusammenhängende Seiten nachverfolgen, was an-nähernd 64 MB an Daten entspricht. Für jede Seite enthält die PFS-Seite ein Byte, in dem Folgendes aufgezeichnet wird:

� Ob die Seite reserviert wurde. � Ob sich die Seite in einem gemischten oder einheitlichen Block befindet. � Wie viel freier Speicherplatz ungefähr auf der Seite verfügbar ist.

ThemaBeschreiben Sie die Seiten, die den Speicherplatz ver-walten.

EinstiegDie ersten vier Seiten jeder Datei informieren SQL Server darüber, welche Seiten verwendet werden.

Methodischer Hinweis Betonen Sie die folgenden Punkte: (1) Die PFS-Seite verfolgt alle Seiten. (2) Die GAM- und SGAM-Seiten verfolgen Blöcke und nicht Seiten. (3) Mit Hilfe der GAM und SGAM kann SQL Server Speicherplatz finden, wenn neue Seiten benötigt werden. (4) PFS-, GAM- und SGAM-Seiten werden in größeren Dateien bei Bedarf wiederholt.

Page 190: Programmieren Einer Microsoft SQL Server 2000-Datenbank

30 Unterrichtseinheit 3: Erstellen und Verwalten von Datenbanken

GAM- und SGAM-Seiten SQL Server ermittelt mit Hilfe der GAM-Seiten (Global Allocation Map) und der SGAM-Seiten (Secondary Global Allocation Map), wo sich freie Blöcke oder gemischte Blöcke mit freien Seiten befinden.

GAM-SeitenDie GAM-Seite ist eine Reservierungsseite, die Informationen zu reservierten Blöcken enthält. Seite 2 jeder Datei ist eine GAM-Seite. SQL Server fügt bei Bedarf weitere GAM-Seiten hinzu.

Jede GAM-Seite erfasst 63.904 Blöcke, was ungefähr 4 GB an Daten entspricht. Die GAM-Seite enthält ein Bit für jeden Block, der von ihr abgedeckt wird. Das Bit hat den Wert 0, wenn der Block reserviert ist, und 1, wenn er frei ist.

SGAM-Seiten Die SGAM-Seite ist eine Reservierungsseite, die Informationen zu reservierten Blöcken enthält. Seite 3 jeder Datei ist eine SGAM-Seite. SQL Server fügt bei Bedarf weitere SGAM-Seiten hinzu.

SGAM-Seiten verfolgen gemischte Blöcke, die derzeit über mindestens eine freie Seite verfügen. Sie erfassen ebenfalls 63.904 Blöcke. Wenn das Bit den Wert 0 hat, wird der Block entweder als einheitlicher Block oder als gemischter Block ohne freie Seiten verwendet. Wenn das Bit den Wert 1 hat, wird der Block als gemischter Block mit mindestens einer freien Seite verwendet.

In der folgenden Tabelle werden die Einstellungen der GAM- und SGAM-Bits zusammengefasst:

GAM-Biteinstellung SGAM-Biteinstellung Blockverwendung

1 0 Ein freier Block. Dieser Block wird derzeit nicht verwendet.

0 1 Eine freie Seite. Dieser gemischte Block besitzt mindestens eine nicht zugewiesene Seite.

0 0 Ein vollständig belegter Block. Der Block ist als einheitlicher Block oder als vollständig belegter gemischter Block zugewiesen.

Page 191: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 3: Erstellen und Verwalten von Datenbanken 31

Seiten für die Tabellen- und Indexverfolgung

Gemischte Blöcke Einheitliche Blöcke

DatenSeiten 3-8

IAMDatenseite

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

SQL Server weist anfänglich jeder Tabelle und jedem Index eine Reservie-rungsseite und mindestens eine Datenseite in einem gemischten Block zu. So wie das Objekt wächst, weist SQL Server bei Bedarf bis zu sieben weitere Seiten aus gemischten Blöcken zu. Wenn das Objekt mehr als acht Seiten belegt, weist SQL Server weitere Seiten aus einheitlichen Blöcken zu. SQL Server verwendet vier Seitentypen, um Tabellen und Indizes zu verwalten. Sie können sich an beliebiger Stelle in der Datei befinden. Es handelt sich um die IAM-, Daten-, Text/Image- und Indexseiten.

IAM-Seite Die IAM-Seite ist eine Reservierungsseite, die Informationen zu den Blöcken enthält, die von einer Tabelle oder einem Index verwendet werden.

Die IAM-Seite enthält die Adressen der acht Anfangsseiten und eine Block-bitmap, die anzeigt, welche Blöcke für das betreffende Objekt derzeit belegt sind. Eine IAM-Seite kann bis zu 512.000 Datenseiten verfolgen. SQL Server fügt für größere Tabellen bei Bedarf weitere IAM-Seiten hinzu. Für IAM-Seiten wird stets freier Speicherplatz aus gemischten Blöcken reser-viert. Sie können sich an beliebiger Stelle in einer Datei oder Dateigruppe befinden. SQL Server versucht, IAM-Seiten zu Gruppen zusammenzufassen, um die Zugriffe zu beschleunigen.

DatenseiteDatenseiten enthalten alle Daten, ausgenommen Daten der Datentypen text,ntext und image.

Text/Image-SeiteDie Text/Image-Seite enthält text-, ntext- und image-Daten.

Index-SeiteDie Indexseite enthält Indexstrukturen.

ThemaErläutern Sie die Aufgabe der IAM-Seiten.

EinstiegIAM-Seiten verfolgen die Beziehung zwischen einem Objekt und den von ihm verwendeten Blöcken oder Seiten.

Methodischer Hinweis Diese Folie enthält Animationen. Im Abschnitt „Hinweise für den Kursleiter“ finden Sie Informationen zum Navigieren durch diese Folie.

Betonen Sie, dass jede Tabelle und jeder Index eine eigene IAM-Seite besitzt. SQL Server findet mit Hilfe der IAM-Seite jeden Block und jede Seite, der bzw. die dem Objekt zugewiesen ist.

Page 192: Programmieren Einer Microsoft SQL Server 2000-Datenbank

32 Unterrichtseinheit 3: Erstellen und Verwalten von Datenbanken

Empfohlene Methoden

Angeben der maximalen DateigrößeAngeben der maximalen Dateigröße

Ändern der StandarddateigruppeÄndern der Standarddateigruppe

Sichern der „master“-DatenbankSichern der „master“-Datenbank

Festlegen großer Schrittweiten für die automatische VergrößerungFestlegen großer Schrittweiten für die automatische Vergrößerung

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Die folgenden empfohlenen Methoden unterstützen Sie beim Erstellen und Ver-walten von Datenbanken:

� Führen Sie nach dem Erstellen oder Ändern einer Datenbank stets sofort eine Sicherung der master-Datenbank durch. Dies ist wichtig, da sich in der master-Datenbank der Systemkatalog be-findet.

� Geben Sie eine maximale Größe an, wenn die automatische Datei-vergrößerung aktiviert ist. Dies verhindert, dass eine einzelne Datei die Festplatte vollständig belegt.

� Legen Sie große Schrittweiten für die automatische Vergrößerung fest, um häufige Dateivergrößerungen zu vermeiden. Dies verringert den Verwaltungsaufwand von SQL Server und trägt dazu bei, dass die Datei auf der Festplatte nicht so stark fragmentiert wird.

� Ändern Sie die Standarddateigruppe. Wenn die Datenbank mehrere Dateigruppen besitzt, weisen Sie eine be-nutzerdefinierte Dateigruppe als Standard zu. So wird verhindert, dass sich die unerwartete Zunahme der Tabellengröße nachteilig auf die System-tabellen in der primären Dateigruppe auswirkt.

ThemaStellen Sie die empfohlenen Methoden zum Erstellen und Verwalten von Daten-banken vor.

EinstiegDie folgenden Methoden werden zur Erstellung und Verwaltung von Daten-banken empfohlen.

Page 193: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 3: Erstellen und Verwalten von Datenbanken 33

Übungseinheit A: Erstellen und Verwalten von Datenbanken

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

LernzieleAm Ende dieser Übungseinheit werden Sie in der Lage sein, die folgenden Aufgaben auszuführen:

� Erstellen einer Datenbank. � Verwalten der Vergrößerung einer Datenbank. � Ändern der Datenbankoptionen, um zu steuern, wie oft das Transaktions-

protokoll gelöscht wird.

VoraussetzungenUm diese Übungseinheit zu bearbeiten, benötigen Sie Folgendes:

� Die Antwortdateien für diese Übungseinheit, die sich in C:\Moc\2328A\Labfiles\L03\Answers befinden.

Einrichten der ÜbungseinheitUm diese Übungseinheit bearbeiten zu können, müssen Sie die vorhergehende Übungseinheit durchgearbeitet haben.

Dieser Kurs basiert auf der Northwind-Datenbank. Das Schema für die Northwind-Datenbank befindet sich in Anhang A. In den Übungs-einheiten wird eine parallele Version der Northwind-Datenbank mit dem Namen ClassNorthwind verwendet.

ThemaGeben Sie eine Einführung in die Übungseinheit.

EinstiegIn dieser Übungseinheit erstellen und verwalten Sie die ClassNorthwind-Datenbank und löschen das Transaktionsprotokoll.

Erläutern Sie die Lernziele der Übungseinheit.

Anmerkung

Page 194: Programmieren Einer Microsoft SQL Server 2000-Datenbank

34 Unterrichtseinheit 3: Erstellen und Verwalten von Datenbanken

Weitere Informationen Sollten Sie beim Ausführen von Dateien Hilfe benötigen, suchen Sie in der Hilfe von SQL Query Analyzer nach „Ausführen einer Abfrage“.

Daneben sind die folgenden Informationsquellen verfügbar:

� Das Northwind-Datenbankschema. � Die Microsoft SQL Server-Onlinedokumentation.

SzenarioDer Aufbau des Schulungsraumes soll die Organisation des weltweit agieren-den Handelsunternehmens Northwind Traders widerspiegeln. Das Unternehmen hat den fiktiven Domänennamen nwtraders.msft. Der primäre DNS-Server für nwtraders.msft ist der Kursleitercomputer, dessen IP-Adresse (Internetproto-koll) 192.168.x.200 lautet (wobei x die zugewiesene Schulungsraumnummer ist). Der Name des Kursleitercomputers ist London.

Die folgende Tabelle stellt den Benutzernamen, den Computernamen und die IP-Adresse für jeden Kursteilnehmercomputer in der fiktiven Domäne nwtraders.msft bereit. Suchen Sie den Ihrem Computer zugewiesenen Benutzernamen und notieren Sie ihn.

Benutzername Computername IP-Adresse

SQLAdmin1 Vancouver 192.168.x.1SQLAdmin2 Denver 192.168.x.2SQLAdmin3 Perth 192.168.x.3SQLAdmin4 Brisbane 192.168.x.4SQLAdmin5 Lisbon 192.168.x.5SQLAdmin6 Bonn 192.168.x.6SQLAdmin7 Lima 192.168.x.7SQLAdmin8 Santiago 192.168.x.8SQLAdmin9 Bangalore 192.168.x.9SQLAdmin10 Singapore 192.168.x.10SQLAdmin11 Casablanca 192.168.x.11SQLAdmin12 Tunis 192.168.x.12SQLAdmin13 Acapulco 192.168.x.13SQLAdmin14 Miami 192.168.x.14SQLAdmin15 Auckland 192.168.x.15SQLAdmin16 Suva 192.168.x.16SQLAdmin17 Stockholm 192.168.x.17SQLAdmin18 Moscow 192.168.x.18SQLAdmin19 Caracas 192.168.x.19SQLAdmin20 Montevideo 192.168.x.20SQLAdmin21 Manila 192.168.x.21SQLAdmin22 Tokyo 192.168.x.22SQLAdmin23 Khartoum 192.168.x.23SQLAdmin24 Nairobi 192.168.x.24

Veranschlagte Zeit für die Übungseinheit: 30 Minuten

Page 195: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 3: Erstellen und Verwalten von Datenbanken 35

Übung 1 Erstellen der „ClassNorthwind“-Datenbank

In dieser Übung erstellen Sie die ClassNorthwind-Datenbank und definieren die für die Daten und das Transaktionsprotokoll verwendeten Dateien.

� So erstellen Sie die „ClassNorthwind“-Datenbank In diesem Verfahren erstellen Sie mit Hilfe von SQL Server Enterprise Manager die ClassNorthwind-Datenbank. Ein vollständiges Transact-SQL-Skript für dieses Verfahren befindet sich in C:\MOC\2328A\Labfiles\L03\Answers\Creabase.sql.1. Melden Sie sich mit Hilfe der Informationen in der folgenden Tabelle an der

Schulungsraumdomäne nwtraders an.

Option Eingabe

Benutzer-name

SQLAdminx (wobei x die Ihrem Computernamen zugewiesene Nummer ist, wie in der Schulungsraumdomäne nwtraders.msftfestgelegt)

Kennwort password

2. Öffnen Sie SQL Server Enterprise Manager. Sie verfügen über die Berechtigung, sich bei SQL Server anzumelden und die Installation von SQL Server zu verwalten, da Ihr SQLAdminx-Konto Mitglied der lokalen Microsoft Windows® 2000-Gruppe Administratorenist, der automatisch die SQL Server-Rolle sysadmin zugeordnet wird.

3. Erweitern Sie Microsoft SQL Servers, erweitern Sie SQL Server-Gruppe,und erweitern Sie anschließend Ihren Computer.

4. Klicken Sie mit der rechten Maustaste auf Datenbanken, und klicken Sie dann auf Neue Datenbank.

5. Erstellen Sie mit Hilfe der Werte in der nachstehenden Tabelle die ClassNorthwind-Datenbank.

Parameter Wert

Datenbankname ClassNorthwind

Name der Datenbankdatei ClassNorthwind_Data

Speicherort (Standard)

Anfangsgröße 25 MB

Dateigruppe Primary

Dateivergrößerung 10 Prozent

Maximale Dateigröße 100 MB

Name der Transaktions-protokolldatei

ClassNorthwind_Log

Speicherort (Standard)

Anfangsgröße 15 MB

Dateivergrößerung 10 Prozent

Maximalgröße der Protokolldatei

40 MB

Page 196: Programmieren Einer Microsoft SQL Server 2000-Datenbank

36 Unterrichtseinheit 3: Erstellen und Verwalten von Datenbanken

6. Nachdem Sie die ClassNorthwind-Datenbank erstellt haben, erweitern Sie in der Konsolenstruktur Datenbanken, klicken Sie mit der rechten Maus-taste auf ClassNorthwind, und klicken Sie dann auf Eigenschaften.Überprüfen Sie die Informationen auf der Registerkarte Allgemein.

7. Öffnen Sie SQL Query Analyzer, und stellen Sie eine Verbindung über die Windows-Authentifizierung her.

8. Führen Sie die gespeicherte Systemprozedur sp_helpdb aus, um Informa-tionen zur ClassNorthwind-Datenbank anzuzeigen. EXEC sp_helpdb ClassNorthwind

Page 197: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 3: Erstellen und Verwalten von Datenbanken 37

Übung 2 Verwalten der Vergrößerung der „ClassNorthwind“-Transaktionsprotokolldatei

In dieser Übung ändern Sie die maximale Größe der ClassNorthwind-Transaktionsprotokolldatei.

� So vergrößern Sie die „ClassNorthwind“-Transaktionsprotokolldatei In diesem Verfahren schreiben Sie eine Anweisung, die die Maximalgröße der ClassNorthwind-Transaktionsprotokolldatei auf 50 MB und die aktuelle Größe des Protokolls auf 20 MB vergrößert, und führen die Anweisung aus. Ein vollständiges Transact-SQL-Skript für dieses Verfahren befindet sich in C:\MOC\2328A\Labfiles\L03\Answers\Altebase.sql.1. Schreiben Sie eine Anweisung, die die Maximalgröße der ClassNorthwind-

Transaktionsprotokolldatei auf 50 MB erhöht, und führen Sie diese aus. USE master GO

ALTER DATABASE ClassNorthwind MODIFY FILE (NAME='ClassNorthwind_Log', MAXSIZE=50MB) GO

2. Schreiben Sie eine Anweisung, die die aktuelle Größe der ClassNorthwind-Transaktionsprotokolldatei auf 25 MB erhöht, und führen Sie diese aus. USE master GO

ALTER DATABASE ClassNorthwind MODIFY FILE (NAME='ClassNorthwind_Log', MAXSIZE=25MB) GO

3. Schreiben Sie eine Anweisung, die die Schrittweite für die Vergrößerung der ClassNorthwind-Transaktionsprotokolldatei auf 20 Prozent erhöht, und führen Sie diese aus. USE master GO

ALTER DATABASE ClassNorthwind MODIFY FILE (NAME='ClassNorthwind_Log', FILEGROWTH=20%) GO

4. Führen Sie die gespeicherte Systemprozedur sp_helpdb aus, um Informatio-nen zur ClassNorthwind-Datenbank anzuzeigen und die Änderungen zu überprüfen.EXEC sp_helpdb ClassNorthwind

Page 198: Programmieren Einer Microsoft SQL Server 2000-Datenbank

38 Unterrichtseinheit 3: Erstellen und Verwalten von Datenbanken

Übung 3 Festlegen des Wiederherstellungsmodells für die Datenbank

In dieser Übung legen Sie das Wiederherstellungsmodell für die Datenbank auf SIMPLE fest. Damit kann SQL Server den Protokollspeicher wieder belegen, wenn er nicht mehr für die Wiederherstellung benötigt wird. Dieses Modell reduziert zudem die Speicherplatzanforderungen.

� So legen Sie das Wiederherstellungsmodell für die Datenbank fest In diesem Verfahren schreiben Sie eine Anweisung, die das Wiederher-stellungsmodell für die ClassNorthwind-Datenbank auf SIMPLE festlegt, und führen sie aus. Sie verwenden hierzu die ALTER DATABASE-Anweisung. Ein vollständiges Transact-SQL-Skript für dieses Verfahren befindet sich in C:\MOC\2328A\Labfiles\L03\Answers\RecovModel.sql.1. Führen Sie die folgende Anweisung aus, um die Option zu aktivieren, die

das Transaktionsprotokoll jedes Mal löscht, wenn SQL Server einen Prüfpunkt verarbeitet: ALTER DATABASE ClassNorthwind SET RECOVERY SIMPLE GO

2. Führen Sie die gespeicherte Systemprozedur sp_helpdb aus, um Informatio-nen zur ClassNorthwind-Datenbank anzuzeigen und zu überprüfen, ob das Wiederherstellungsmodell geändert wurde. EXEC sp_helpdb ClassNorthwind

Page 199: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 3: Erstellen und Verwalten von Datenbanken 39

Lernzielkontrolle

� Erstellen von Datenbanken

� Erstellen von Dateigruppen

� Verwalten von Datenbanken

� Einführung in Datenstrukturen

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

1. Sie erstellen eine Datenbank, die selten aktualisiert wird, sondern haupt-sächlich bei der Entscheidungsfindung verwendet und häufig abgefragt, aber selten geändert wird. Welchen Prozentsatz der Datenbank würden Sie für das Transaktionsprotokoll reservieren? Die Antworten variieren. Der Prozentsatz kann zwischen 10 und 20 liegen. Mehr als 20 % sind nicht sinnvoll. Da die Datenbank wenig Änderungszugriffe verzeichnet, sollten eher um die 10 % reserviert werden.

2. Welche Vorteile hat die Verwendung von Dateigruppen? Sie können Tabellen auf bestimmte Datenträger platzieren. Sie können umfangreiche Tabellen separat sichern.

ThemaVertiefen Sie die Lernziele dieser Unterrichtseinheit, indem Sie die Kernpunkte wiederholen.

EinstiegDie Fragen zur Lernziel-kontrolle beziehen sich auf einige der Schlüsselkon-zepte, die Inhalt dieser Unterrichtseinheit sind.

Page 200: Programmieren Einer Microsoft SQL Server 2000-Datenbank

40 Unterrichtseinheit 3: Erstellen und Verwalten von Datenbanken

3. Sie sind für die Verwaltung der unternehmenswichtigen Buchhaltungs-datensätze Ihres Unternehmens verantwortlich. Welches Datenbank-Wiederherstellungsmodell wäre für diese Datenbank am besten geeignet? Sie sollten das vollständige Wiederherstellungsmodell verwenden.

4. Die GAM-, SGAM- und IAM-Seiten verfolgen die Speicherplatzreservie-rung für Daten. Worin unterscheidet sich die IAM-Seite von den GAM- und SGAM-Seiten? Die GAM- und SGAM-Seiten verfolgen Objekte nach. Die IAM-Seite verfolgt die Speicherreservierung für eine bestimmte Tabelle oder einen bestimmten Index nach.

Page 201: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 4: Erstellen von Datentypen und Tabellen

Inhalt

Übersicht 1

Erstellen von Datentypen 2

Erstellen von Tabellen 9

Generieren von Spaltenwerten 17

Generieren von Skripts 21

Empfohlene Methoden 22

Übungseinheit A: Erstellen von Datentypen und Tabellen 23

Lernzielkontrolle 33

Page 202: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Die in diesen Unterlagen enthaltenen Angaben und Daten können ohne vorherige Ankündigung geändert werden. Die in diesen Unterlagen genannten Firmen, Produkte, Menschen, Charaktere und/oder Daten sind frei erfunden und sollen keine wirklichen Individuen, Gesellschaften, Produkte oder Veranstaltungen darstellen, soweit nichts anderes angegeben ist. Die Benutzer/innen sind verpflichtet, sich an alle anwendbaren Urheberrechtsgesetze zu halten. Ohne ausdrückliche schriftliche Erlaubnis der Microsoft Corporation darf kein Teil dieser Unterlagen für irgendwelche Zwecke vervielfältigt oder übertragen werden, unabhängig davon, auf welche Art und Weise oder mit welchen Mitteln, elektronisch oder mechanisch, dies geschieht. Wenn auf dieses Dokument nur auf elektronischem Wege zugegriffen werden kann, sind Sie hiermit berechtigt, eine (1) Kopie zum persönlichen Gebrauch auszudrucken.

Microsoft Corporation kann Inhaber von Patenten oder Patentanträgen, Marken, Urheberrechten oder anderen gewerblichen Schutzrechten sein, die den Inhalt dieses Dokuments betreffen. Die Bereitstellung dieses Dokuments gewährt keinerlei Lizenzrechte an diesen Patenten, Marken, Urheberrechten oder anderen gewerblichen Schutzrechten, es sei denn, dies wurde ausdrücklich durch einen schriftlichen Lizenzvertrag mit der Microsoft Corporation vereinbart.

2000 Microsoft Corporation. Alle Rechte vorbehalten.

Microsoft, ActiveX, BackOffice, MS-DOS, PowerPoint, Visual Basic, Visual C++, Visual Studio, Windows und Windows NT sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern.

Andere in diesem Dokument aufgeführte Produkt- und Firmennamen sind möglicherweise Marken der jeweiligen Eigentümer.

Project Lead: Rich Rose Instructional Designers: Rich Rose, Cheryl Hoople, Marilyn McGill Instructional Software Design Engineers: Karl Dehmer, Carl Raebler, Rick Byham Technical Lead: Karl Dehmer Subject Matter Experts: Karl Dehmer, Carl Raebler, Rick Byham Graphic Artist: Kirsten Larson (Independent Contractor) Editing Manager: Lynette Skinner Editor: Wendy Cleary Copy Editor: Edward McKillop (S&T Consulting) Production Manager: Miracle Davis Production Coordinator: Jenny Boe Production Support: Lori Walker (S&T Consulting) Test Manager: Sid Benavente Courseware Testing: TestingTesting123 Classroom Automation: Lorrin Smith-Bates Creative Director, Media/Sim Services: David Mahlmann Web Development Lead: Lisa Pease CD Build Specialist: Julie Challenger Online Support: David Myka (S&T Consulting) Localization Manager: Rick Terek Operations Coordinator: John Williams Manufacturing Support: Laura King; Kathy Hershey Lead Product Manager, Release Management: Bo Galford Lead Product Manager, Data Base: Margo Crandall Group Manager, Courseware Infrastructure: David Bramble Group Product Manager, Content Development: Dean Murray General Manager: Robert Stewart

Page 203: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 4: Erstellen von Datentypen und Tabellen iii

Hinweise für den Kursleiter In dieser Unterrichtseinheit wird den Kursteilnehmern erläutert, wie Datentypen und Tabellen erstellt und Transact-SQL-Skripts generiert werden, die Anwei-sungen enthalten, mit denen eine Datenbank und deren Objekte erstellt werden.

In der Übungseinheit erstellen die Kursteilnehmer die Datentypen und Tabellen der ClassNorthwind-Datenbank, fügen Spalten hinzu und löschen sie und generieren dann ein Skript, um alle Datenbankobjekte erneut erstellen zu kön-nen, die im Vorfeld bereits erstellt wurden.

Am Ende dieser Unterrichtseinheit werden die Kursteilnehmer in der Lage sein, die folgenden Aufgaben auszuführen:

� Erstellen und Löschen benutzerdefinierter Datentypen. � Erstellen und Löschen von Benutzertabellen. � Generieren von Spaltenwerten. � Generieren von Skripts.

Unterlagen und Vorbereitung In diesem Abschnitt werden die Unterlagen und vorbereitenden Aufgaben erläutert, die nötig sind, um diese Unterrichtseinheit zu unterrichten.

Erforderliche Unterlagen Um diese Unterrichtseinheit zu unterrichten, benötigen Sie folgende Unterlagen:

� Die Microsoft® PowerPoint®-Datei 2328A_04.ppt� Die Beispieldatei C:\Moc\2328A\Demo\D04_Ex.sql, die alle Beispiel-

skripts der Unterrichtseinheit enthält, soweit in der Unterrichtseinheit nichts anderes angegeben ist.

Vorbereitende Aufgaben Zur Vorbereitung dieser Unterrichtseinheit gehen Sie folgendermaßen vor:

� Lesen Sie alle Unterlagen für diese Unterrichtseinheit. � Arbeiten Sie die Übungseinheit durch.

Präsentation:30 Minuten

Übungseinheit:30 Minuten

Page 204: Programmieren Einer Microsoft SQL Server 2000-Datenbank

iv Unterrichtseinheit 4: Erstellen von Datentypen und Tabellen

Strategie für die Unterrichtseinheit Verwenden Sie die folgende Strategie, um diese Unterrichtseinheit zu präsentieren:

� Erstellen von Datentypen Beschreiben Sie die vom System bereitgestellten Datentypen sowie die Richtlinien für das Erstellen von benutzerdefinierten Datentypen. Erläutern Sie, wie benutzerdefinierte Datentypen hinzugefügt und gelöscht werden.

� Erstellen von Tabellen Beschreiben Sie das Verfahren zum Erstellen, Ändern und Löschen einer Tabelle.

� Generieren von Spaltenwerten Erläutern Sie die IDENTITY-Eigenschaft, die NEWID-Funktion und den uniqueidentifier-Datentyp, damit die Kursteilnehmer in der Lage sind, diese Fähigkeiten zu definieren und zum automatischen Generieren von Werten einzusetzen.

� Generieren von Skripts Beschreiben Sie, wie ein Transact-SQL-Skript generiert wird, das die Anweisungen enthält, die zum Erstellen einer Datenbank und deren Objekte verwendet werden.

AnpassungsinformationenDieser Abschnitt beschreibt die Anforderungen zum Einrichten der Übungs-einheiten für eine Unterrichtseinheit sowie die Konfigurationsänderungen, die während der Übungseinheiten an den Kursteilnehmercomputern vorgenommen werden. Diese Informationen sollen Ihnen beim Replizieren oder Anpassen der Microsoft Official Curriculum-Courseware (MOC) helfen.

Die Übungseinheit in dieser Unterrichtseinheit hängt auch von der Schulungsraumkonfiguration ab, die im Abschnitt „Anpassungsinformationen“ am Ende des Dokuments Handbuch für das Einrichten von Schulungs-computern für Kurs 2328A, Programmieren einer Microsoft SQL Server 2000-Datenbank, angegeben ist.

Wichtig

Page 205: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 4: Erstellen von Datentypen und Tabellen v

Einrichten der Übungseinheit Der folgende Abschnitt beschreibt die Anforderungen zum Einrichten der Übungseinheit für diese Unterrichtseinheit.

Anforderung zum Einrichten der ÜbungseinheitFür die Übungseinheit in dieser Unterrichtseinheit muss die ClassNorthwind-Datenbank in den für diese Übungseinheit erforderlichen Zustand zurück-versetzt werden. Damit Kursteilnehmercomputer diese Anforderung erfüllen, müssen Sie eine der folgenden Aktionen durchführen:

� Bearbeiten der vorhergehenden Übungseinheit. � Ausführen der Batchdatei C:\Moc\2328A\Batches\Restore04.cmd.

Wenn dieser Kurs angepasst wurde, müssen die Kursteilnehmer die Batchdatei C:\Moc\2328A\Batches\Restore04.cmd ausführen, um sicherzu-stellen, dass die Übungseinheit ordnungsgemäß durchgeführt werden kann.

Ergebnisse der Übungseinheit Auf den Kursteilnehmercomputern gibt es keine Konfigurationsänderungen, die die Replikation oder die Anpassung betreffen.

Achtung

Page 206: Programmieren Einer Microsoft SQL Server 2000-Datenbank

vi Unterrichtseinheit 4: Erstellen von Datentypen und Tabellen

This page is intentionally left blank.

Page 207: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 4: Erstellen von Datentypen und Tabellen 1

Übersicht

� Erstellen von Datentypen

� Erstellen von Tabellen

� Generieren von Spaltenwerten

� Generieren von Skripts

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

In dieser Unterrichtseinheit wird beschrieben, wie Datentypen und Tabellen erstellt und Transact-SQL-Skripts generiert werden, die Anweisungen ent-halten, mit denen eine Datenbank und deren Objekte erstellt werden.

Am Ende dieser Unterrichtseinheit werden die Sie in der Lage sein, die folgenden Aufgaben auszuführen:

� Erstellen und Löschen benutzerdefinierter Datentypen. � Erstellen und Löschen von Benutzertabellen. � Generieren von Spaltenwerten. � Generieren von Skripts.

ThemaGeben Sie eine Übersicht über die Themen und Lern-ziele dieser Unterrichts-einheit.

EinstiegIn dieser Unterrichtseinheit erfahren Sie, wie Daten-typen und Tabellen erstellt und Skripts generiert werden.

Page 208: Programmieren Einer Microsoft SQL Server 2000-Datenbank

2 Unterrichtseinheit 4: Erstellen von Datentypen und Tabellen

���� Erstellen von Datentypen

� Systemdatentypen

� Erstellen und Löschen benutzerdefinierter Datentypen

� Richtlinien für das Festlegen von Datentypen

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Bevor Sie eine Tabelle erstellen können, müssen Sie die Datentypen für die Tabelle definieren. Datentypen geben die Art von Daten (Zeichen, Zahlen oder Datumsangaben) an, die in einer Spalte enthalten sein können, und bestimmen, wie die Daten gespeichert werden. Microsoft® SQL Server™ 2000 enthält eine Vielzahl unterschiedlicher Systemdatentypen. SQL Server gestattet auch die Erstellung von benutzerdefinierten Datentypen, die auf Systemdatentypen basieren.

ThemaGeben Sie eine Übersicht über dieses Thema.

EinstiegIn diesem Abschnitt lernen Sie, wie benutzerdefinierte Datentypen erstellt und gelöscht werden.

Page 209: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 4: Erstellen von Datentypen und Tabellen 3

Systemdatentypen

� Numerisch� Integer� Exakt-numerisch� Annähernd-numerisch� Währung

� Datum und Zeit� Zeichendaten und Unicode-Zeichen� Binär� Andere

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Datentypen definieren den Datenwert, der in jeder einzelnen Spalte zulässig ist. SQL Server stellt eine Reihe unterschiedlicher Datentypen bereit. Bestimmten allgemeinen Datentypen sind verschiedene SQL Server-Datentypen zugeordnet. Sie sollten die geeigneten Datentypen auswählen, um die Leistung zu optimie-ren und Festplatten-Speicherplatz einzusparen.

Kategorien von Systemdatentypen In der folgenden Tabelle werden allgemeine Datentypen den entsprechenden SQL Server-Systemdatentypen zugeordnet. Die Tabelle enthält Synonyme für Datentypen, um die Kompatibilität mit ANSI zu gewährleisten.

Allgemeine Datentypen

Von SQL Server bereitgestellte Systemdatentypen ANSI-Synonym Anzahl der Bytes

Integer int

bigint

smallint, tinyint

integer

-

-

4

8

2, 1

Exaktnumerisch

decimal[(p[, s])]

numeric[(p[, s])]

dec

-

2-17

Annähernd numerisch

float[(n)]

real

double precision,float[(n)] for n=8-15 float[(n)] for n=1-7

8

4

Währung money, smallmoney

- 8, 4

Datum und Zeit

Datetime,smalldatetime

- 8 4

ThemaListen Sie die SQL Server-Datentypen auf.

EinstiegSQL Server stellt eine Reihe unterschiedlicher Daten-typen bereit.

Page 210: Programmieren Einer Microsoft SQL Server 2000-Datenbank

4 Unterrichtseinheit 4: Erstellen von Datentypen und Tabellen

(Fortsetzung)

Allgemeine Datentypen

Von SQL Server bereitgestellte Systemdatentypen ANSI-Synonym Anzahl der Bytes

Zeichendaten char[(n)]

varchar[(n)]

text

character[(n)]

char VARYING[(n)] character VARYING[(n)] -

0-8000

0 - 2 GB

Unicode-Zeichen

nchar[(n)]

nvarchar[(n)]

ntext

- 0-8000

(4000 Zeichen)

0 - 2 GB

Binär binary[(n)]

varbinary[(n)]

-

binary VARYING[(n)]

0-8000

Image image - 0 - 2 GB

Globaler Bezeichner

uniqueidentifier - 16

Speziell bit, cursor,uniqueidentifier

timestamp

sysname

table

sql_variant

-

rowversion

-

-

-

1, 0-8

8

256

0-8016

Exakt und annähernd numerische Datentypen Ob Sie einen exakt numerischen oder einen annähernd numerischen Datentyp verwenden, sollte von der Art und Weise bestimmt werden, wie Sie einen Datentyp verwenden möchten.

Exakt numerische Datentypen Mit exakt numerischen Datentypen können Sie die zu verwendenden Dezimal-stellen und die Genauigkeit genau angeben. So können Sie z. B. drei Ziffern rechts vom Dezimalzeichen und vier Ziffern links vom Dezimalzeichen an-geben. Eine Abfrage gibt immer genau das zurück, was Sie eingegeben haben. SQL Server unterstützt zwei exakt numerische Datentypen, um die Kompati-bilität mit ANSI zu gewährleisten: decimal und numeric.

Im Allgemeinen werden exakt numerische Datentypen in Finanzanwendungen eingesetzt, in denen eine einheitliche Darstellung der Daten wichtig ist (immer zwei Dezimalstellen) und in denen diese Spalte mit den einheitlichen Daten ab-gefragt werden soll (z. B., um alle Kredite mit einem Zinssatz von 8,75 % zu finden).

Methodischer Hinweis SQL Server kann mehrere Sprachen unterstützen, indem Zeichenfolgen in Unicode-Datentypfeldern (Doppelbyte) gespeichert werden.

Methodischer Hinweis Machen Sie die Kursteil-nehmer auf die Datentypen cursor, table und sql_variant aufmerksam.

Page 211: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 4: Erstellen von Datentypen und Tabellen 5

Annähernd numerische Datentypen Annähernd numerische Datentypen speichern Daten so genau wie möglich. Die Bruchzahl 1/3 wird beispielsweise in einem Dezimalsystem als 0,33333 (Periode) dargestellt. Da die Zahl nicht genau gespeichert werden kann, wird ein annähernder Wert gespeichert. SQL Server unterstützt zwei annähernd numerische Datentypen: float und real.

Wenn Sie Zahlen runden oder Qualitätsprüfungen zwischen Zahlen vornehmen, sollten Sie keine annähernd numerischen Datentypen verwenden.

Das Verweisen auf Spalten mit dem float- oder real-Datentyp in WHERE-Klauseln sollte nach Möglichkeit vermieden werden. Anmerkung

Page 212: Programmieren Einer Microsoft SQL Server 2000-Datenbank

6 Unterrichtseinheit 4: Erstellen von Datentypen und Tabellen

Erstellen und Löschen benutzerdefinierter Datentypen

LöschenLöschen

ErstellenErstellen

EXEC sp_addtype city, 'nvarchar(15)', NULLEXEC sp_addtype region, 'nvarchar(15)', NULLEXEC sp_addtype country, 'nvarchar(15)', NULL

EXEC sp_addtype city, 'nvarchar(15)', NULLEXEC sp_addtype region, 'nvarchar(15)', NULLEXEC sp_addtype country, 'nvarchar(15)', NULL

EXEC sp_droptype cityEXEC sp_droptype city

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Benutzerdefinierte Datentypen basieren auf Systemdatentypen. Sie ermöglichen Ihnen eine genauere Definition der Datentypen, um die Konsistenz bei der Arbeit mit allgemeinen Datenelementen in unterschiedlichen Tabellen oder Datenbanken sicherzustellen. Ein benutzerdefinierter Datentyp wird für eine bestimmte Datenbank definiert.

Benutzerdefinierte Datentypen, die Sie in der model-Datenbank erstellen, werden automatisch in alle im Anschluss erstellten Datenbanken ein-gefügt. Jeder benutzerdefinierter Datentyp wird als Zeile zur systypes-Tabelle hinzugefügt.

Sie können benutzerdefinierte Datentypen mit SQL Server Enterprise Manager oder mit gespeicherten Systemprozeduren hinzufügen oder löschen. Datentyp-namen müssen die Regeln für Bezeichner befolgen und für jede Datenbank eindeutig sein. Definieren Sie jeden benutzerdefinierten Datentyp unter Berück-sichtigung eines Systemdatentyps, wobei Sie vorzugsweise NULL oder NOT NULL angeben.

ThemaErläutern Sie, wie benutzer-definierte Datentypen hinzu-gefügt und gelöscht werden.

EinstiegSie können benutzerdefi-nierte Datentypen mit SQL Server Enterprise Manager oder mit gespei-cherten Systemprozeduren hinzufügen oder löschen.

Methodischer Hinweis Führen Sie den Kursteil-nehmern vor, wie ein Daten-typ mit SQL Server Enterprise Manager erstellt wird.

Anmerkung

Page 213: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 4: Erstellen von Datentypen und Tabellen 7

Erstellen eines benutzerdefinierten Datentyps Die gespeicherte Systemprozedur sp_addtype erstellt benutzerdefinierte Datentypen.

sp_addtype {type}, [system_data_type] [, ['NULL' | 'NOT NULL']] [, 'owner_name']

Im folgenden Beispiel werden drei benutzerdefinierte Datentypen erstellt.

EXEC sp_addtype city, 'nvarchar(15)', NULL EXEC sp_addtype region, 'nvarchar(15)', NULL EXEC sp_addtype country, 'nvarchar(15)', NULL

Löschen eines benutzerdefinierten Datentyps Die gespeicherte Systemprozedur sp_droptype löscht benutzerdefinierte Datentypen aus der systypes-Systemtabelle. Ein benutzerdefinierter Datentyp kann nicht gelöscht werden, wenn Tabellen oder andere Datenbankobjekte darauf verweisen.

sp_droptype {‘type’}

Im folgenden Beispiel wird ein benutzerdefinierter Datentyp gelöscht.

EXEC sp_droptype city

Führen Sie die gespeicherte Systemprozedur sp_help aus, um eine Liste der derzeit definierten Datentypen abzurufen.

Syntax

Beispiel

Syntax

Beispiel

Anmerkung

Page 214: Programmieren Einer Microsoft SQL Server 2000-Datenbank

8 Unterrichtseinheit 4: Erstellen von Datentypen und Tabellen

Richtlinien für das Festlegen von Datentypen

� Falls die Spaltenlänge variiert, verwenden Sie variable Datentypen

� Verwenden Sie „tinyint“ auf geeignete Art und Weise� Im Allgemeinen sollten Sie für numerische Datentypen

„decimal“ verwenden� Falls der Speicher größer als 8000 Byte ist, verwenden

Sie „text“ oder „image“� Verwenden Sie „money“ für Währungen� Verwenden Sie nicht „float“ oder „real“ für

Primärschlüssel

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Berücksichtigen Sie die folgenden Richtlinien zum Auswählen von Datentypen und Abstimmen der Speichergröße auf die Anforderungen:

� Falls die Spaltenlänge variiert, verwenden Sie einen der variablen Daten-typen. Ist z. B. eine Liste mit Namen vorhanden, können Sie diese auf varchar anstatt auf char (fest) einstellen.

� Wenn Sie eine schnell wachsende Buchhandelskette mit vielen Standorten besitzen und Sie den tinyint-Datentyp für die Buchladen-ID in der Daten-bank angegeben haben, treten Probleme beim Öffnen von Buchladen Nummer 256 auf.

� Bei numerischen Datentypen bieten die Größe und die erforderliche Genauigkeitsstufe Unterstützung bei der Auswahl. Im Allgemeinen sollten Sie den decimal-Datentyp verwenden.

� Falls der Speicher größer als 8000 Byte ist, verwenden Sie text oder image.Liegt der Speicher unter 8000 Byte, verwenden Sie binary oder char. Falls möglich, sollten Sie varchar verwenden, da dieser Datentyp mehr Funktionen als text und image bietet.

� Verwenden Sie den money-Datentyp für Währungen. � Verwenden Sie nicht die annähernd numerischen Datentypen float und real

als Primärschlüssel. Da die Werte dieser Datentypen nicht genau sind, sind sie für den Einsatz in Vergleichen nicht geeignet.

ThemaStellen Sie einige der Richt-linien für das Auswählen von Datentypen vor.

EinstiegBei der Auswahl der Daten-typen sollte die Speicher-größe auf die Anforderun-gen abgestimmt werden.

Page 215: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 4: Erstellen von Datentypen und Tabellen 9

���� Erstellen von Tabellen

� Wie SQL Server Daten in Zeilen anordnet

� Wie SQL Server Daten vom Typ „text“, „ntext“ und „image“ organisiert

� Erstellen und Löschen einer Tabelle

� Hinzufügen und Löschen einer Spalte

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Nachdem Sie alle Datentypen für die Tabelle definiert haben, können Sie Tabellen erstellen, Spalten hinzufügen und löschen und Spaltenwerte generieren.

ThemaGeben Sie eine Übersicht über dieses Thema.

EinstiegIn diesem Abschnitt er-fahren Sie, wie alle Daten-typen für eine Tabelle defi-niert und wie Tabellen er-stellt werden, wie Spalten erstellt und gelöscht und wie Spaltenwerte generiert werden.

Page 216: Programmieren Einer Microsoft SQL Server 2000-Datenbank

10 Unterrichtseinheit 4: Erstellen von Datentypen und Tabellen

Wie SQL Server Daten in Zeilen anordnet

HeaderHeader feststehendeDaten

feststehendeDaten NBNB VBVB Variable DatenVariable Daten

Null-Block

VariablerBlock

4 Byte

Daten

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Eine Datenzeile besteht aus einem Zeilenheader und einem Datenteil. Es ist wichtig, die Elemente des Datenteils jeder Zeile zu kennen, um die Größe der Tabelle vorausplanen zu können.

ZeilenheaderDer 4 Byte große Zeilenheader enthält Informationen über die Spalten in der Datenzeile, wie beispielsweise einen Verweis auf die Endposition der unverän-derlichen Daten der Zeile und ob sich in der Zeile Spalten mit variabler Länge befinden.

DatenteilDer Datenteil einer Zeile kann die folgenden Elemente enthalten:

� Daten fester Länge. Daten mit fester Länge werden vor den Daten mit variabler Länge auf einer Seite eingegeben. Eine leere Datenzeile mit fester Länge nimmt ebensoviel Platz ein wie eine gefüllte Datenzeile mit fester Länge. Eine Tabelle, die nur aus Spalten mit fester Länge besteht, enthält die gleiche Anzahl an Zeilen auf einer Seite.

� Nullblock. Ein Nullblock ist ein Satz an Bytes mit variabler Länge. Er be-steht aus zwei Byte, mit denen die Anzahl der Spalten gespeichert wird, gefolgt von einem Null-Bitmap, das angibt, ob jede einzelne Spalte Null ist. Die Größe eines Null-Bitmaps ist gleich ein Bit pro Spalte, aufgerundet zum nächsten Byte. Eine bis acht Spalten erfordern eine 1-Byte-Bitmap. Neun bis sechzehn Spalten erfordern eine 2-Byte-Bitmap.

ThemaBeschreiben Sie, wie Daten in Zeilen angeordnet werden.

EinstiegEs ist wichtig, die Elemente des Datenteils jeder Zeile zu kennen, um die Größe der Tabelle vorausplanen zu können.

Page 217: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 4: Erstellen von Datentypen und Tabellen 11

� Variabler Block. Ein variabler Block besteht aus zwei Byte, die angeben, wie viele Spalten mit variabler Länge vorhanden sind. Ein weiterer 2-Byte-Block pro Spalte verweist auf das Ende jeder Spalte mit variabler Länge. Der variable Block wird ausgelassen, wenn es keine Spalten mit variabler Länge gibt.

� Daten mit variabler Länge. Daten mit variabler Länge werden nach dem variablen Block auf der Seite eingegeben. Eine leere Datenzeile mit vari-abler Länge benötigt keinen Platz. Eine Tabelle mit Spalten variabler Länge kann einige lange Zeilen oder viele kurze Zeilen aufweisen.

Sofern möglich, sollte die Zeilenlänge kompakt gehalten werden, damit mehr Zeilen auf eine Seite passen. Auf diese Weise wird die Eingabe/Ausgabe (E/A) verringert und die Puffercache-Trefferquote erhöht.

Tipp

Page 218: Programmieren Einer Microsoft SQL Server 2000-Datenbank

12 Unterrichtseinheit 4: Erstellen von Datentypen und Tabellen

Wie SQL Server Daten vom Typ „text“, „ntext“ und „image“ organisiert

DatenzeileTextText--

ZeigerZeiger

StammstrukturStammstruktur

ZwischenknotenZwischenknoten ZwischenknotenZwischenknoten

Block 1Block 1 Block 2Block 2 Block 1Block 1 Block 2Block 2

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Datentypen mit variabler Länge können als eine Seitenauflistung oder in Daten-zeilen gespeichert werden. Hierbei handelt es sich um die folgenden Daten-typen:

� Den text-Datentyp, der bis zu 2.147.483.647 Zeichen enthalten kann. Der Nicht-Unicode-Datentyp text kann nicht für Variablen oder Parameter in gespeicherten Prozeduren verwendet werden.

� Den ntext-Datentyp, der bis maximal 2³º -1 (1.073.741.823) Zeichen oder 2³¹ -1 Byte enthalten kann, was einer Größe von 2.147.483.647 Byte an Unicodedaten variabler Länge entspricht. Das SQL-92-Synonym für ntextist national text.

� Den image-Datentyp, der 0 bis 2.147.483.647 Byte an Binärdaten enthalten kann.

Da die Datentypen text, ntext und image in der Regel recht groß sind, speichert SQL Server diese Datentypen außerhalb der Zeilen. Ein 16-Byte-Zeiger in der Datenzeile verweist auf eine Stammstruktur, die die Daten enthält. Die text-Stammstruktur bildet den Stammknoten des B-Baumes, der auf die Datenblöcke verweist. Wenn mehr als 32 Kilobyte (KB) an Daten vorhanden sind, werden in dem B-Baum zwischen dem Stammknoten und den Datenblöcken Zwischen-knoten hinzugefügt. Dies ermöglicht ein schnelles Navigieren im B-Baum beginnend in der Mitte einer Zeichenfolge.

Bei geringer bis mittlerer Größe des Inhalts von text, ntext und image bietetSQL Server die Option, die Werte in der Datenzeile anstatt in einer separaten B-Baumstruktur zu speichern. Dies können Sie mit der Option text in rowangeben. Sie können auch einen Grenzwert für die Option festlegen; der Bereich liegt zwischen 24 und 7.000 Byte.

Sie können die Option text in row für eine Tabelle aktivieren, indem Sie die gespeicherte Systemprozedur sp_tableoption verwenden.

ThemaStellen Sie die drei Daten-typen vor, die in der Zeilen-organisation eine Ausnahme darstellen.

EinstiegDatentypen mit variabler Länge werden in der Regel als eine Seitenauflistung und nicht in Datenzeilen gespeichert.

Page 219: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 4: Erstellen von Datentypen und Tabellen 13

In diesem Beispiel wird die Option text in row mit der gespeicherten System-prozedur sp_tableoption aktiviert, und es wird angegeben, dass bis zu 1.000 text-, ntext- oder image-Zeichen auf der Datenseite gespeichert werden sollen.

EXEC sp_tableoption N'Employees', 'text in row', '1000'

Wenn Sie die Option aktivieren, jedoch keinen Wert angeben, wird der Standardwert von 256 Byte verwendet. Mit dem Standardwert wird sichergestellt, dass kleinere Werte und Textverweise in den Datenzeilen gespeichert werden können.

Beispiel

Anmerkung

Page 220: Programmieren Einer Microsoft SQL Server 2000-Datenbank

14 Unterrichtseinheit 4: Erstellen von Datentypen und Tabellen

Erstellen und Löschen einer Tabelle

� Erstellen einer Tabelle

� Sortieren von Spalten� Angeben von NULL oder NOT NULL� Berechnete Spalten� Löschen einer Tabelle

SpaltennameSpaltennameSpaltenname DatentypDatentypDatentyp NULL oder NOT NULL

NULL oNULL odederrNOT NULLNOT NULL

CREATE TABLE dbo.Categories(CategoryID

CategoryNameDescriptionPicture

CREATE TABLE dbo.Categories(CategoryID

CategoryNameDescriptionPicture

int IDENTITY(1,1)nvarchar(15)ntextimage

int IDENTITY(1,1)nvarchar(15)ntextimage

NOT NULL,NOT NULL,NULL,NULL)

NOT NULL,NOT NULL,NULL,NULL)

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Beim Erstellen einer Tabelle müssen Sie den Tabellennamen, die Spaltennamen und die Spaltendatentypen angeben. Spaltennamen müssen innerhalb einer ge-gebenen Tabelle eindeutig sein. Die gleichen Spaltennamen können jedoch in unterschiedlichen Tabellen derselben Datenbank verwendet werden. Für jede Spalte muss ein Datentyp angegeben werden.

Erstellen einer Tabelle Wenn Sie in SQL Server Tabellen erstellen, sollten Sie die nachstehenden Aspekte berücksichtigen. Bei der Tabellenerstellung gelten die folgenden Maximalwerte:

� Zwei Milliarden Tabellen pro Datenbank. � 1.024 Spalten pro Tabelle. � 8.060 Byte pro Zeile (diese ungefähre maximale Länge gilt nicht für die

Datentypen image, text und ntext).

Sortieren von Spalten SQL Server unterstützt das Speichern von Objekten mit unterschiedlichen Sortierungen in der gleichen Datenbank. Auf der Spaltenebene können unterschiedliche SQL Server-Sortierungen angegeben werden, sodass jeder Spalte in einer Tabelle eine andere Sortierung zugewiesen werden kann.

Angeben von NULL oder NOT NULL In der Tabellendefinition können Sie angeben, ob NULL-Werte in den einzel-nen Spalten zulässig sind. Falls Sie NULL oder NOT NULL nicht angeben, stellt SQL Server die NULL- oder NOT NULL-Merkmale auf Basis des Stan-dardwertes auf Sitzungs- oder Datenbankebene bereit. Diese Standardwerte können sich jedoch ändern, sodass Sie sich nicht auf die Werte verlassen soll-ten. SQL Server verwendet standardmäßig den Wert NOT NULL.

ThemaErläutern Sie, wie Tabellen erstellt und gelöscht werden.

EinstiegBeim Erstellen einer Tabelle müssen Sie den Tabellen-namen, die Spaltennamen und die Datentypen angeben.

Methodischer Hinweis Führen Sie den Kursteil-nehmern vor, wie eine Tabelle mit SQL Server Enterprise Manager erstellt wird.

Page 221: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 4: Erstellen von Datentypen und Tabellen 15

CREATE TABLE table_namecolumn_name data type [COLLATE<collation_name>] [NULL | NOT NULL] | column_name AS computed_column_expression [,….n]

Im folgenden Beispiel wird die dbo.CategoriesNew-Tabelle erstellt, indem Folgendes angegeben wird: Die Spalten der Tabelle, ein Datentyp für jede Spalte und ob die Spalte NULL-Werte zulässt.

CREATE TABLE dbo.CategoriesNew (CategoryID int IDENTITY

(1, 1) NOT NULL, CategoryName nvarchar(15) NOT NULL, Beschreibung ntext NULL, Picture image NULL)

Zum Anzeigen von Tabelleneigenschaften klicken Sie mit der rechten Maustaste auf eine Tabelle in SQL Server Enterprise Manager oder führen die gespeicherte Systemprozedur sp_help und anschließend einen Bild-lauf nach rechts aus.

Berechnete Spalten Eine berechnete Spalte ist eine virtuelle Spalte, die nicht physisch in der Tabelle gespeichert ist. SQL Server verwendet eine von Ihnen erstellte Formel, um diesen Spaltenwert unter Verwendung von anderen Spalten in der gleichen Tabelle zu berechnen. Mit der Verwendung des Namens einer berechneten Spalte in einer Abfrage kann die Abfragesyntax vereinfacht werden.

Löschen einer Tabelle Durch Löschen einer Tabelle werden die Tabellendefinition und alle Daten sowie die Berechtigungen für die Tabelle entfernt.

Bevor Sie eine Tabelle löschen können, sollten Sie alle Abhängigkeiten zwischen der Tabelle und anderen Objekten entfernen. Zum Anzeigen vor-handener Abhängigkeiten führen Sie die gespeicherte Systemprozedur sp_depends aus.

DROP TABLE table_name [,…n]

Teilsyntax

Beispiel

Anmerkung

Syntax

Page 222: Programmieren Einer Microsoft SQL Server 2000-Datenbank

16 Unterrichtseinheit 4: Erstellen von Datentypen und Tabellen

Hinzufügen und Löschen einer Spalte

ALTER TABLE CategoriesNewADD Commission money null

ALTER TABLE CategoriesNewADD Commission money null

Hinzu-fügen

ALTER TABLE CategoriesNewDROP COLUMN Sales_date

ALTER TABLE CategoriesNewDROP COLUMN Sales_date

Löschen

Customer_nameCustomer_name Sales_amountSales_amount Sales_dateSales_date Customer IDCustomer ID CommissionCommission

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Zwei Möglichkeiten zum Ändern von Tabellen sind das Hinzufügen und Löschen von Spalten.

ALTER TABLE table{| [ALTER COLUMN column_name ]

|{ ADD { < column_definition > ::= column_name data_type { [ NULL | NOT NULL ] | DROP column column_name} [,…n]

Hinzufügen einer Spalte Die Informationen, die Sie beim Hinzufügen einer Spalte angeben, ähneln den Informationen, die Sie beim Erstellen einer Tabelle angeben.

In diesem Beispiel wird eine Spalte hinzugefügt, die NULL-Werte zulässt.

ALTER TABLE CategoriesNew ADD Commission money null

Löschen einer Spalte Gelöschte Spalten können nicht wiederhergestellt werden. Daher sollten Sie sich sicher sein, dass eine Spalte auch wirklich gelöscht werden soll, bevor Sie diesen Schritt durchführen.

In diesem Beispiel wird eine Spalte aus einer Tabelle gelöscht.

ALTER TABLE CategoriesNew DROP COLUMN Sales_date

Alle auf einer Spalte basierenden Indizes und Einschränkungen müssen entfernt werden, bevor die Spalte gelöscht werden kann.

ThemaZeigen Sie den Kursteil-nehmern, wie Spalten hinzugefügt und gelöscht werden.

EinstiegFalls sich die Anforderungen ändern, müssen Sie mög-licherweise Tabellen ändern, indem Sie Spalten hinzufügen oder löschen.

Teilsyntax

Beispiel

Beispiel

Anmerkung

Page 223: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 4: Erstellen von Datentypen und Tabellen 17

���� Generieren von Spaltenwerten

� Verwenden der IDENTITY-Eigenschaft

� Verwenden der NEWID-Funktion und des „uniqueidentifier“-Datentyps

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Es gibt mehrere Features, mit denen Sie Spaltenwerte generieren können: Die IDENTITY-Eigenschaft, die NEWID-Funktion und der uniqueidentifier-Datentyp.

ThemaStellen Sie die Themen dieses Abschnitts vor.

EinstiegIn diesem Abschnitt wird beschrieben, wie Spalten-werte generiert werden.

Page 224: Programmieren Einer Microsoft SQL Server 2000-Datenbank

18 Unterrichtseinheit 4: Erstellen von Datentypen und Tabellen

Verwenden der IDENTITY-Eigenschaft

� Anforderungen für das Verwenden der IDENTITY-Eigenschaft� Es ist nur eine Identitätsspalte pro Tabelle zulässig� Verwenden mit den Datentypen integer, numeric und

decimal� Abrufen von Informationen über die IDENTITY-Eigenschaft

� Verwenden von IDENT_SEED und IDENT_INCR für Definitionsinformationen

� Verwenden von @@identity zur Bestimmung des aktuellsten Wertes

� Verwalten der IDENTITY-Eigenschaft

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Mit der IDENTITY-Eigenschaft können Sie Spalten (Identitätsspalten) mit vom System generierten sequenziellen Werten erstellen, die jede in eine Tabelle ein-gefügte Zeile kennzeichnen. Eine Identitätsspalte wird häufig für primäre Schlüsselwerte verwendet.

Die automatische Bereitstellung von Schlüsselwerten durch SQL Server kann zu einer Verringerung der Kosten und einer Verbesserung der Leistung bei-tragen. Die Programmierung wird vereinfacht, primäre Schlüsselwerte werden kurz gehalten und die Häufigkeit von Engpässen durch Transaktionen von Benutzern wird verringert.

CREATE TABLE table (column_name data_type [ IDENTITY [(seed, increment)]] NOT NULL )

Bei Verwendung der IDENTITY-Eigenschaft sollten Sie die folgenden Anfor-derungen berücksichtigen:

� Es ist nur eine Identitätsspalte pro Tabelle zulässig. � Identitätsspalten müssen vom Datentyp integer (int, bigint, smallint oder

tinyint), numeric oder decimal sein. Die Datentypen numeric und decimalmüssen mit 0 Dezimalstellen angegeben werden.

� Sie kann nicht aktualisiert werden. � Sie können das IDENTITYCOL-Schlüsselwort anstelle des Spaltennamens

in einer Abfrage verwenden. Auf diese Weise können Sie auf die Spalte in der Tabelle verweisen, die über die IDENTITY-Eigenschaft verfügt, ohne den Spaltennamen kennen zu müssen.

� NULL-Werte sind nicht zulässig.

ThemaErläutern Sie, wie die IDENTITY-Eigenschaft verwendet wird.

EinstiegEine Identitätsspalte wird häufig für primäre Schlüsselwerte verwendet.

Methodischer Hinweis Falls Sie nicht die auto-matische Vergrößerung verwenden, muss eine Abfrage zum Suchen des nächsten Wertes ausgeführt werden.

Teilsyntax

Um zu ermitteln, welcher Datentyp zur Definition der Spalte mit Hilfe der IDENTITY-Eigenschaft verwendet werden soll, versuchen Sie, die Anzahl der in der Tabelle enthal-tenen Zeilen zu schätzen.

Page 225: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 4: Erstellen von Datentypen und Tabellen 19

Es bestehen mehrere Möglichkeiten, um Informationen über die IDENTITY-Eigenschaft abzurufen:

� Zwei Systemfunktionen geben Informationen über die Definition einer Identitätsspalte zurück: IDENT_SEED (gibt den Ausgangswert zurück) und IDENT_INCR (gibt den Schrittweitenwert zurück).

� Sie können Daten aus Identitätsspalten mit Hilfe der globalen Variable @@identity abrufen, die den Wert der letzten Zeile ermittelt, die während einer Sitzung in eine Identitätsspalte eingefügt wurde.

� SCOPE_IDENTITY gibt den letzten IDENTITY-Wert zurück, der in eine IDENTITY-Spalte im selben Bereich eingefügt wurde. Ein Bereich ist eine gespeicherte Prozedur, ein Trigger, eine Funktion oder ein Batch.

� IDENT_CURRENT gibt den letzten IDENTITY-Wert zurück, der für eine angegebene Tabelle in einer beliebigen Sitzung und in einem beliebigen Bereich generiert wurde.

Es bestehen mehrere Möglichkeiten zum Verwalten der IDENTITY-Eigenschaft:

� Sie können gestatten, dass explizite Werte in die Identitätsspalte einer Tabelle eingefügt werden, indem Sie die Option IDENTITY_INSERT aktivieren. Wenn IDENTITY_INSERT aktiviert ist, müssen INSERT-Anweisungen einen Wert liefern.

� Um den aktuellen IDENTITY-Wert einer Tabelle zu prüfen und gegebe-nenfalls zu korrigieren, können Sie die DBCC CHECKIDENT-Anweisung verwenden. DBCC CHECKIDENT ermöglicht Ihnen, den aktuellen IDENTITY-Wert mit dem Maximalwert in der Identitätsspalte zu ver-gleichen.

Die IDENTITY-Eigenschaft erzwingt keine Eindeutigkeit. Sie können Eindeutigkeit erzwingen, indem Sie einen eindeutigen Index erstellen.

In diesem Beispiel wird eine Tabelle mit zwei Spalten, StudentId und Name,erstellt. Die IDENTITY-Eigenschaft erhöht automatisch den Wert in jeder Zeile, die zur StudentId-Spalte hinzugefügt wird. Der Ausgangswert wird auf 100 festgelegt, der Schrittweitenwert auf 5. Die Werte in den Spalten wären 100, 105, 110, 115 usw. Durch die Verwendung des Schrittweitenwertes 5 können Sie Datensätze zu einem späteren Zeitpunkt zwischen den Werten einfügen.

CREATE TABLE Class (StudentID int IDENTITY(100, 5) NOT NULL, Name varchar(16))

Anmerkung

Beispiel

Page 226: Programmieren Einer Microsoft SQL Server 2000-Datenbank

20 Unterrichtseinheit 4: Erstellen von Datentypen und Tabellen

Verwenden der NEWID-Funktion und des „uniqueidentifier“-Datentyps

� Diese Funktionen werden zusammen verwendet

� Gewährleisten von globaler Eindeutigkeit der Werte

� Verwenden mit der DEFAULT-Einschränkung

CREATE TABLE Customer(CustID uniqueidentifier NOT NULL DEFAULT NEWID(),CustName char(30) NOT NULL)

CREATE TABLE Customer(CustID uniqueidentifier NOT NULL DEFAULT NEWID(),CustName char(30) NOT NULL)

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Der uniqueidentifier-Datentyp und die NEWID-Funktion sind zwei Features, die zusammen eingesetzt werden. Verwenden Sie diese Features, wenn Daten aus zahlreichen Tabellen in einer größeren Tabelle sortiert werden und die Eindeutigkeit zwischen allen Datensätzen aufrecht erhalten werden muss:

� Der uniqueidentifier-Datentyp speichert eine eindeutige ID als binäre 16-Byte-Zeichenfolge. Dieser Datentyp wird zum Speichern eines global eindeutigen Bezeichners (Global Unique Identifier, GUID) verwendet.

� Die NEWID-Funktion erstellt eine eindeutige ID, die eine GUID mit Hilfe des uniqueidentifier-Datentyps speichern kann.

� Im Gegensatz zur IDENTITY-Eigenschaft generiert der uniqueidentifier-Datentyp nicht automatisch neue IDs für eingefügte Zeilen. Um neue uniqueidentifier-Werte zu erhalten, müssen Sie eine Tabelle mit einer DEFAULT-Einschränkung definieren, mit der die NEWID-Funktion ange-geben wird. Wenn Sie eine INSERT-Anweisung verwenden, müssen Sie ebenfalls die NEWID-Funktion angeben.

In diesem Beispiel wird die Kunden-ID-Spalte (CustID) der Customer-Tabelle mit einem uniqueidentifier-Datentyp mit dem von der NEWID-Funktion generierten Standardwert erstellt. Für jede neue und vorhandene Zeile wird ein eindeutiger Wert für die CustId-Spalte generiert.

CREATE TABLE Customer(CustID uniqueidentifier NOT NULL DEFAULT NEWID(), CustName char(30) NOT NULL)

ThemaBeschreiben Sie, wie diese Features eingesetzt werden.

EinstiegDer uniqueidentifier-Datentyp und die NEWID-Funktion sind zwei Features, die zusammen eingesetzt werden.

Beispiel

Page 227: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 4: Erstellen von Datentypen und Tabellen 21

Generieren von Skripts

� Generieren eines Schemas als Transact-SQL-Skript� Verwalten eines Sicherungsskripts� Erstellen oder Aktualisieren von Datenbank-

Entwicklungsskripts� Erstellen einer Test- oder Entwicklungsumgebung� Schulung von neuen Mitarbeitern

� Was erstellt werden kann� Eine ganze Datenbank in einer einzigen Skriptdatei� Nur-Tabellen-Schema � Tabellen- und Indexschema

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Beim Erstellen von Objekten in einer Datenbank sollten alle Objektdefinitionen in einer Skriptdatei gespeichert werden.

Generieren eines Schemas als Transact-SQL-Skript Mit Hilfe von SQL Server Enterprise Manager können Sie eine vorhandene Datenbankstruktur (Schema) dokumentieren, indem Sie das Schema als ein oder mehrere Transact SQL-Skripts generieren. Diese Transact SQL-Skripts enthalten Beschreibungen der Anweisungen, die zur Erstellung der Datenbank und ihrer Objekte verwendet wurden.

Die als Transact-SQL-Skripts generierten Schemas können für folgende Zwecke eingesetzt werden:

� Verwalten eines Sicherungsskripts, mit dessen Hilfe ein Benutzer alle Benutzer, Gruppen, Benutzernamen und Berechtigungen erneut erstellen kann.

� Erstellen oder Aktualisieren von Datenbankentwicklungsskripts.� Erstellen einer Test- oder Entwicklungsumgebung aus einem vorhandenen

Schema.� Schulung von neuen Mitarbeitern.

Was erstellt werden kann Sie können Folgendes erstellen:

� Eine ganze Datenbank in einer einzelnen Skriptdatei.� Nur-Tabellen-Schema für eine, mehrere oder alle Tabellen in einer Daten-

bank, das in einer oder mehreren Skriptdateien gespeichert wird.� Tabellen- und Indexschema, das in einer Skriptdatei gespeichert wird,

gespeicherte Prozeduren, die in einer anderen Skriptdatei gespeichert werden, sowie Standards und Regeln, die wiederum in einer anderen Skriptdatei gespeichert werden.

ThemaBeschreiben Sie, wie eine Skriptdatei generiert wird.

EinstiegBeim Erstellen von Objekten in einer Datenbank sollten alle Objektdefinitionen in einer Skriptdatei gespeichert werden.

Methodischer Hinweis Führen Sie den Kursteil-nehmern vor, wie mit Hilfe der Northwind-Datenbank ein Skript erstellt wird.

Page 228: Programmieren Einer Microsoft SQL Server 2000-Datenbank

22 Unterrichtseinheit 4: Erstellen von Datentypen und Tabellen

Empfohlene Methoden

Geben Sie immer die Spalteneigenschaften in CREATE TABLE anGeben Sie immer die Spalteneigenschaften in CREATE TABLE an

Generieren Sie Skripts, mit deren Hilfe Sie die Datenbank und ihre Objekte erneut erstellen könnenGenerieren Sie Skripts, mit deren Hilfe Sie die Datenbank und ihre Objekte erneut erstellen können

Legen Sie die geeigneten Datentypen und Datentypgrößen festLegen Sie die geeigneten Datentypen und Datentypgrößen fest

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Die folgenden empfohlenen Methoden unterstützen Sie beim Erstellen von Datentypen und Tabellen:

� Geben Sie die geeigneten Datentypen und Datentypgrößen an. � Wenn Sie eine CREATE TABLE-Anweisung schreiben, geben Sie immer

die Spalteneigenschaften an. � Generieren Sie nach dem Erstellen einer Datenbank und der Datenbank-

objekte ein Skript, mit dessen Hilfe Sie die Datenbank und ihre Objekte erneut erstellen können.

ThemaErläutern Sie die empfoh-lenen Methoden zum Er-stellen von Datentypen und Tabellen.

EinstiegIm Folgenden sind die empfohlenen Methoden zum Erstellen von Datentypen und Tabellen aufgeführt.

Page 229: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 4: Erstellen von Datentypen und Tabellen 23

Übungseinheit A: Erstellen von Datentypen und Tabellen

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

LernzieleAm Ende dieser Übungseinheit werden Sie in der Lage sein, die folgenden Aufgaben auszuführen:

� Erstellen von benutzerdefinierten Datentypen. � Erstellen von Tabellen. � Hinzufügen und Löschen von Spalten. � Erstellen von Transact-SQL-Skripts von einer Datenbank.

VoraussetzungenUm diese Übungseinheit zu bearbeiten, benötigen Sie Folgendes:

� Die Skriptdateien für diese Übungseinheit, die sich in C:\Moc\2328A\Labfiles\L04 befinden.

� Die Antwortdateien für diese Übungseinheit, die sich in C:\Moc\2328A\Labfiles\L04\Answers befinden.

Einrichten der ÜbungseinheitDamit Sie diese Übungseinheit bearbeiten können, muss eine der folgenden Voraussetzungen erfüllt sein:

� Die vorhergehende Übungseinheit muss durchgearbeitet worden sein. � Die Batchdatei C:\Moc\2328A\Batches\Restore04.cmd muss ausgeführt

worden sein. Mit dieser Befehlsdatei wird die ClassNorthwind-Datenbank wieder in den Zustand zurückversetzt, der für die Übungseinheit Voraussetzung ist.

ThemaGeben Sie eine Einführung in die Übungseinheit.

EinstiegIn dieser Übungseinheit erstellen Sie benutzer-definierte Datentypen, Tabellen, fügen Spalten hinzu löschen sie und generieren Skripts.

Page 230: Programmieren Einer Microsoft SQL Server 2000-Datenbank

24 Unterrichtseinheit 4: Erstellen von Datentypen und Tabellen

Weitere Informationen Sollten Sie beim Ausführen von Dateien Hilfe benötigen, suchen Sie in der Hilfe von SQL Query Analyzer nach „Ausführen einer Abfrage“.

Daneben sind die folgenden Informationsquellen verfügbar:

� Das Northwind-Datenbankschema. � Die Microsoft SQL Server-Onlinedokumentation.

SzenarioDer Aufbau des Schulungsraumes soll die Organisation des weltweit agieren-den Handelsunternehmens Northwind Traders widerspiegeln. Das Unternehmen hat den fiktiven Domänennamen nwtraders.msft. Der primäre DNS-Server für nwtraders.msft ist der Kursleitercomputer, dessen IP-Adresse (Internetproto-koll) 192.168.x.200 lautet (wobei x die zugewiesene Schulungsraumnummer ist). Der Name des Kursleitercomputers ist London.

Die folgende Tabelle stellt den Benutzernamen, den Computernamen und die IP-Adresse für jeden Kursteilnehmercomputer in der fiktiven Domäne nwtraders.msft bereit. Suchen Sie den Ihrem Computer zugewiesenen Benutzernamen und notieren Sie ihn.

Benutzername Computername IP-Adresse

SQLAdmin1 Vancouver 192.168.x.1SQLAdmin2 Denver 192.168.x.2SQLAdmin3 Perth 192.168.x.3SQLAdmin4 Brisbane 192.168.x.4SQLAdmin5 Lisbon 192.168.x.5SQLAdmin6 Bonn 192.168.x.6SQLAdmin7 Lima 192.168.x.7SQLAdmin8 Santiago 192.168.x.8SQLAdmin9 Bangalore 192.168.x.9SQLAdmin10 Singapore 192.168.x.10SQLAdmin11 Casablanca 192.168.x.11SQLAdmin12 Tunis 192.168.x.12SQLAdmin13 Acapulco 192.168.x.13SQLAdmin14 Miami 192.168.x.14SQLAdmin15 Auckland 192.168.x.15SQLAdmin16 Suva 192.168.x.16SQLAdmin17 Stockholm 192.168.x.17SQLAdmin18 Moscow 192.168.x.18SQLAdmin19 Caracas 192.168.x.19SQLAdmin20 Montevideo 192.168.x.20SQLAdmin21 Manila 192.168.x.21SQLAdmin22 Tokyo 192.168.x.22SQLAdmin23 Khartoum 192.168.x.23SQLAdmin24 Nairobi 192.168.x.24

Veranschlagte Zeit für die Übungseinheit: 30 Minuten

Page 231: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 4: Erstellen von Datentypen und Tabellen 25

Übung 1 Erstellen benutzerdefinierter Datentypen

In dieser Übung erstellen Sie benutzerdefinierte Datentypen für die ClassNorthwind-Datenbank.

� So führen Sie ein Skript aus, das einen benutzerdefinierten Datentyp erstellt

In diesem Verfahren führen Sie ein Skript aus, mit dessen Hilfe ein benutzerdefinierter Datentyp in der ClassNorthwind-Datenbank erstellt wird. 1. Melden Sie sich an der Schulungsraumdomäne nwtraders mit Hilfe der

Informationen in der folgenden Tabelle an.

Option Eingabe

Benutzername SQLAdminx (wobei x die Ihren Computernamen zugewiesene Nummer ist, wie in der Schulungsraumdomäne nwtraders.msftfestgelegt)

Kennwort password

2. Öffnen Sie SQL Query Analyzer, und melden Sie sich, wenn Sie dazu aufgefordert werden, mittels Microsoft Windows®-Authentifizierung am (lokalen) Server an. Sie verfügen über die Berechtigung, sich bei SQL Server anzumelden und SQL Server zu verwalten, da Sie als SQLAdminx angemeldet sind und SQLAdminx ein Mitglieder der lokalen Microsoft Windows 2000-Gruppe Administratoren ist. Allen Mitgliedern dieser Gruppe ist automatisch die SQL Server-Rolle sysadmin zugeordnet.

3. Klicken Sie in der Liste DB auf ClassNorthwind.4. Öffnen und überprüfen Sie die Skriptdatei Creatyp1.sql im Verzeichnis

C:\Moc\2328A\Labfiles\L04.Mit diesem Skript wird ein neuer Datentyp mit Namen postalcode erstellt, der bis zu 10 Byte Zeichendaten enthalten und auch NULL sein kann.

5. Führen Sie Creatyp1.sql aus. 6. Öffnen und überprüfen Sie die Skriptdatei Vertype.sql im Verzeichnis

C:\Moc\2328A\Labfiles\L04, und führen Sie sie aus. Überprüfen Sie, ob der Datentyp erstellt wurde.

Page 232: Programmieren Einer Microsoft SQL Server 2000-Datenbank

26 Unterrichtseinheit 4: Erstellen von Datentypen und Tabellen

� So erstellen Sie benutzerdefinierte Datentypen In diesem Verfahren erstellen Sie Anweisungen, mit denen benutzerdefinierte Datentypen in der ClassNorthwind-Datenbank erstellt werden, und führen die Anweisungen dann aus. Ein vollständiges Transact-SQL-Skript für dieses Verfahren befindet sich im Verzeichnis C:\Moc\2328A\Labfiles\L04\Answers\Creatyp2.sql.1. Stellen Sie sicher, dass Sie die ClassNorthwind-Datenbank verwenden. 2. Schreiben Sie Anweisungen zum Erstellen der in der folgenden Tabelle

beschriebenen benutzerdefinierten Datentypen, und führen Sie diese An-weisungen aus.

Datentyp Beschreibung der Daten

City Bis zu 15 Byte Zeichendaten, die NULL sein können

Region Bis zu 15 Byte Zeichendaten, die NULL sein können

Country Bis zu 15 Byte Zeichendaten, die NULL sein können

EXEC sp_addtype city, 'nvarchar(15)', NULL EXEC sp_addtype region, 'nvarchar(15)', NULL EXEC sp_addtype country, 'varchar(15)', NULL

3. Öffnen Sie Vertype.sql, und führen Sie das Skript aus, um zu überprüfen, ob die Datentypen erstellt wurden.

Page 233: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 4: Erstellen von Datentypen und Tabellen 27

Übung 2 Erstellen von Tabellen in der „ClassNorthwind“-Datenbank

In dieser Übung erstellen Sie alle Tabellen für die ClassNorthwind-Datenbank.

� So führen Sie ein Skript aus, das eine Tabelle erstellt In diesem Verfahren führen Sie ein Skript aus, das die Employees-Tabelle in der ClassNorthwind-Datenbank erstellt. 1. Öffnen und überprüfen Sie die Skriptdatei Creatab1.sql im Verzeichnis

C:\Moc\2328A\Labfiles\L04.Dieses Skript erstellt die Employees-Tabelle in der ClassNorthwind-Datenbank.

2. Führen Sie Creatab1.sql aus.

� So erstellen Sie eine Tabelle mit Hilfe von Anweisungen In diesem Verfahren schreiben Sie eine Anweisung, die die Suppliers-Tabelle in der ClassNorthwind-Datenbank erstellt, und führen diese aus. Ein vollständiges Transact-SQL-Skript für dieses Verfahren befindet sich in C:\Moc\2328A\Labfiles\L04\Answers\Creatab2.sql.1. Stellen Sie sicher, dass Sie die ClassNorthwind-Datenbank verwenden. 2. Schreiben Sie eine Anweisung zum Erstellen der Suppliers-Tabelle, wobei

Sie die folgenden Spaltennamen und ihre jeweiligen Datentypen definieren. Führen Sie dann die Anweisung aus.

Page 234: Programmieren Einer Microsoft SQL Server 2000-Datenbank

28 Unterrichtseinheit 4: Erstellen von Datentypen und Tabellen

Stellen Sie sicher, dass die Spalten SupplierID und CompanyName keine NULL-Werte, alle anderen Spalten hingegen NULL-Werte zulassen.

Spaltenname Datentyp NULL-Wertezulässig

IDENTITY-Eigenschaft

SupplierID int Nein Anfangswert = 1 Schrittweite = 1

CompanyName nvarchar (40) Nein Nein

ContactName nvarchar (30) Ja Nein

ContactTitle nvarchar (30) Ja Nein

Adresse nvarchar (60) Ja Nein

City city Ja Nein

Region region Ja Nein

PostalCode postalcode Ja Nein

Country country Ja Nein

Phone nvarchar (24) Ja Nein

Fax nvarchar (24) Ja Nein

HomePage ntext Ja Nein

CREATE TABLE Suppliers

(SupplierID int IDENTITY(1,1) NOT NULL,

CompanyName nvarchar (40) NOT NULL,

ContactName nvarchar (30) NULL,

ContactTitle nvarchar (30) NULL,

Address nvarchar (60) NULL,

City city NULL,

Region region NULL,

PostalCode postalcode NULL,

Country country NULL,

Phone nvarchar (24) NULL,

Fax nvarchar (24) NULL,

HomePage ntext NULL)

Welche Datentypen sind benutzerdefiniert? City, region, postalcode und country. ____________________________________________________________

____________________________________________________________

Page 235: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 4: Erstellen von Datentypen und Tabellen 29

� So erstellen Sie eine Tabelle mit SQL Server Enterprise Manager In diesem Verfahren verwenden Sie SQL Server Enterprise Manager zum Er-stellen der Customers-Tabelle in der ClassNorthwind-Datenbank. 1. Öffnen Sie SQL Server Enterprise Manager. 2. Erweitern Sie Microsoft SQL Servers, erweitern Sie SQL Server-Gruppe,

erweitern Sie Ihren Server, und erweitern Sie anschließend Datenbanken.3. Klicken Sie mit der rechten Maustaste auf ClassNorthwind, zeigen Sie auf

Neu, und klicken Sie dann auf Tabelle.4. Erstellen Sie die Customers-Tabelle anhand der Angaben in der nach-

stehenden Tabelle, und definieren Sie die Spaltennamen sowie die ent-sprechenden Datentypen. Stellen Sie sicher, dass die Spalten CustomerID und CompanyName keine NULL-Werte zulassen. Stellen Sie sicher, dass alle anderen Spalten NULL-Werte zulassen.

Spaltenname Datentyp NULL-Werte zulässig?

CustomerID nchar (5) Nein

CompanyName nvarchar (40) Nein

ContactName nvarchar (40) Ja

ContactTitle nvarchar (30) Ja

Address nvarchar (60) Ja

City city Ja

Region region Ja

PostalCode postalcode Ja

Country country Ja

Phone nvarchar (24) Ja

Fax nvarchar (24) Ja

5. Speichern Sie die neue Tabelle als Customers, und schließen Sie das Fenster Neue Tabelle.

� So führen Sie ein Skript aus, das alle Tabellen in der „ClassNorthwind“-Datenbank erstellt

In diesem Verfahren führen Sie ein Skript aus, das alle Tabellen in der ClassNorthwind-Datenbank erstellt. 1. Wechseln Sie zu SQL Query Analyzer. 2. Öffnen und überprüfen Sie die Skriptdatei Creatab3.sql im Verzeichnis

C:\Moc\2328A\Labfiles\L04, und führen Sie sie aus. Dieses Skript erstellt alle Tabellen in der ClassNorthwind-Datenbank. Es löscht zunächst alle zuvor erstellten Tabellen.

Page 236: Programmieren Einer Microsoft SQL Server 2000-Datenbank

30 Unterrichtseinheit 4: Erstellen von Datentypen und Tabellen

Übung 3 Hinzufügen und Löschen von Spalten

In dieser Übung fügen Sie mit der ALTER TABLE-Anweisung Spalten zu einer Tabelle hinzu und löschen Spalten aus einer Tabelle in der ClassNorthwind-Datenbank.

� So fügen Sie eine Spalte zu einer Tabelle hinzu In diesem Verfahren schreiben Sie eine Anweisung, die eine Spalte zur Employees-Tabelle in der ClassNorthwind-Datenbank hinzufügt, und führen diese aus. Ein vollständiges Transact-SQL-Skript für dieses Verfahren befindet sich in C:\Moc\2328A\Labfiles\L04\Answers\Addcol.sql.1. Stellen Sie sicher, dass Sie die ClassNorthwind-Datenbank verwenden. 2. Schreiben Sie eine Anweisung zum Hinzufügen einer Spalte zur

Employees-Tabelle, und führen Sie diese aus. Die Spalte soll den Namen Age erhalten, den tinyint-Datentyp verwenden und NULL-Werte zulassen. ALTER TABLE Employees ADD Age tinyint NULL GO

3. Führen Sie die gespeicherte Systemprozedur sp_help für die Employees-Tabelle aus, um zu überprüfen, ob die Age-Spalte wie angegeben definiert wurde. Beachten Sie, dass die Age-Spalte als letzte Spalte in der Tabelle angezeigt wird. EXEC sp_help Employees GO

� So löschen Sie eine Spalte aus einer Tabelle Nachdem Sie mit den Benutzern die Clientanforderungen durchgegangen sind, haben Sie festgestellt, dass die Age-Spalte nicht benötigt wird. In diesem Ver-fahren schreiben Sie eine Anweisung, die die Age-Spalte aus der Employees-Tabelle in der ClassNorthwind-Datenbank löscht, und führen diese aus. Ein vollständiges Transact-SQL-Skript für dieses Verfahren befindet sich in C:\Moc\2328A\Labfiles\L04\Answers\Dropcol.sql.1. Stellen Sie sicher, dass Sie die ClassNorthwind-Datenbank verwenden. 2. Schreiben Sie eine Anweisung, die die Age-Spalte aus der Employees-

Tabelle löscht, und führen Sie diese aus. ALTER TABLE Employees DROP COLUMN Age GO

3. Führen Sie die gespeicherte Systemprozedur sp_help für die Employees-Tabelle aus, um zu überprüfen, ob die Age-Spalte gelöscht wurde. EXEC sp_help Employees GO

Page 237: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 4: Erstellen von Datentypen und Tabellen 31

Übung 4 Generieren von Transact-SQL-Skripts

In dieser Übung erstellen Sie mit Hilfe von SQL Server Enterprise Manager Transact-SQL-Skripts von Objekten, die Sie in der ClassNorthwind-Datenbank erstellt haben.

� So generieren Sie Skripts zum erneuten Erstellen von Objekten In diesem Verfahren generieren Sie mit Hilfe von SQL Server Enterprise Manager ein Transact-SQL-Skript, mit dem alle Objekte neu erstellt werden können, die Sie in der ClassNorthwind-Datenbank erstellt haben. 1. Wechseln Sie zu SQL Server Enterprise Manager. 2. Erweitern Sie Microsoft SQL Servers, erweitern Sie SQL Server-Gruppe,

erweitern Sie Ihren Server, und erweitern Sie anschließend Datenbanken.3. Klicken Sie mit der rechten Maustaste auf ClassNorthwind, zeigen Sie auf

Alle Tasks, und klicken Sie dann auf SQL-Skript generieren.4. Klicken Sie auf der Registerkarte Allgemein auf Alle anzeigen.5. Aktivieren Sie die Kontrollkästchen Alle Tabellen und Alle benutzer-

definierten Datentypen, und klicken Sie auf OK.6. Speichern Sie diese Skriptdatei als L04.sql.7. Öffnen und überprüfen Sie das generierte Skript.

Page 238: Programmieren Einer Microsoft SQL Server 2000-Datenbank

32 Unterrichtseinheit 4: Erstellen von Datentypen und Tabellen

Übung 5 Füllen der „ClassNorthwind“-Datenbank mit Daten

In dieser Übung führen Sie mehrere Skripts aus, um die ClassNorthwind-Datenbank mit Daten zu füllen.

� So füllen Sie die „ClassNorthwind“-Datenbank mit Daten In diesem Verfahren führen Sie Skripts aus, die Beispieldaten generieren und die ClassNorthwind-Datenbank damit füllen. 1. Wechseln Sie zu SQL Query Analyzer. 2. Öffnen und überprüfen Sie die Skriptdatei Loaddata.sql im Verzeichnis

C:\Moc\2328A\Labfiles\L04.3. Führen Sie Loaddata.sql aus. Dieser Vorgang kann einige Minuten

beanspruchen. Überprüfen Sie die Ausgabe im Ergebnisbereich.

Page 239: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 4: Erstellen von Datentypen und Tabellen 33

Lernzielkontrolle

� Erstellen von Datentypen

� Erstellen von Tabellen

� Generieren von Spaltenwerten

� Generieren von Skripts

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

1. Kann ein in einer Datenbank verwendeter benutzerdefinierter Datentyp in einer anderen Datenbank von SQL Server verwendet werden? Nein. Benutzerdefinierte Datentypen sind auf eine einzelne Datenbank beschränkt. Sie können einen entsprechenden Datentyp in einer anderen Datenbank erstellen, oder Sie können benutzerdefinierte Datentypen in der „model“-Datenbank erstellen.

2. Sie entwerfen gerade eine Datenbank, in der Informationen über Millionen von unterschiedlichen Produkten gespeichert werden sollen. Sie möchten den Speicherplatz minimieren, der zum Speichern der Produktinformationen benötigt wird. Jedes Produkt verfügt über eine Beschreibungszeile in der products-Tabelle. Gelegentlich erfordert eine Produktbeschreibung bis zu 200 Zeichen, in der Regel werden jedoch nur 50 Zeichen benötigt. Welchen Datentyp würden Sie verwenden? Sie verwenden den Datentyp „varchar(200)“, um die Zeilen kompakt zu halten und um hiermit gleichzeitig auch die gelegentlich auftretenden Produktbeschreibungen mit bis zu 200 Byte zu ermöglichen.

3. Sie müssen ein Skript ausführen, das mit SQL Server Enterprise Manager erstellt wurde. Wie gehen Sie hierbei vor? Sie öffnen das Skript mit SQL Query Analyser oder „osql“ und führen es aus.

ThemaVertiefen Sie die Lernziele dieser Unterrichtseinheit, indem Sie die Kernpunkte wiederholen.

EinstiegDie Fragen zur Lernziel-kontrolle beziehen sich auf einige der Schlüsselkon-zepte, die Inhalt dieser Unterrichtseinheit sind.

Page 240: Programmieren Einer Microsoft SQL Server 2000-Datenbank

This page is intentionally left blank.

Page 241: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Inhalt

Übersicht 1

Datenintegritätstypen 2

Erzwingen der Datenintegrität 3

Definieren von Einschränkungen 4

Einschränkungstypen 10

Deaktivieren von Einschränkungen 20

Verwenden von Standardwerten und Regeln 25

Auswählen der geeigneten Methode zum Erzwingen der Datenintegrität 27

Empfohlene Methoden 29

Übungseinheit A: Implementieren der Datenintegrität 30

Lernzielkontrolle 41

Unterrichtseinheit 5: Implementieren der Datenintegrität

Page 242: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Die in diesen Unterlagen enthaltenen Angaben und Daten können ohne vorherige Ankündigung geändert werden. Die in diesen Unterlagen genannten Firmen, Produkte, Menschen, Charaktere und/oder Daten sind frei erfunden und sollen keine wirklichen Individuen, Gesellschaften, Produkte oder Veranstaltungen darstellen, soweit nichts anderes angegeben ist. Die Benutzer/innen sind verpflichtet, sich an alle anwendbaren Urheberrechtsgesetze zu halten. Ohne ausdrückliche schriftliche Erlaubnis der Microsoft Corporation darf kein Teil dieser Unterlagen für irgendwelche Zwecke vervielfältigt oder übertragen werden, unabhängig davon, auf welche Art und Weise oder mit welchen Mitteln, elektronisch oder mechanisch, dies geschieht. Wenn auf dieses Dokument nur auf elektronischem Wege zugegriffen werden kann, sind Sie hiermit berechtigt, eine (1) Kopie zum persönlichen Gebrauch auszudrucken.

Microsoft Corporation kann Inhaber von Patenten oder Patentanträgen, Marken, Urheberrechten oder anderen gewerblichen Schutzrechten sein, die den Inhalt dieses Dokuments betreffen. Die Bereitstellung dieses Dokuments gewährt keinerlei Lizenzrechte an diesen Patenten, Marken, Urheberrechten oder anderen gewerblichen Schutzrechten, es sei denn, dies wurde ausdrücklich durch einen schriftlichen Lizenzvertrag mit der Microsoft Corporation vereinbart.

2000 Microsoft Corporation. Alle Rechte vorbehalten.

Microsoft, ActiveX, BackOffice, MS-DOS, PowerPoint, Visual Basic, Visual C++, Visual Studio, Windows und Windows NT sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern.

Andere in diesem Dokument aufgeführte Produkt- und Firmennamen sind möglicherweise Marken der jeweiligen Eigentümer.

Project Lead: Rich Rose Instructional Designers: Rich Rose, Cheryl Hoople, Marilyn McGill Instructional Software Design Engineers: Karl Dehmer, Carl Raebler, Rick Byham Technical Lead: Karl Dehmer Subject Matter Experts: Karl Dehmer, Carl Raebler, Rick Byham Graphic Artist: Kirsten Larson (Independent Contractor) Editing Manager: Lynette Skinner Editor: Wendy Cleary Copy Editor: Edward McKillop (S&T Consulting) Production Manager: Miracle Davis Production Coordinator: Jenny Boe Production Support: Lori Walker (S&T Consulting) Test Manager: Sid Benavente Courseware Testing: TestingTesting123 Classroom Automation: Lorrin Smith-Bates Creative Director, Media/Sim Services: David Mahlmann Web Development Lead: Lisa Pease CD Build Specialist: Julie Challenger Online Support: David Myka (S&T Consulting) Localization Manager: Rick Terek Operations Coordinator: John Williams Manufacturing Support: Laura King; Kathy Hershey Lead Product Manager, Release Management: Bo Galford Lead Product Manager, Data Base: Margo Crandall Group Manager, Courseware Infrastructure: David Bramble Group Product Manager, Content Development: Dean Murray General Manager: Robert Stewart

Page 243: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 5: Implementieren der Datenintegrität iii

Hinweise für den Kursleiter Diese Unterrichtseinheit bietet den Kursteilnehmern eine Einführung in die Konzepte der Datenintegrität, einschließlich der Methoden, die zum Erzwingen der Datenintegrität verfügbar sind. Im Anschluss folgen eine Einführung zu Einschränkungen, die die zentrale Methode zum Sicherstellen der Datenintegri-tät darstellen, sowie eine Beschreibung der unterschiedlichen Einschränkungs-typen. In der Unterrichtseinheit werden die Erstellung und die Implementierung von Einschränkungen sowie die Verfahren, um Einschränkungen ggf. zu deaktivieren, detailliert erläutert.

Die Unterrichtseinheit behandelt weiterhin Standardwerte und Regeln, die eine alternative Methode zum Erzwingen der Datenintegrität bereitstellen, obwohl der Schwerpunkt auf den Einschränkungen liegt. Die Unterrichtseinheit endet mit einem Vergleich der unterschiedlichen Methoden zum Erzwingen der Datenintegrität.

In der Übungseinheit definieren die Kursteilnehmer DEFAULT-, CHECK-, PRIMARY KEY- und FOREIGN KEY-Einschränkungen.

Am Ende dieser Unterrichtseinheit werden die Kursteilnehmer in der Lage sein, die folgenden Aufgaben auszuführen:

� Beschreiben der Datenintegritätstypen. � Beschreiben der Methoden zum Erzwingen der Datenintegrität. � Bestimmen der geeigneten Einschränkung und Erstellen von Ein-

schränkungen.� Definieren und Verwenden von DEFAULT-, CHECK-, PRIMARY KEY-,

UNIQUE- und FOREIGN KEY-Einschränkungen. � Deaktivieren der Einschränkungsüberprüfung. � Beschreiben und Verwenden von Standardwerten und Regeln. � Bestimmen der geeigneten Methoden zum Erzwingen der Datenintegrität.

Unterlagen und Vorbereitung In diesem Abschnitt werden die erforderlichen Unterlagen und vorbereitenden Aufgaben erläutert, die nötig sind, um diese Unterrichtseinheit zu unterrichten.

Erforderliche Unterlagen Um diese Unterrichtseinheit zu unterrichten, benötigen Sie folgende Unterlagen:

� Die Microsoft® PowerPoint®-Datei 2328A_05.ppt� Die Beispieldatei C:\Moc\2328A\Demo\D05_Ex.sql, die alle Beispiel-

skripts der Unterrichtseinheit enthält, soweit in der Unterrichtseinheit nichts anderes angegeben ist.

Vorbereitende Aufgaben Zur Vorbereitung dieser Unterrichtseinheit gehen Sie folgendermaßen vor:

� Lesen Sie alle Unterlagen für diese Unterrichtseinheit. � Arbeiten Sie die Übungseinheit durch.

Präsentation:45 Minuten

Übungseinheit:30 Minuten

Page 244: Programmieren Einer Microsoft SQL Server 2000-Datenbank

iv Unterrichtseinheit 5: Implementieren der Datenintegrität

Strategie für die Unterrichtseinheit Verwenden Sie die folgende Strategie, um diese Unterrichtseinheit zu präsentieren:

� Datenintegritätstypen Dieses Thema dient als Wiederholung für Kursteilnehmer mit umfang-reichen Vorkenntnissen und als Einführung für Kursteilnehmer, die über weniger Erfahrung verfügen. Es umfasst eine Definition des Begriffs „Datenintegrität“ und beschreibt die unterschiedlichen Datenintegritäts-typen. Die einzelnen Themen sollten einen allgemein gültigen Charakter haben.

� Erzwingen der Datenintegrität Dieses Thema beschreibt die beiden Methoden zum Erzwingen der Daten-integrität: deklarative Datenintegrität und prozedurale Datenintegrität. Wei-sen Sie darauf hin, dass in dieser Unterrichtseinheit nur die Features der deklarativen Methode - Einschränkungen, Standardwerte und Regeln - be-handelt werden.

� Definieren von Einschränkungen Heben Sie hervor, dass Einschränkungen die bevorzugte Methode zum Erzwingen der Datenintegrität darstellen, das sie ANSI-kompatibel sind, und beschreiben Sie, wie Einschränkungen verwendet werden können. Geben Sie eine Einführung zu den unterschiedlichen Einschränkungstypen.

� Einschränkungstypen Dieser Abschnitt beschreibt die Einschränkungstypen. Für jede Einschrän-kung werden die Syntax, Beispiele sowie Aspekte aufgeführt, die bei der Verwendung berücksichtigt werden sollten. Achten Sie darauf, dass Sie die Bedeutung der Indizes beschreiben, die beim Definieren von Einschränkun-gen erstellt werden.

� Deaktivieren von Einschränkungen Dieser Abschnitt beschreibt das Verfahren zum Deaktivieren der Einschrän-kungsüberprüfung in Abhängigkeit davon, ob Sie eine neue Einschränkung erstellen oder eine vorhandene Einschränkung deaktivieren.

� Verwenden von Standardwerten und Regeln Dieser Abschnitt behandelt das Erstellen und Implementieren von Standard-werten und Regeln zum Erzwingen der Datenintegrität. Sie sollten jedoch unbedingt darauf hinweisen, dass die Verwendung von Einschränkungen der Verwendung von Standardwerten und Regeln vorzuziehen ist, da Standard-werte und Regeln nicht ANSI-kompatibel sind.

� Auswählen der geeigneten Methode zum Erzwingen der Datenintegrität Dieser Abschnitt vergleicht die Methoden zum Erzwingen der Datenintegri-tät im Hinblick auf Funktionalität und Kosten. Weisen Sie darauf hin, dass Trigger das Ändern von Daten ermöglichen, bevor die Integrität überprüft wurde, sodass ihre Verwendung, falls Probleme auftreten, sehr ressourcen-intensiv sein kann. Trigger sollten nur verwendet werden, wenn Einschrän-kungen allein nicht die erforderliche Funktionalität bereitstellen.

Page 245: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 5: Implementieren der Datenintegrität v

AnpassungsinformationenDieser Abschnitt beschreibt die Anforderungen zum Einrichten der Übungs-einheiten für eine Unterrichtseinheit sowie die Konfigurationsänderungen, die während der Übungseinheiten an den Kursteilnehmercomputern vorgenommen werden. Diese Informationen sollen Ihnen beim Replizieren oder Anpassen der Microsoft Official Curriculum-Courseware (MOC) helfen.

Die Übungseinheit in dieser Unterrichtseinheit hängt auch von der Schulungsraumkonfiguration ab, die im Abschnitt „Anpassungsinformationen“ am Ende des Dokuments Handbuch für das Einrichten von Schulungs-computern für Kurs 2328A, Programmieren einer Microsoft SQL Server 2000-Datenbank, angegeben ist.

Einrichten der Übungseinheit Der folgende Abschnitt beschreibt die Anforderungen zum Einrichten der Übungseinheit für diese Unterrichtseinheit.

Anforderung zum Einrichten der Übungseinheit Für die Übungseinheit in dieser Unterrichtseinheit muss die ClassNorthwind-Datenbank in den für diese Übungseinheit erforderlichen Zustand zurückver-setzt werden. Damit Kursteilnehmercomputer diese Anforderung erfüllen, müssen Sie eine der folgenden Aktionen durchführen:

� Bearbeiten der vorherigen Übungseinheit. � Ausführen der Batchdatei C:\Moc\2328A\Batches\Restore05.cmd.

Wenn dieser Kurs angepasst wurde, müssen die Kursteilnehmer die Batchdatei C:\Moc\2328A\Batches\Restore05.cmd ausführen, um sicherzu-stellen, dass die Übungseinheit ordnungsgemäß durchgeführt werden kann.

Ergebnisse der Übungseinheit Auf den Kursteilnehmercomputern gibt es keine Konfigurationsänderungen, die die Replikation oder die Anpassung betreffen.

Wichtig

Achtung

Page 246: Programmieren Einer Microsoft SQL Server 2000-Datenbank

vi Unterrichtseinheit 5: Implementieren der Datenintegrität

This page is intentionally left blank.

Page 247: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 5: Implementieren der Datenintegrität 1

Übersicht

� Datenintegritätstypen

� Erzwingen der Datenintegrität

� Definieren von Einschränkungen

� Einschränkungstypen

� Deaktivieren von Einschränkungen

� Verwenden von Standardwerten und Regeln

� Auswählen der geeigneten Methode zum Erzwingen der Datenintegrität

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Diese Unterrichtseinheit beginnt mit einer Einführung in die Konzepte der Datenintegrität, einschließlich der Methoden, die zum Erzwingen der Daten-integrität verfügbar sind. Im Anschluss folgen eine Einführung zu Einschrän-kungen, die die zentrale Methode zum Sicherstellen der Datenintegrität dar-stellen, sowie eine Beschreibung der unterschiedlichen Einschränkungstypen. In der Unterrichtseinheit werden die Erstellung und die Implementierung von Einschränkungen sowie die Verfahren, um Einschränkungen ggf. zu deakti-vieren, detailliert erläutert.

Die Unterrichtseinheit behandelt weiterhin Standardwerte und Regeln, die eine alternative Methode zum Erzwingen der Datenintegrität bereitstellen, obwohl der Schwerpunkt auf den Einschränkungen liegt. Die Unterrichtseinheit endet mit einem Vergleich der unterschiedlichen Methoden zum Erzwingen der Datenintegrität.

Am Ende dieser Unterrichtseinheit werden Sie in der Lage sein, die folgenden Aufgaben auszuführen:

� Beschreiben der Datenintegritätstypen. � Beschreiben der Methoden zum Erzwingen der Datenintegrität. � Bestimmen der geeigneten Einschränkung und Erstellen von Einschrän-

kungen.� Definieren und Verwenden von DEFAULT-, CHECK-, PRIMARY KEY-,

UNIQUE- und FOREIGN KEY-Einschränkungen. � Deaktivieren der Einschränkungsüberprüfung. � Beschreiben und Verwenden von Standardwerten und Regeln. � Bestimmen der geeigneten Methoden zum Erzwingen der Datenintegrität.

ThemaGeben Sie eine Übersicht über die Themen und Lern-ziele dieser Unterrichts-einheit.

EinstiegDiese Unterrichtseinheit beschreibt die unterschied-lichen Typen der Daten-integrität sowie die Funk-tionen, mit denen diese sichergestellt wird.

Page 248: Programmieren Einer Microsoft SQL Server 2000-Datenbank

2 Unterrichtseinheit 5: Implementieren der Datenintegrität

DatenintegritätstypenDomänenintegrität

(Spalten)

Entitätsintegrität (Zeilen)

Referenzielle Integrität(zwischen Tabellen)

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Ein wichtiger Schritt bei der Planung einer Datenbank ist die Entscheidung, wie die Datenintegrität am besten sichergestellt wird. Datenintegrität bezeichnet die Konsistenz und Genauigkeit der Daten, die in einer Datenbank gespeichert sind. Es gibt die folgenden Datenintegritätstypen.

DomänenintegritätDie Domänen- oder Spaltenintegrität gibt eine Menge von Datenwerten an, die für eine Spalte gültig sind, und legt fest, ob Nullwerte zulässig sind. Die Domänenintegrität wird oft durch die Verwendung der Gültigkeitsüberprüfung erzwungen. Sie kann jedoch auch durch die Einschränkung der Datentypen, des Formats oder des für eine Spalte zulässigen Wertebereichs erzwungen werden.

EntitätsintegritätBei der Entitäts- oder Tabellenintegrität benötigen alle Zeilen einer Spalte einen eindeutigen Bezeichner, der als Primärschlüsselwert bezeichnet wird. Ob der Primärschlüsselwert geändert oder die gesamte Zeile gelöscht werden kann, hängt von der Ebene der Integrität ab, die zwischen dem Primärschlüssel und sonstigen Tabellen erforderlich ist.

Referenzielle Integrität Die referenzielle Integrität gewährleistet, dass die Beziehungen zwischen den Primärschlüsseln (in der Tabelle, auf die verwiesen wird) und den Fremd-schlüsseln (in den verweisenden Tabellen) stets aufrechterhalten werden. Es kann weder eine Zeile in einer Tabelle, auf die verwiesen wird, gelöscht wer-den, noch kann der Primärschlüssel geändert werden, wenn ein Fremdschlüssel auf diese Zeile verweist, es sei denn, die CASCADE-Aktion ist zulässig. Sie können Beziehungen, die auf der referenziellen Integrität basieren, innerhalb derselben Tabelle oder zwischen separaten Tabellen definieren.

ThemaGeben Sie eine Einführung in die verschiedenen Typen der Datenintegrität.

EinstiegEin wichtiger Schritt bei der Planung einer Datenbank ist die Entscheidung, wie die Datenintegrität am besten sichergestellt wird. Daten-integrität lässt sich in die folgenden drei Kategorien unterteilen.

Methodischer Hinweis Die hier angesprochenen Datenintegritätstypen sind Bestandteil des grund-legenden Entwurfs relatio-naler Datenbanken. Die einzelnen Themen sollten einen allgemein gültigen Charakter haben. Geben Sie eventuell ein Beispiel aus der Northwind-Datenbank.

Page 249: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 5: Implementieren der Datenintegrität 3

Erzwingen der Datenintegrität

� Deklarative Datenintegrität� Kriterien werden in den Objektdefinitionen definiert� Automatisches Erzwingen durch SQL Server� Implementierung mit Hilfe von Einschränkungen,

Standardwerten und Regeln� Prozedurale Datenintegrität

� Kriterien werden in Skripten definiert� Erzwingen durch Skripte� Implementierung durch Trigger und gespeicherte

Prozeduren

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Es gibt zwei Methoden, um die Datenintegrität zu erzwingen: deklarative Datenintegrität oder prozedurale Datenintegrität.

Deklarative Datenintegrität Bei der deklarativen Integrität definieren Sie die Kriterien, die die Daten als Teil einer Objektdefinition erfüllen müssen. Microsoft® SQL Server™ 2000 stellt dann automatisch sicher, dass die Daten diesen Kriterien entsprechen. Die bevorzugte Methode zur Implementierung der grundlegenden Datenintegrität ist die Verwendung der deklarativen Integrität. Berücksichtigen Sie bei der dekla-rativen Methode die folgenden Punkte:

� Die deklarative Integrität wird als Teil der Datenbankdefinition deklariert, indem Sie deklarative Einschränkungen verwenden, die direkt in Tabellen und Spalten definiert werden.

� Implementieren Sie die deklarative Integrität mit Hilfe von Einschränkun-gen, Standardwerten und Regeln.

Prozedurale Datenintegrität Bei der prozeduralen Integrität erstellen Sie Skripts, die die Kriterien definie-ren, die von den Daten erfüllt werden müssen, und die gleichzeitig die Ein-haltung dieser Kriterien erzwingen. Sie sollten die prozedurale Integrität nur für kompliziertere Geschäftslogik und Ausnahmen verwenden. Verwenden Sie die prozedurale Integrität beispielsweise für kaskadierende Löschvorgänge. Berücksichtigen Sie bei der prozeduralen Integrität die folgenden Punkte:

� Die Implementierung der prozeduralen Integrität auf dem Client oder dem Server kann mit Hilfe anderer Programmiersprachen und -tools erfolgen.

� Implementieren Sie die prozedurale Integrität mit Hilfe von Triggern und gespeicherten Prozeduren.

ThemaErläutern Sie, wie SQL Server die Daten-integrität implementiert.

EinstiegEs gibt zwei Methoden, um die Datenintegrität zu erzwingen.

Methodischer Hinweis Weisen Sie darauf hin, dass diese Unterrichtseinheit nur die Funktionen der dekla-rativen Integrität behandelt: Einschränkungen, Stan-dardwerte und Regeln. Trigger und gespeicherte Prozeduren werden in späteren Unterrichts-einheiten behandelt.

Page 250: Programmieren Einer Microsoft SQL Server 2000-Datenbank

4 Unterrichtseinheit 5: Implementieren der Datenintegrität

���� Definieren von Einschränkungen

� Bestimmen des geeigneten Einschränkungstyps

� Erstellen von Einschränkungen

� Überlegungen zur Verwendung von Einschränkungen

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Einschränkungen sind die bevorzugte Methode zum Erzwingen der Daten-integrität. In diesem Abschnitt wird beschrieben, wie Sie den geeigneten Einschränkungstyp bestimmen, welchen Datenintegritätstyp die unterschied-lichen Einschränkungen erzwingen und wie Sie Einschränkungen definieren.

ThemaBeschreiben Sie, wie die Datenintegrität mit Hilfe von Einschränkungen erzwun-gen werden kann.

EinstiegEinschränkungen sind die bevorzugte Methode zum Erzwingen der Daten-integrität.

Page 251: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 5: Implementieren der Datenintegrität 5

Bestimmen des geeigneten Einschränkungstyps

IntegritätstypIntegritätstypIntegritätstyp EinschränkungstypEinschränkungstypEinschränkungstyp

DomäneDomäneDEFAULTDEFAULT

CHECKCHECK

REFERENTIALREFERENTIAL

EntitätEntität PRIMARY KEYPRIMARY KEY

UNIQUEUNIQUE

ReferenziellReferenziell FOREIGN KEYFOREIGN KEY

CHECKCHECK

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Einschränkungen sind eine ANSI-kompatible Methode zum Erzwingen der Datenintegrität. Jeder Datenintegritätstyp (Domänen-, Entitäts- und referen-zielle Integrität) wird mit ganz bestimmten Einschränkungstypen erzwungen. Einschränkungen gewährleisten, dass gültige Datenwerte in Spalten eingegeben und Beziehungen zwischen Tabellen aufrechterhalten werden. In der folgenden Tabelle sind die unterschiedlichen Einschränkungstypen beschrieben.

Integritäts-typ

Einschränkungs-typ Beschreibung

DEFAULT Diese Einschränkung gibt den Wert an, der für die Spalte verwendet wird, wenn eine INSERT-Anweisung keine explizite Angabe eines Wertes enthält.

CHECK Diese Einschränkung gibt an, welche Daten-werte in einer Spalte gültig sind.

Domäne

REFERENTIAL Diese Einschränkung gibt die Datenwerte an, die basierend auf Werten in einer Spalte einer anderen Tabelle aktualisiert werden können.

PRIMARY KEY Diese Einschränkung identifiziert jede Zeile eindeutig. Auf diese Weise wird sichergestellt, dass die Benutzer keine doppelten Werte ein-geben und dass ein Index erstellt wird, um die Leistung zu verbessern. NULL-Werte sind nicht zulässig.

Entität

UNIQUE Diese Einschränkung verhindert die doppelte Verwendung von alternativen (nicht primären) Schlüsseln und gewährleistet, dass ein Index erstellt wird, um die Leistung zu verbessern. NULL-Werte sind zulässig.

ThemaStellen Sie die unterschied-lichen Einschränkungstypen vor, und erläutern Sie, wie diese Einschränkungen verwendet werden, um die Datenintegrität zu imple-mentieren.

EinstiegMit Hilfe unterschiedlicher Einschränkungstypen wird sichergestellt, dass gültige Datenwerte in Spalten ein-gegeben und Beziehungen zwischen Tabellen auf-rechterhalten werden.

KernpunktHeben Sie hervor, dass Einschränkungen ANSI-kompatibel sind.

Page 252: Programmieren Einer Microsoft SQL Server 2000-Datenbank

6 Unterrichtseinheit 5: Implementieren der Datenintegrität

(Fortsetzung) Integritäts-typ

Einschränkungs-typ Beschreibung

FOREIGN KEY Diese Einschränkung definiert eine oder meh-rere Spalten, deren Werte mit dem Primär-schlüssel derselben oder einer anderen Tabelle übereinstimmen.

Referenziell

CHECK Diese Einschränkung gibt die Datenwerte an, die basierend auf Werten in anderen Spalten derselben Tabelle für die Spalte zulässig sind.

Page 253: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 5: Implementieren der Datenintegrität 7

Erstellen von Einschränkungen

� Verwenden von CREATE TABLE oder ALTER TABLE

� Kann Einschränkungen zu einer Tabelle hinzufügen, die bereits Daten enthält

� Kann Einschränkungen auf einzelne oder mehrere Spalten definieren

� Für einzelne Spalten heißen sie „Einschränkung auf Spaltenebene“

� Für mehrere Spalten heißen sie „Einschränkung auf Tabellenebene“

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Einschränkungen werden mit den Anweisungen CREATE TABLE oder ALTER TABLE erstellt.

Sie können Einschränkungen zu einer Tabelle hinzufügen, die bereits Daten enthält, und Einschränkungen für einzelne oder mehrere Spalten definieren:

� Wenn die Einschränkung für eine einzelne Spalte gilt, wird sie als Ein-schränkung auf Spaltenebene bezeichnet.

� Wenn eine Einschränkung auf mehrere Spalten verweist, wird sie als Ein-schränkung auf Tabellenebene bezeichnet, und zwar auch dann, wenn sie nicht auf alle Spalten der Tabelle verweist.

CREATE TABLE table_name ( { < column_definition > | < table_constraint > } [ ,...n ])

< column_definition > ::= { column_name data_type } [ [ DEFAULT constant_expression ] [ < column_constraint > ] [ ,..n]

< column_constraint > ::= [ CONSTRAINT constraint_name ] | [ { PRIMARY KEY | UNIQUE } [ CLUSTERED | NONCLUSTERED ] ]

| [ [ FOREIGN KEY ] REFERENCES ref_table [ ( ref_column ) ] [ ON DELETE { CASCADE | NO ACTION } ] [ ON UPDATE { CASCADE | NO ACTION } ]] | CHECK ( logical_expression ) }

ThemaStellen Sie die Syntax für die Definition von Ein-schränkungen vor.

EinstiegEinschränkungen werden mit den Anweisungen CREATE TABLE oder ALTER TABLE definiert.

Methodischer Hinweis Weisen Sie darauf hin, dass sich der Begriff „Einschrän-kung auf Tabellenebene“ auf jede Einschränkung bezieht, die mehrere Spalten einbezieht.

Teilsyntax

Methodische Hinweise Weisen Sie darauf hin, dass sich die Syntax aus einem Teil für Einschränkungen auf Spaltenebene und einem Teil für Einschrän-kungen Tabellenebene zusammensetzt.

Raten Sie den Kursteil-nehmern, zunächst die Basistabelle zu erstellen und die Einschränkungen erst später hinzuzufügen. Dies vereinfacht die Definition der Tabelle.

Page 254: Programmieren Einer Microsoft SQL Server 2000-Datenbank

8 Unterrichtseinheit 5: Implementieren der Datenintegrität

< table_constraint > ::= [ CONSTRAINT constraint_name ] { [ { PRIMARY KEY | UNIQUE } [CLUSTERED | NONCLUSTERED] { ( column [ ASC | DESC ] [ ,...n ] ) } ] | FOREIGN KEY [ ( column [ ,...n ] ) ] REFERENCES ref_table [ ( ref_column [ ,...n ] ) ] [ ON DELETE { CASCADE | NO ACTION } ] [ ON UPDATE { CASCADE | NO ACTION } ] | CHECK ( search_conditions ) }

Dieses Beispiel erstellt die Products-Tabelle, definiert Spalten und definiert Einschränkungen sowohl auf Spalten- als auch auf Tabellenebene.

USE Northwind CREATE TABLE dbo.Products ( ProductID int IDENTITY (1,1) NOT NULL, ProductName nvarchar (40) NOT NULL, SupplierID int NULL, CategoryID int NULL, QuantityPerUnit nvarchar (20) NULL, UnitPrice money NULL CONSTRAINT DF_Products_UnitPrice DEFAULT(0), UnitsInStock smallint NULL CONSTRAINT DF_Products_UnitsInStock DEFAULT(0), UnitsOnOrder smallint NULL CONSTRAINT DF_Products_UnitsOnOrder DEFAULT(0), ReorderLevel smallint NULL CONSTRAINT DF_Products_ReorderLevel DEFAULT(0), Discontinued bit NOT NULL CONSTRAINT DF_Products_Discontinued DEFAULT(0),

CONSTRAINT PK_Products PRIMARY KEY CLUSTERED (ProductID),

CONSTRAINT FK_Products_Categories FOREIGN KEY (CategoryID) REFERENCES dbo.Categories (CategoryID) ON UPDATE CASCADE, CONSTRAINT FK_Products_Suppliers FOREIGN KEY (SupplierID) REFERENCES dbo.Suppliers (SupplierID) ON DELETE CASCADE,

CONSTRAINT CK_Products_UnitPrice CHECK (UnitPrice >= 0), CONSTRAINT CK_ReorderLevel CHECK (ReorderLevel >= 0), CONSTRAINT CK_UnitsInStock CHECK (UnitsInStock >= 0), CONSTRAINT CK_UnitsOnOrder CHECK (UnitsOnOrder >= 0) )GO

Beispiel

Page 255: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 5: Implementieren der Datenintegrität 9

Überlegungen zur Verwendung von Einschränkungen

� Kann geändert werden, ohne die Tabelle neu erstellen zu müssen

� Erfordert Fehlerüberprüfung in Anwendungen und Transaktionen

� Überprüft vorhandene Daten

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Berücksichtigen Sie die folgenden Punkte, wenn Sie Einschränkungen imple-mentieren oder ändern:

� Sie können Einschränkungen erstellen, ändern und löschen, ohne dass Sie eine Tabelle löschen und neu erstellen müssen.

� Sie müssen Programmlogik zur Fehlerüberprüfung in Anwendungen und Transaktionen einbinden, um zu testen, ob gegen eine Einschränkung verstoßen wurde.

� Wenn Sie eine Einschränkung zu einer Tabelle hinzufügen, überprüft SQL Server die vorhandenen Daten.

Beim Erstellen von Einschränkungen sollten Sie Namen für die Einschränkun-gen angeben, da SQL Server komplizierte, vom System generierte Namen verwendet. Die Namen müssen für den Datenbank-Objektbesitzer eindeutig sein und den Regeln für SQL Server-Bezeichner entsprechen.

Hilfe zu Einschränkungen erhalten Sie, wenn Sie die gespeicherten System-prozeduren sp_helpconstraint oder sp_help ausführen oder Informations-schemasichten abfragen, wie zum Beispiel check_constraints,referential_constraints und table_constraints.

Die folgenden Systemtabellen speichern Einschränkungsdefinitionen: syscomments, sysreferences und sysconstraints.

ThemaBenennen Sie einige der Aspekte, die bei der Ver-wendung von Einschrän-kungen berücksichtigt werden sollten.

EinstiegBerücksichtigen Sie die folgenden Punkte, wenn Sie Einschränkungen imple-mentieren oder ändern.

Methodischer Hinweis Zeigen Sie, dass SQL Server komplizierte, vom System generierte Einschränkungsnamen erstellt.

Page 256: Programmieren Einer Microsoft SQL Server 2000-Datenbank

10 Unterrichtseinheit 5: Implementieren der Datenintegrität

���� Einschränkungstypen

� DEFAULT-Einschränkungen

� CHECK-Einschränkungen

� PRIMARY KEY-Einschränkungen

� UNIQUE-Einschränkungen

� FOREIGN KEY-Einschränkungen

� Kaskadierende referenzielle Integrität

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Dieser Abschnitt beschreibt die Einschränkungstypen. Für jede Einschränkung werden die Syntax, Beispiele sowie Aspekte aufgeführt, die bei der Verwen-dung berücksichtigt werden sollten.

ThemaBeschreiben Sie die Ein-schränkungstypen.

EinstiegDieser Abschnitt beschreibt die Einschränkungstypen.

Page 257: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 5: Implementieren der Datenintegrität 11

DEFAULT-Einschränkungen

� Gilt nur für die INSERT-Anweisung

� Nur eine DEFAULT-Einschränkung pro Spalte

� Kann nicht mit der „Identity“-Eigenschaft oder mit dem Datentyp „rowversion“ verwendet werden

� Ermöglicht die Angabe einiger vom System bereitgestellter Werte

USE NorthwindALTER TABLE dbo.CustomersADDCONSTRAINT DF_contactname DEFAULT 'UNKNOWN' FOR ContactName

USE NorthwindALTER TABLE dbo.CustomersADDCONSTRAINT DF_contactname DEFAULT 'UNKNOWN' FOR ContactName

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Eine DEFAULT-Einschränkung gibt einen Wert in eine Spalte ein, wenn eine INSERT-Anweisung keinen entsprechenden Wert angibt. DEFAULT-Einschränkungen erzwingen die Domänenintegrität.

[CONSTRAINT constraint_name] DEFAULT constant_expression

In diesem Beispiel wird eine DEFAULT-Einschränkung hinzugefügt, die den Wert UNKNOWN in die dbo.Customers-Tabelle einfügt, wenn kein Name eingegeben wird.

USE Northwind ALTER TABLE dbo.Customers ADDCONSTRAINT DF_contactname DEFAULT 'UNKNOWN' FOR ContactName

Wenn Sie eine DEFAULT-Einschränkung verwenden, sollten Sie die folgenden Punkte berücksichtigen:

� Die Einschränkung überprüft die in der Tabelle enthaltenen Daten. � Die Einschränkung gilt nur für INSERT-Anweisungen. � Pro Spalte kann nur eine DEFAULT-Einschränkung definiert werden. � Die Einschränkung kann nicht für Spalten mit der Identity-Eigenschaft oder

für Spalten des Datentyps rowversion verwendet werden. � Die Einschränkung ermöglicht die Angabe einiger vom System bereitge-

stellter Werte - USER, CURRENT_USER, SESSION_USER, SYSTEM_USER oder CURRENT_TIMESTAMP - anstelle von benutzer-definierten Werten. Diese vom System bereitgestellten Werte können hilf-reich sein, um eine Liste der Benutzer zu erstellen, die Daten eingefügt haben.

ThemaGeben Sie eine Einführung zur DEFAULT-Einschrän-kung.

EinstiegDie DEFAULT-Einschränkung erzwingt die Domänenintegrität.

Teilsyntax

Beispiel

Page 258: Programmieren Einer Microsoft SQL Server 2000-Datenbank

12 Unterrichtseinheit 5: Implementieren der Datenintegrität

CHECK-Einschränkungen

� Wird mit der INSERT- und UPDATE-Anweisung verwendet

� Kann auf andere Spalten derselben Tabelle verweisen

� Kann nicht:

� Mit dem Datentyp rowversion verwendet werden� Unterabfragen enthalten

USE NorthwindALTER TABLE dbo.EmployeesADD CONSTRAINT CK_birthdateCHECK (BirthDate > '01-01-1900' AND BirthDate <getdate())

USE NorthwindALTER TABLE dbo.EmployeesADD CONSTRAINT CK_birthdateCHECK (BirthDate > '01-01-1900' AND BirthDate <getdate())

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Eine CHECK-Einschränkung beschränkt die Daten, die Benutzer in eine Spalte eingeben können, auf bestimmte Werte. CHECK-Einschränkungen sind ver-gleichbar mit WHERE-Klauseln, da Sie die Bedingungen festlegen können, unter denen Daten akzeptiert werden.

[CONSTRAINT constraint_name]CHECK (logical_expression)

In diesem Beispiel wird eine CHECK-Einschränkung hinzugefügt, um sicher-zustellen, dass ein Geburtsdatum innerhalb des gültigen Datumsbereichs liegt.

USE Northwind ALTER TABLE dbo.Employees ADDCONSTRAINT CK_birthdate CHECK (BirthDate > '01-01-1900' AND BirthDate < getdate())

Wenn Sie eine CHECK-Einschränkung verwenden, sollten Sie die folgenden Punkte berücksichtigen:

� Die Daten werden bei jeder Ausführung einer INSERT- oder UPDATE-Anweisung überprüft.

� Die Einschränkung kann auf andere Spalten in derselben Tabelle verweisen. Die salary-Spalte könnte beispielsweise auf einen Wert in der job_grade-Spalte verweisen.

� Die Einschränkung kann für Spalten des Datentyps rowversion nicht ver-wendet werden.

� Die Einschränkung kann keine Unterabfragen enthalten. � Wenn Daten vorliegen, die zu einer Verletzung der CHECK-Einschränkung

führen, können Sie die DBCC CHECKCONSTRAINTS-Anweisung ver-wenden, um die entsprechenden Zeilen zurückzugeben.

ThemaGeben Sie eine Einführung zur CHECK-Einschränkung.

EinstiegEine CHECK-Einschrän-kung beschränkt die Daten, die in eine Spalte eingege-ben werden können, auf bestimmte Werte.

Teilsyntax

Beispiel

Page 259: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 5: Implementieren der Datenintegrität 13

PRIMARY KEY-Einschränkungen

� Pro Tabelle nur eine PRIMARY KEY-Einschränkung

� Werte müssen eindeutig sein

� NULL-Werte sind nicht zulässig

� Erstellt einen eindeutigen Index für angegebene Spalten

USE NorthwindALTER TABLE dbo.Customers ADD CONSTRAINT PK_Customers PRIMARY KEY NONCLUSTERED (CustomerID)

USE NorthwindALTER TABLE dbo.Customers ADD CONSTRAINT PK_Customers PRIMARY KEY NONCLUSTERED (CustomerID)

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Eine PRIMARY KEY-Einschränkung definiert einen Primärschlüssel in einer Tabelle, der eine Zeile eindeutig identifiziert. Dieser Einschränkungstyp erzwingt die Entitätsintegrität.

[CONSTRAINT constraint_name] PRIMARY KEY [CLUSTERED | NONCLUSTERED]

{ ( column[,...n] ) }

In diesem Beispiel wird eine Einschränkung hinzugefügt, die angibt, dass die Kunden-ID der Primärschlüssel der dbo.Customers-Tabelle ist, und bestimmt, dass ein gruppierter Index erstellt wird, um die Einschränkung zu erzwingen.

USE Northwind ALTER TABLE dbo.Customers ADDCONSTRAINT PK_Customers

PRIMARY KEY NONCLUSTERED (CustomerID)

Wenn Sie eine PRIMARY KEY-Einschränkung verwenden, sollten Sie die folgenden Punkte berücksichtigen:

� Pro Tabelle kann nur eine PRIMARY KEY-Einschränkung definiert werden.

� Die eingegebenen Werte müssen eindeutig sein.

ThemaGeben Sie eine Einführung zur PRIMARY KEY-Ein-schränkung.

EinstiegPRIMARY KEY-Einschrän-kungen erzwingen die Entitätsintegrität.

Teilsyntax

Beispiel

KernpunkteDie PRIMARY KEY-Einschränkung ist immer eindeutig und lässt keine NULL-Werte zu.

Die PRIMARY KEY-Einschränkung erstellt immer einen Index.

Page 260: Programmieren Einer Microsoft SQL Server 2000-Datenbank

14 Unterrichtseinheit 5: Implementieren der Datenintegrität

� NULL-Werte sind nicht zulässig. � Die Einschränkung erstellt einen eindeutigen Index für die angegebenen

Spalten. Sie haben die Auswahl zwischen einem gruppierten und einem nicht gruppierten Index (standardmäßig wird ein gruppierter Index erstellt, falls ein solcher Index noch nicht vorhanden ist).

Der für eine PRIMARY KEY-Einschränkung erstellte Index kann nicht direkt gelöscht werden. Er wird gelöscht, sobald Sie die Einschränkung löschen.

Anmerkung

Page 261: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 5: Implementieren der Datenintegrität 15

UNIQUE-Einschränkungen

� NULL-Werte sind zulässig

� Mehrere UNIQUE-Einschränkungen auf einer Tabelle sind zulässig

� Können für eine oder mehrere Spalten definiert werden

� Erzwungen mit einem eindeutigen Index

USE NorthwindALTER TABLE dbo.Suppliers ADD CONSTRAINT U_CompanyName UNIQUE NONCLUSTERED (CompanyName)

USE NorthwindALTER TABLE dbo.Suppliers ADD CONSTRAINT U_CompanyName UNIQUE NONCLUSTERED (CompanyName)

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Eine UNIQUE-Einschränkung gibt an, dass zwei Zeilen einer Spalte nicht denselben Wert enthalten können. Diese Einschränkung erzwingt die Entitäts-integrität mit Hilfe eines eindeutigen Indexes.

Eine UNIQUE-Einschränkung ist hilfreich, wenn bereits ein Primärschlüssel vorhanden ist, wie z. B. eine Angestellten-ID, Sie jedoch sicherstellen möchten, dass andere Bezeichner, wie z. B. die Führerscheinnummer des Angestellten, ebenfalls eindeutig sind.

[CONSTRAINT constraint_name] UNIQUE [CLUSTERED | NONCLUSTERED] { ( column[,...n] ) }

In diesem Beispiel wird eine UNIQUE-Einschränkung für den Firmennamen in der dbo.Suppliers-Tabelle erstellt.

USE Northwind ALTER TABLE dbo.Suppliers ADDCONSTRAINT U_CompanyName

UNIQUE NONCLUSTERED (CompanyName)

Wenn Sie eine UNIQUE-Einschränkung verwenden, sollten Sie die folgenden Punkte berücksichtigen:

� Die Einschränkung kann einen einzigen NULL-Wert zulassen. � Für eine Tabelle können mehrere UNIQUE-Einschränkungen definiert

werden. � Die UNIQUE-Einschränkung kann auf eine oder mehrere Spalten ange-

wendet werden, die eindeutige Werte aufweisen müssen, jedoch nicht der Primärschlüssel der Tabelle sind.

� Die UNIQUE-Einschränkung wird erzwungen, indem ein eindeutiger Index für die angegebene(n) Spalte(n) erstellt wird.

ThemaGeben Sie eine Einführung zu UNIQUE-Einschrän-kungen.

EinstiegEine UNIQUE-Einschrän-kung gibt an, dass zwei Zeilen einer Spalte nicht denselben Wert enthalten können.

Teilsyntax

Beispiel

Page 262: Programmieren Einer Microsoft SQL Server 2000-Datenbank

16 Unterrichtseinheit 5: Implementieren der Datenintegrität

FOREIGN KEY-Einschränkungen

� Muss auf eine PRIMARY KEY- oder UNIQUE-Einschränkung verweisen

� Stellt referenzielle Integrität für einzelne oder mehrere Spalten bereit

� Erstellt nicht automatisch einen Index

� Anwender müssen SELECT- oder REFERENCES-Berechtigungen für referenzierte Tabelle haben

� Innerhalb einer Tabelle kann nur die REFERENCES-Klausel verwendet werden

USE NorthwindALTER TABLE dbo.Orders ADD CONSTRAINT FK_Orders_CustomersFOREIGN KEY (CustomerID) REFERENCES dbo.Customers(CustomerID)

USE NorthwindALTER TABLE dbo.Orders ADD CONSTRAINT FK_Orders_CustomersFOREIGN KEY (CustomerID) REFERENCES dbo.Customers(CustomerID)

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Eine FOREIGN KEY-Einschränkung erzwingt die referenzielle Integrität. Eine FOREIGN KEY-Einschränkung definiert einen Verweis auf eine Spalte mit einer PRIMARY KEY- oder UNIQUE-Einschränkung in derselben oder einer anderen Tabelle.

[CONSTRAINT constraint_name] [FOREIGN KEY] [(column[,…n])] REFERENCES ref_table [(ref_column [,…n])].

In diesem Beispiel wird mit einer FOREIGN KEY-Einschränkung sicherge-stellt, dass jeder Kunden-ID in der dbo.Orders-Tabelle eine gültige ID in der dbo-Customers-Tabelle zugeordnet ist.

USE Northwind ALTER TABLE dbo.Orders ADD CONSTRAINT FK_Orders_Customers

FOREIGN KEY (CustomerID) REFERENCES dbo.Customers(CustomerID)

Wenn Sie eine FOREIGN KEY-Einschränkung verwenden, sollten Sie die folgenden Punkte und Richtlinien berücksichtigen:

� Die Einschränkung ermöglicht die referenzielle Integrität für einzelne oder mehrere Spalten. Die Anzahl der Spalten und Datentypen, die in der FOREIGN KEY-Anweisung angegeben werden, muss mit der Anzahl der Spalten und Datentypen in der REFERENCES-Klausel übereinstimmen.

� Im Gegensatz zu PRIMARY KEY- oder UNIQUE-Einschränkungen wer-den durch FOREIGN KEY-Einschränkungen nicht automatisch Indizes er-stellt. Wenn Sie jedoch viele Verknüpfungen in der Datenbank verwenden möchten, sollten Sie für die FOREIGN KEY-Einschränkung einen Index erstellen, um die Verknüpfungsleistung zu verbessern.

ThemaGeben Sie eine Einführung zur FOREIGN KEY-Ein-schränkung.

EinstiegEine FOREIGN KEY-Ein-schränkung erzwingt die referenzielle Integrität.

Teilsyntax

Beispiel

Page 263: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 5: Implementieren der Datenintegrität 17

� Zum Ändern von Daten benötigen die Benutzer SELECT- oder REFERENCES-Berechtigungen für andere Tabellen, auf die mit einer FOREIGN KEY-Einschränkung verwiesen wird.

� Sie können nur die REFERENCES-Klausel ohne die FOREIGN KEY-Klausel verwenden, wenn Sie auf eine Spalte in derselben Tabelle verweisen.

Page 264: Programmieren Einer Microsoft SQL Server 2000-Datenbank

18 Unterrichtseinheit 5: Implementieren der Datenintegrität

Kaskadierende referenzielle Integrität

CASCADENO ACTIONKundenKundenKunden

INSERT new CustomerIDINSERT new CustomerID

CustomerID (PK)

11

BestellungenBestellungenBestellungenCustomerID (FK)

UPDATE old CustomerID to new CustomerID

UPDATE old CustomerID to new CustomerID

22

KundenKundenKundenCustomerID (PK)

UPDATE CustomerIDUPDATE CustomerID

BestellungenBestellungenBestellungenCustomerID (FK)

11

CASCADE

KundenKundenKunden

DELETE old CustomerIDDELETE old CustomerID

CustomerID (PK)

33

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Die FOREIGN KEY-Einschränkung umfasst die Option CASCADE, die es er-möglicht, dass Änderungen an einem Spaltenwert, der eine UNIQUE- oder PRIMARY KEY-Einschränkung definiert, automatisch an den Fremdschlüssel-wert weitergegeben werden. Dieser Vorgang wird als kaskadierende referenzielle Integrität bezeichnet.

Die REFERENCES-Klausel der Anweisungen CREATE TABLE und ALTER TABLE unterstützt ON DELETE- und ON UPDATE-Klauseln. Diese Klauseln ermöglichen es Ihnen, die Option CASCADE oder NO ACTION anzugeben.

[CONSTRAINT constraint_name] [FOREIGN KEY] [(column[,…n])] REFERENCES ref_table [(ref_column [,…n])]. [ ON DELETE { CASCADE | NO ACTION } ] [ ON UPDATE { CASCADE | NO ACTION } ]

NO ACTION gibt an, dass jeder Versuch, einen Schlüssel zu löschen oder zu aktualisieren, auf den durch einen Fremdschlüssel in anderen Tabellen ver-wiesen wird, einen Fehler auslöst und für die Änderung ein Rollback ausgeführt wird. NO ACTION ist die Standardeinstellung.

Wenn CASCADE definiert wurde und in der übergeordneten Tabelle eine Zeile geändert wird, wird anschließend die entsprechende Zeile in der verweisenden Tabelle geändert.

In der Northwind-Datenbank besteht z. B. eine referenzielle Beziehung zwischen der Orders-Tabelle und der Customers-Tabelle, die sich so aus-drückt, dass der Orders.CustomerID-Fremdschlüssel auf den Customers.CustomerID-Primärschlüssel verweist.

ThemaErläutern Sie, wie die referenzielle Integrität kaskadiert werden kann.

EinstiegDurch die kaskadierende referenzielle Integrität werden Änderungen an der Datenbank automatisch weitergegeben.

Teilsyntax

Page 265: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 5: Implementieren der Datenintegrität 19

Wenn eine UPDATE-Anweisung auf der CustomerID-Spalte in der Customers-Tabelle ausgeführt wird und eine ON UPDATE CASCADE-Aktion für Orders.CustomerID angegeben wird, sucht SQL Server nach einer oder mehreren abhängigen Zeilen in der Orders-Tabelle. Falls solche Zeilen vor-handen sind, werden sowohl die abhängigen Zeilen in der Orders-Tabelle als auch die Zeile in der Customers-Tabelle aktualisiert, auf die verwiesen wurde.

Wenn Sie die Option CASCADE anwenden, sollten Sie die folgenden Punkte berücksichtigen:

� CASCADE und NO ACTION können für Tabellen kombiniert werden, zwischen denen referenzielle Beziehungen bestehen. Falls SQL Server die Option NO ACTION vorfindet, beendet es die Ausführung und führt für die entsprechenden CASCADE-Aktionen einen Rollback durch. Wenn eine DELETE-Anweisung eine Kombination aus CASCADE- und NO ACTION-Aktionen verursacht, werden alle CASCADE-Aktionen angewendet, bevor SQL Server bezüglich NO ACTION prüft.

� CASCADE kann nicht für Fremdschlüssel- oder Primärschlüsselspalten angegeben werden, die mit einer rowversion-Spalte definiert wurden.

Page 266: Programmieren Einer Microsoft SQL Server 2000-Datenbank

20 Unterrichtseinheit 5: Implementieren der Datenintegrität

���� Deaktivieren von Einschränkungen

� Deaktivieren der Einschränkungsüberprüfung für vorhandene Daten

� Deaktivieren der Einschränkungsüberprüfung beim Laden neuer Daten

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Aus Leistungsgründen kann es mitunter empfehlenswert sein, Einschränkungen zu deaktivieren. So ist es beispielsweise effizienter, die Verarbeitung umfang-reicher Batchoperationen zu ermöglichen, bevor Einschränkungen aktiviert werden. Dieser Abschnitt beschreibt das Verfahren zum Deaktivieren der Ein-schränkungsüberprüfung in Abhängigkeit davon, ob Sie eine neue Einschrän-kung erstellen oder eine vorhandene Einschränkung deaktivieren.

ThemaBeschreiben Sie die Verfahren zum Deaktivieren von Einschränkungen.

EinstiegAus Leistungsgründen kann es mitunter empfehlenswert sein, Einschränkungen zu deaktivieren.

Page 267: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 5: Implementieren der Datenintegrität 21

Deaktivieren der Einschränkungsüberprüfung für vorhandene Daten

� Verwenden für CHECK- und FOREIGN KEY-Einschränkungen

� Verwenden der Option WITH NOCHECK beim Hinzufügen einer neuen Einschränkung

� Verwenden der Option WITH NOCHECK, wenn bestehende Daten nicht verändert werden

� Kann bestehende Daten verändern, bevor eine Einschränkung hinzugefügt wird

USE NorthwindALTER TABLE dbo.Employees WITH NOCHECK

ADD CONSTRAINT FK_Employees_EmployeesFOREIGN KEY (ReportsTo) REFERENCES dbo.Employees(EmployeeID)

USE NorthwindALTER TABLE dbo.Employees WITH NOCHECK

ADD CONSTRAINT FK_Employees_EmployeesFOREIGN KEY (ReportsTo) REFERENCES dbo.Employees(EmployeeID)

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Wenn Sie eine Einschränkung für eine Tabelle definieren, die bereits Daten enthält, überprüft SQL Server automatisch die vorhandenen Daten, um sicher-zustellen, dass sie die Anforderungen der Einschränkung erfüllen. Wenn Sie eine Einschränkung zu einer Tabelle hinzufügen, können Sie jedoch die Ein-schränkungsüberprüfung für vorhandene Daten deaktivieren.

Wenn Sie die Einschränkungsüberprüfung für vorhandene Daten deaktivieren, sollten Sie die folgenden Richtlinien berücksichtigen:

� Nur CHECK- und FOREIGN KEY-Einschränkungen können deaktiviert werden. Andere Einschränkungen müssen gelöscht und dann erneut hinzu-gefügt werden.

� Um die Einschränkungsüberprüfung beim Hinzufügen einer CHECK- oder FOREIGN KEY-Einschränkung zu einer Tabelle zu deaktivieren, die bereits Daten enthält, verwenden Sie die Option WITH NOCHECK in der ALTER TABLE-Anweisung.

� Verwenden Sie die Option WITH NOCHECK, wenn vorhandene Daten nicht geändert werden. Wenn Daten aktualisiert werden, müssen sie CHECK-Einschränkungen entsprechen.

� Vergewissern Sie sich, dass die Deaktivierung der Einschränkungsüber-prüfung wirklich angebracht ist. Sie können eine Abfrage ausführen, um die vorhandenen Daten zu ändern, bevor Sie sich entscheiden, eine Einschrän-kung hinzuzufügen.

ThemaErläutern Sie, wie Ein-schränkungen deaktiviert werden.

EinstiegWenn Sie eine Einschrän-kung zu einer Tabelle hinzufügen, können Sie die Einschränkungsüberprüfung deaktivieren.

Page 268: Programmieren Einer Microsoft SQL Server 2000-Datenbank

22 Unterrichtseinheit 5: Implementieren der Datenintegrität

ALTER TABLE table[WITH CHECKWITH NOCHECK] ADD CONSTRAINT constraint

[FOREIGN KEY] [(column[,…n])] REFERENCES ref_table [(ref_col [,…n])]

[CHECK (search_conditions)]

In diesem Beispiel fügen Sie eine FOREIGN KEY-Einschränkung hinzu, durch die überprüft wird, ob alle Angestellten einem gültigen Vorgesetzten zugeord-net sind. Zum Zeitpunkt der Erstellung der Einschränkung wird sie für die vor-handenen Daten nicht erzwungen.

USE Northwind ALTER TABLE dbo.Employees WITH NOCHECK

ADD CONSTRAINT FK_Employees_Employees FOREIGN KEY (ReportsTo) REFERENCES dbo.Employees(EmployeeID)

Teilsyntax

Beispiel

Methodischer Hinweis Für dieses Beispiel muss die EmployeeID-Spalte in der Employees-Tabelle als Primärschlüssel definiert sein.

Page 269: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 5: Implementieren der Datenintegrität 23

Deaktivieren der Einschränkungsüberprüfung beim Laden neuer Daten

� Verwenden für CHECK- und FOREIGN KEY-Einschränkungen

� Verwenden, wenn:

� Daten den Einschränkungen entsprechen

� Sie neue Daten laden, die nicht den Einschränkungen entsprechen

USE NorthwindALTER TABLE dbo.Employees NOCHECKCONSTRAINT FK_Employees_Employees

USE NorthwindALTER TABLE dbo.Employees NOCHECKCONSTRAINT FK_Employees_Employees

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Für vorhandene CHECK- und FOREIGN KEY-Einschränkungen kann die Einschränkungsüberprüfung deaktiviert werden, damit Daten, die Sie in der Tabelle ändern oder zur Tabelle hinzufügen, nicht im Hinblick auf Einhaltung der Einschränkung überprüft werden.

Um den für die Einschränkungsüberprüfung erforderlichen Aufwand zu vermeiden, sollten Sie Einschränkungen in den folgenden Situationen deaktivieren:

� Sie haben bereits sichergestellt, dass die Daten den Einschränkungen entsprechen.

� Sie möchten Daten laden, die nicht den Einschränkungen entsprechen. Später können Sie Abfragen ausführen, um die Daten zu ändern, und dann die Einschränkungen wieder aktivieren.

Die Deaktivierung von Einschränkungen für eine Tabelle wirkt sich nicht auf Einschränkungen in anderen Tabellen aus, die auf die ursprüngliche Tabelle verweisen. Aktualisierungen an einer Tabelle können weiterhin zu Fehlern aufgrund von Einschränkungsverletzungen führen.

Für die Aktivierung einer deaktivierten Einschränkung muss eine weitere ALTER TABLE-Anweisung ausgeführt werden, die eine CHECK- oder CHECK ALL-Klausel enthält.

ALTER TABLE table{CHECK | NOCHECK} CONSTRAINT {ALL | constraint[,...n]}

In diesem Beispiel wird die Einschränkung FK_Employees_Employeesdeaktiviert. Sie kann erneut aktiviert werden, indem Sie eine weitere ALTER TABLE-Anweisung mit der CHECK-Klausel ausführen.

ThemaBeschreiben Sie, wie die Einschränkungsüberprüfung beim Laden neuer Daten deaktiviert wird.

EinstiegDiese Funktion ist nur für CHECK- und FOREIGN KEY-Einschränkungen verfügbar.

Wichtig

Teilsyntax

Beispiel

Page 270: Programmieren Einer Microsoft SQL Server 2000-Datenbank

24 Unterrichtseinheit 5: Implementieren der Datenintegrität

USE Northwind ALTER TABLE dbo.Employees NOCHECK

CONSTRAINT FK_Employees_Employees

Um zu ermitteln, ob eine Einschränkung für eine Tabelle aktiviert oder deak-tiviert ist, können Sie die gespeicherte Systemprozedur sp_help ausführen oder die CnstIsDisabled-Eigenschaft in der OBJECTPROPERTY-Funktion ver-wenden.

Page 271: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 5: Implementieren der Datenintegrität 25

Verwenden von Standardwerten und Regeln � Als unabhängige Objekte gilt für Standardwerte und Regeln:

� Sie werden einmal definiert� Sie können an eine oder mehrere Spalten oder

benutzerdefinierte Datentypen gebunden werden

CREATE DEFAULT phone_no_defaultAS '(000)000-0000'

GOEXEC sp_bindefault phone_no_default,'Customers.Phone'

CREATE DEFAULT phone_no_defaultAS '(000)000-0000'

GOEXEC sp_bindefault phone_no_default,'Customers.Phone'

CREATE RULE regioncode_ruleAS @regioncode IN ('IA', 'IL', 'KS', 'MO')

GOEXEC sp_bindrule regioncode_rule,'Customers.Region'

CREATE RULE regioncode_ruleAS @regioncode IN ('IA', 'IL', 'KS', 'MO')

GOEXEC sp_bindrule regioncode_rule,'Customers.Region'

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Standardwerte und Regeln sind Objekte, die an eine oder mehrere Spalten oder benutzerdefinierte Datentypen gebunden werden können. Auf diese Weise kön-nen sie einmal definiert und dann wiederholt verwendet werden. Ein Nachteil der Verwendung von Standardwerten und Regeln ist, dass sie nicht ANSI-kom-patibel sind.

Erstellen eines Standardwertes Wenn Sie bei der Eingabe von Daten einen Wert nicht angeben, wird durch einen Standardwert ein Wert für die Spalte angegeben, an die das Objekt ge-bunden ist. Bevor Sie Standardwerte erstellen, sollten Sie die folgenden Punkte berücksichtigen:

� Der Standardwert wird von sämtlichen Regeln überprüft, die an die Spalte und an die Datentypen gebunden sind.

� Der Standardwert muss jede CHECK-Einschränkungen einhalten, die für die Spalte definiert wurden.

� Es ist nicht möglich, eine DEFAULT-Einschränkung für eine Spalte zu er-stellen, die mit einem benutzerdefinierten Datentyp definiert wurde, wenn bereits ein Standardwert an den Datentyp oder die Spalte gebunden wurde.

CREATE DEFAULT defaultAS constant_expression

Binden eines Standardwertes Nachdem Sie einen Standardwert erstellt haben, müssen Sie ihn mit Hilfe der gespeicherten Systemprozedur sp_bindefault an eine Spalte oder einen be-nutzerdefinierten Datentyp binden. Mit Hilfe der gespeicherten Systemprozedur sp_unbindefault können Sie die Bindung eines Standardwertes aufheben.

ThemaBeschreiben Sie, wie Stan-dardwerte und Regeln er-stellt werden.

EinstiegStandardwerte und Regeln sind zwei weitere Methoden, um die Datenintegrität zu erzwingen.

KernpunktEs ist nicht möglich, eine DEFAULT-Einschränkung für eine Spalte mit einem benutzerdefinierten Daten-typ zu verwenden, wenn an den Datentyp oder die Spal-te bereits ein Standardwert gebunden ist.

Syntax

Page 272: Programmieren Einer Microsoft SQL Server 2000-Datenbank

26 Unterrichtseinheit 5: Implementieren der Datenintegrität

In diesem Beispiel wird eine Platzhalter-Telefonnummer im entsprechenden Format eingefügt, bis die eigentliche Telefonnummer eingegeben wird.

USE Northwind GOCREATE DEFAULT phone_no_default AS '(000)000-0000' GOEXEC sp_bindefault phone_no_default, 'Customers.Phone'

Erstellen einer Regel Regeln geben die zulässigen Werte an, die in einer Spalte eingegeben werden können. Durch Regeln wird sichergestellt, dass Daten innerhalb eines ange-gebenen Wertebereichs liegen, einem bestimmten Muster entsprechen oder mit Einträgen in einer angegebenen Liste übereinstimmen. Berücksichtigen Sie bei Regeln die folgenden Punkte:

� Eine Regeldefinition kann alle Ausdrücke enthalten, die in einer WHERE-Klausel zulässig sind.

� Es kann nur je eine Regel an eine Spalte oder einen benutzerdefinierten Datentyp gebunden werden.

CREATE RULE ruleAS condition_expression

Binden einer Regel Nachdem Sie eine Regel erstellt haben, müssen Sie sie mit Hilfe der gespeicher-ten Systemprozedur sp_bindrule an eine Spalte oder einen benutzerdefinierten Datentyp binden. Mit Hilfe der gespeicherten Systemprozedur sp_unbindrulekönnen Sie die Bindung einer Regel aufheben.

In diesem Beispiel stellt die Regel sicher, dass nur die angegebenen Abkürzungen für Staaten zulässig sind.

USE Northwind GOCREATE RULE regioncode_rule AS @regioncode IN ('IA', 'IL', 'KS', 'MO') GOEXEC sp_bindrule regioncode_rule, 'Customers.Region'

Löschen eines Standardwertes oder einer Regel Durch die DROP-Anweisung wird ein Standardwert oder eine Regel aus der Datenbank entfernt.

DROP DEFAULT default [,...n]

DROP RULE rule [, ...n]

Beispiel

Syntax

Beispiel

Syntax

Syntax

Page 273: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 5: Implementieren der Datenintegrität 27

Auswählen der geeigneten Methode zum Erzwingen der Datenintegrität

Datenintegritäts-komponenteDatenintegritätsDatenintegritäts--komponentekomponente

EinschränkungenEinschränkungen

Standardwerte undRegeln

Standardwerte undRegeln

TriggersTriggers

FunktionalitätFunktionalitätFunktionalität

MittelMittel

NiedrigNiedrig

HochHoch

Leistungs-einbußenLeistungsLeistungs--einbueinbußßenen

NiedrigNiedrig

HochHoch

Mittel-HochMittel-Hoch

Zeitpunkt der ÜberprüfungZeitpunkt der Zeitpunkt der ÜÜberprberprüüfungfung

VorVor

VorVor

NachNach

Datentypen,NULL/NOT NULL

Datentypen,NULL/NOT NULL NiedrigNiedrig NiedrigNiedrig VorVor

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Bei der Entscheidung für eine Methode zum Erzwingen der Datenintegrität sollten Sie die Funktionalität und mögliche Leistungseinbußen berücksichtigen:

� Für die grundlegende Integritätslogik, z. B. beim Erzwingen gültiger Werte und für die Aufrechterhaltung der Beziehungen zwischen den Tabellen, empfiehlt sich die deklarative Integrität.

� Für die Verwaltung komplexer redundanter Daten, die nicht Teil einer Primärschlüssel- oder Fremdschlüsselbeziehung sind, müssen Sie Trigger oder gespeicherte Prozeduren verwenden. Trigger werden jedoch erst bei Auftreten einer Änderung ausgelöst, sodass die Überprüfung im Hinblick auf Fehler erst nach Abschluss der Anweisung erfolgt. Wenn ein Trigger eine Verletzung feststellt, müssen die Änderungen rückgängig gemacht werden.

Datenintegritäts-komponente Auswirkung Funktionalität

Leistungs-einbußen

Zeitpunkt der Überprüfung (vor oder nach der Änderung)

Einschränkungen Einschränkungen werden in Tabellen definiert und überprüfen die Daten, bevor eine Transaktion ausgeführt wird, was eine bessere Leistung zur Folge hat.

Mittel Niedrig Vor

Standardwerte und Regeln

Standardwerte und Regeln imple-mentieren die Datenintegrität als separate Objekte, die mit einer oder mehreren Tabellen verknüpft werden können.

Niedrig Niedrig Vor

ThemaZeigen Sie die Vorteile und Nachteile verschiedener Datenintegritätskomponen-ten auf.

EinstiegBei der Entscheidung für eine Methode zum Erzwin-gen der Datenintegrität sollten Sie die Funktionalität und mögliche Leistungs-einbußen berücksichtigen.

KernpunkteVerwenden Sie nach Mög-lichkeit Einschränkungen. Standardwerte und Regeln sollten verwendet werden, wenn unabhängige Objekte erforderlich sind. Verwenden Sie Trigger nur dann, wenn eine komplexe Geschäftslogik benötigt wird.

Page 274: Programmieren Einer Microsoft SQL Server 2000-Datenbank

28 Unterrichtseinheit 5: Implementieren der Datenintegrität

(Fortsetzung)

Datenintegritäts-komponente Auswirkung Funktionalität

Leistungs-einbußen

Zeitpunkt der Überprüfung (vor oder nach der Änderung)

Trigger Trigger bieten zusätzliche Funktionalität, wie z. B. kaskadierende und komplexe Anwendungslogik. Für alle Änderungen muss ein Rollback ausgeführt werden.

Hoch Mittel-Hoch Nach (außer bei INSTEAD OF-Triggern)

Datentypen, NULL/NOT NULL

Diese Komponenten bieten die niedrigste Ebene der Datenintegrität. Sie werden für jede einzelne Spalte implementiert, wenn die Tabelle erstellt wird. Die Daten werden überprüft, bevor eine Transaktion beginnt.

Niedrig Niedrig Vor

Page 275: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 5: Implementieren der Datenintegrität 29

Empfohlene Methoden

Verwenden Sie die kaskadierende referenzielle Integritätanstelle von TriggernVerwenden Sie die kaskadierende referenzielle Integritätanstelle von Triggern

Verwenden Sie Einschränkungen, da sie ANSI-kompatibel sindVerwenden Sie Einschränkungen, da sie ANSI-kompatibel sind

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Die folgenden empfohlenen Methoden sollen Ihnen bei der Implementierung der Datenintegrität helfen:

� Verwenden Sie Einschränkungen, da sie ANSI-kompatibel sind und von Entwicklungstools von Drittanbietern unterstützt werden.

� Verwenden Sie die kaskadierende referenzielle Integrität anstelle von Triggern.

Weitere Informationen zu den folgenden Themen finden Sie in der SQL Server-Onlinedokumentation.

Thema Suchbegriff

Entwickeln von Datenbanken Datenintegrität

Gruppierte und nicht gruppierte Indizes "Erstellen eines Indexes"

Kaskadierende referenzielle Integrität "Kaskadierende Einschränkungen der referenziellen Integrität"

Trigger Trigger

ThemaStellen Sie die empfohlenen Methoden für die Implemen-tierung der Datenintegrität vor.

EinstiegDie folgenden empfohlenen Methoden helfen Ihnen bei der Implementierung der Datenintegrität.

Page 276: Programmieren Einer Microsoft SQL Server 2000-Datenbank

30 Unterrichtseinheit 5: Implementieren der Datenintegrität

Übungseinheit A: Implementieren der Datenintegrität

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

LernzieleAm Ende dieser Übungseinheit werden Sie in der Lage sein, die folgenden Auf-gaben auszuführen:

� Definieren und Verwenden von DEFAULT- und CHECK-Einschränkungen, um die Domänenintegrität zu erzwingen.

� Definieren und Verwenden von PRIMARY KEY- und FOREIGN KEY-Einschränkungen, um die Entitätsintegrität und die referenzielle Integrität zu erzwingen.

� Erstellen und Verwenden von Microsoft SQL Server 2000-Standardwerten und Regeln.

VoraussetzungenUm diese Übungseinheit zu bearbeiten, benötigen Sie Folgendes:

� Die Skriptdateien für diese Übungseinheit, die sich in C:\Moc\2328A\Labfiles\L05 befinden.

� Die Antwortdateien für diese Übungseinheit, die sich in C:\Moc\2328A\Labfiles\L05\Answers befinden.

Einrichten der ÜbungseinheitUm diese Übungseinheit zu bearbeiten, ist eine der folgenden Aktionen erforderlich:

� Bearbeiten der vorherigen Übungseinheit. � Ausführen der Batchdatei C:\Moc\2328A\Batches\Restore05.cmd.

Durch diese Befehlsdatei wird die ClassNorthwind-Datenbank in dem Zustand wiederhergestellt, der für diese Übungseinheit erforderlich ist.

ThemaGeben Sie eine Einführung in die Übungseinheit.

EinstiegIn dieser Übungseinheit fügen Sie DEFAULT-, CHECK-, PRIMARY KEY- und FOREIGN KEY-Ein-schränkungen zu bestimm-ten Tabellen hinzu.

Erläutern Sie die Lernziele der Übungseinheit.

Page 277: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 5: Implementieren der Datenintegrität 31

Weitere Informationen Sollten Sie beim Ausführen von Dateien Hilfe benötigen, suchen Sie in der Hilfe von SQL Query Analyzer nach „Ausführen einer Abfrage“.

Daneben sind die folgenden Informationsquellen verfügbar:

� Das northwind-Datenbankschema. � Die Microsoft SQL Server-Onlinedokumentation.

SzenarioDer Aufbau des Schulungsraumes soll die Organisation des weltweit agieren-den Handelsunternehmens Northwind Traders widerspiegeln. Das Unternehmen hat den fiktiven Domänennamen nwtraders.msft. Der primäre DNS-Server für nwtraders.msft ist der Kursleitercomputer, dessen IP-Adresse (Internetproto-koll) 192.168.x.200 lautet (wobei x die zugewiesene Schulungsraumnummer ist). Der Name des Kursleitercomputers ist London.

Die folgende Tabelle stellt den Benutzernamen, den Computernamen und die IP-Adresse für jeden Kursteilnehmercomputer in der fiktiven Domäne nwtraders.msft bereit. Suchen Sie den Ihrem Computer zugewiesenen Benutzernamen und notieren Sie ihn.

Benutzername Computername IP-Adresse

SQLAdmin1 Vancouver 192.168.x.1SQLAdmin2 Denver 192.168.x.2SQLAdmin3 Perth 192.168.x.3SQLAdmin4 Brisbane 192.168.x.4SQLAdmin5 Lisbon 192.168.x.5SQLAdmin6 Bonn 192.168.x.6SQLAdmin7 Lima 192.168.x.7SQLAdmin8 Santiago 192.168.x.8SQLAdmin9 Bangalore 192.168.x.9SQLAdmin10 Singapore 192.168.x.10SQLAdmin11 Casablanca 192.168.x.11SQLAdmin12 Tunis 192.168.x.12SQLAdmin13 Acapulco 192.168.x.13SQLAdmin14 Miami 192.168.x.14SQLAdmin15 Auckland 192.168.x.15SQLAdmin16 Suva 192.168.x.16SQLAdmin17 Stockholm 192.168.x.17SQLAdmin18 Moscow 192.168.x.18SQLAdmin19 Caracas 192.168.x.19SQLAdmin20 Montevideo 192.168.x.20SQLAdmin21 Manila 192.168.x.21SQLAdmin22 Tokyo 192.168.x.22SQLAdmin23 Khartoum 192.168.x.23SQLAdmin24 Nairobi 192.168.x.24

Veranschlagte Zeit für die Übungseinheit: 30 Minuten

Page 278: Programmieren Einer Microsoft SQL Server 2000-Datenbank

32 Unterrichtseinheit 5: Implementieren der Datenintegrität

Übung 1 Definieren von DEFAULT-Einschränkungen

In dieser Übung fügen Sie eine DEFAULT-Einschränkung zur Employees-Tabelle der ClassNorthwind-Datenbank hinzu.

� So definieren Sie eine DEFAULT-Einschränkung In diesem Verfahren führen Sie ein Skript aus, das einen Standardwert für die Region-Spalte in der Employees-Tabelle erstellt. Anschließend ändern Sie dieses Skript, um das Standardgebiet zu ändern. 1. Melden Sie sich mit Hilfe der Informationen in der folgenden Tabelle an der

Schulungsraumdomäne nwtraders an.

Option Eingabe

Benutzername SQLAdminx (wobei x die Ihrem Computernamen zugewiesene Nummer ist, wie in der Schulungsraumdomäne nwtraders.msftfestgelegt)

Kennwort password

2. Öffnen Sie SQL Query Analyzer und melden Sie sich ggf. unter Verwen-dung der Microsoft Windows-Authentifizierung am (lokalen) Server an. Sie verfügen über die Berechtigung, sich bei SQL Server anzumelden und SQL Server zu verwalten, da Sie als SQLAdminx angemeldet sind und SQLAdminx ein Mitglied der lokalen Microsoft Windows 2000-Gruppe Administratoren ist. Alle Mitglieder dieser Gruppe werden automatisch der SQL Server-Rolle sysadmin zugeordnet.

3. Klicken Sie in der Liste DB auf ClassNorthwind.4. Öffnen Sie C:\Moc\2328A\Labfiles\L05\DefConst.sql, sehen Sie sich den

Inhalt der Datei an, und führen Sie sie dann aus. Dieses Skript erstellt eine DEFAULT-Einschränkung, die NY (New York) als Standardwert für die Region-Spalte in der Employees-Tabelle hinzu-fügt.

5. Führen Sie sp_helpconstraint Tabellenname und sp_help Einschränkungs-name aus, um Informationen zu der soeben erstellten DEFAULT-Einschrän-kung anzuzeigen. EXEC SP_HELPCONSTRAINT Employees

EXEC SP_HELP DF_Region

Page 279: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 5: Implementieren der Datenintegrität 33

6. Ändern Sie C:\Moc\2328A\Labfiles\L05\DefConst.sql so, dass die in Schritt 4 erstellte DEFAULT-Einschränkung durch eine Einschränkung ersetzt wird, die WA (Washington) als Standardwert für die Region-Spalteder Employees-Tabelle festlegt. L05\Answers\DefCons2.sql enthält ein fertiges Skript für diesen Schritt. USE ClassNorthwind GO

ALTER TABLE Employees DROP CONSTRAINT DF_Region GO

ALTER TABLE Employees ADD CONSTRAINT DF_Region DEFAULT 'WA' FOR Region GO

Page 280: Programmieren Einer Microsoft SQL Server 2000-Datenbank

34 Unterrichtseinheit 5: Implementieren der Datenintegrität

Übung 2 Definieren von CHECK-Einschränkungen

In dieser Übung fügen Sie zwei CHECK-Einschränkungen zu den Tabellen in der ClassNorthwind-Datenbank hinzu.

� So definieren Sie eine CHECK-Einschränkung In diesem Verfahren führen Sie ein Skript aus, um eine Einschränkung für eine Anrede zur Employees-Tabelle hinzuzufügen. Anschließend schreiben Sie eine Anweisung, die eine Einschränkung für das Geburtsdatum zur Employees-Tabelle hinzufügt, und führen die Anweisung aus. Zum Schluss schreiben Sie eine Anweisung, um die neuen Einschränkungen zu testen, und führen die An-weisung aus. 1. Öffnen Sie C:\Moc\2328A\Labfiles\L05\ChkConst.sql, sehen Sie sich den

Inhalt der Datei an, und führen Sie sie dann aus. Dieses Skript fügt eine CHECK-Einschränkung für die Anrede zur Employees-Tabelle der ClassNorthwind-Datenbank hinzu.

2. Schreiben Sie eine Anweisung, die die Einschränkung CK_BirthDate zur BirthDate-Spalte der Employees-Tabelle hinzufügt, und führen Sie die An-weisung aus. Der Wert in der BirthDate-Spalte muss einem Datum ent-sprechen, das vor dem heutigen Datum liegt. C:\Moc\2328A\Labfiles\L05\Answers\BirthDate.sql enthält ein fertiges Skript für diesen Schritt. USE ClassNorthwind ALTER TABLE Employees ADD CONSTRAINT CK_BirthDate CHECK (BirthDate < GETDATE()) GO

Page 281: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 5: Implementieren der Datenintegrität 35

3. Führen Sie Anweisungen aus, die alle Einschränkungen verletzen. Verwenden Sie die folgenden Beispiele als Vorlage. USE ClassNorthwind GOUPDATE Employees SET TitleOfCourtesy = 'None' WHERE EmployeeID = 1 GOUPDATE Employees SET BirthDate = (GETDATE()+1) WHERE EmployeeID = 1 GO

Was geschieht? In allen Fällen wird der Befehl mit der Meldung unterbrochen, dass die UPDATE-Anweisung einen Konflikt mit der Einschränkung verursacht hat.____________________________________________________________

____________________________________________________________

4. Führen Sie sp_helpconstraint Tabellenname und sp_help Einschrän-kungsname aus, um Informationen zu den soeben erstellten CHECK-Einschränkungen anzuzeigen. EXEC SP_HELPCONSTRAINT Employees GO

EXEC SP_HELP CK_TitleOfCourtesyGO

EXEC SP_HELP CK_BirthDateGO

Page 282: Programmieren Einer Microsoft SQL Server 2000-Datenbank

36 Unterrichtseinheit 5: Implementieren der Datenintegrität

Übung 3 Definieren von PRIMARY KEY-Einschränkungen

In dieser Übung fügen Sie PRIMARY KEY-Einschränkungen zu allen Tabellen der ClassNorthwind-Datenbank hinzu.

� So definieren Sie eine PRIMARY KEY-Einschränkung In diesem Verfahren führen Sie zunächst ein Skript aus, das einen Primär-schlüssel für die Employees-Tabelle erstellt. Anschließend schreiben Sie eine Anweisung, um eine PRIMARY KEY-Einschränkung für die Customers-Tabelle zu erstellen. Zum Schluss führen Sie ein Skript aus, das PRIMARY KEY-Einschränkungen zu den anderen Tabellen in der ClassNorthwind-Datenbank hinzufügt. 1. Öffnen Sie C:\Moc\2328A\Labfiles\L05\Prikey1.sql. Sehen Sie sich den

Inhalt der Datei an, und führen Sie sie aus, um eine PRIMARY KEY-Einschränkung für die Employees-Tabelle in der ClassNorthwind-Datenbank zu erstellen.

2. Schreiben Sie eine Anweisung, die eine PRIMARY KEY-Einschränkung mit der Bezeichnung PK_Customers zur CustomerID-Spalte der Customers-Spalte hinzufügt, und führen Sie die Anweisung aus. C:\Moc\2328A\Labfiles\L05\Answers\PriTitle.sql enthält ein fertiges Skript für diesen Schritt. USE ClassNorthwind ALTER TABLE Customers ADD CONSTRAINT PK_Customers PRIMARY KEY NONCLUSTERED (CustomerID) GO

Wie wirkt sich die Erstellung einer PRIMARY KEY-Einschränkung auf nicht gruppierte Indizes aus, die mit der Tabelle verknüpft sind? Eine PRIMARY KEY-Einschränkung erstellt automatisch einen grup-pierten Index, und die Erstellung eines gruppierten Indexes führt wiederum dazu, dass alle nicht gruppierten Indizes automatisch neu erstellt werden. ____________________________________________________________

____________________________________________________________

3. Öffnen Sie die Datei C:\Moc\2328A\Labfiles\L05\PriKey2.sql. Sehen Sie sich den Inhalt der Datei an, und führen Sie sie aus, um PRIMARY KEY-Einschränkungen für die verbleibenden Tabellen in der ClassNorthwind-Datenbank zu erstellen.

Page 283: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 5: Implementieren der Datenintegrität 37

4. Führen Sie die gespeicherte Systemprozedur sp_helpconstraint aus, um Informationen zu der PRIMARY KEY-Einschränkung anzuzeigen, die Sie für die orders-Tabelle erstellt haben. Führen Sie außerdem die gespeicherte Systemprozedur sp_help für die Einschränkung in PK_Employees der ClassNorthwind-Datenbank aus. EXEC SP_HELPCONSTRAINT orders GO

EXEC SP_HELP PK_EmployeesGO

Page 284: Programmieren Einer Microsoft SQL Server 2000-Datenbank

38 Unterrichtseinheit 5: Implementieren der Datenintegrität

Übung 4 Definieren von FOREIGN KEY-Einschränkungen

In dieser Übung fügen Sie FOREIGN KEY-Einschränkungen zu Tabellen der ClassNorthwind-Datenbank hinzu.

� So definieren Sie eine FOREIGN KEY-Einschränkung In diesem Verfahren führen Sie zunächst ein Skript aus, das einen Fremd-schlüssel für die Orders-Tabelle erstellt. Anschließend schreiben Sie eine Anweisung, um eine FOREIGN KEY-Einschränkung für die Orders-Tabelle zu erstellen. Zum Schluss führen Sie ein Skript aus, das FOREIGN KEY-Einschränkungen zu den anderen Tabellen in der ClassNorthwind-Datenbank hinzufügt. 1. Öffnen Sie die Datei C:\Moc\2328A\Labfiles\L05\ForKey1.sql. Sehen Sie

sich den Inhalt der Datei an, und führen Sie sie aus, um eine FOREIGN KEY-Einschränkung für die Orders-Tabelle zu erstellen. Warum war es nicht notwendig, eine DROP INDEX-Anweisung auszu-führen? Beim Erstellen einer FOREIGN KEY-Einschränkung wird nicht auto-matisch ein Index erzeugt. ____________________________________________________________

____________________________________________________________

Verhindert die FOREIGN KEY-Einschränkung, dass die Tabelle, auf die verwiesen wird, gelöscht oder abgeschnitten wird? Ja. Es ist nicht möglich, eine Tabelle zu löschen, auf die von einer FOREIGN KEY-Einschränkung verwiesen wird. Das Abschneiden einer Tabelle, auf die von einer FOREIGN KEY-Einschränkung ver-wiesen wird, würde ebenfalls die Einschränkung verletzen, da die Primärschlüssel, auf die sie verweist, nicht mehr vorhanden wären. ____________________________________________________________

____________________________________________________________

2. Schreiben Sie eine Anweisung, die eine FOREIGN KEY-Einschränkung mit der Bezeichnung FK_Products_Categories zur CategoryID-Spalte der Products-Tabelle hinzufügt, wobei die Einschränkung auf die CategoryID-Spalte in der Categories-Tabelle verweist. Führen Sie die Anweisung aus. Geben Sie eine Option an, die nicht überprüft, ob die vorhandenen Daten der neuen Einschränkung entsprechen. C:\Moc\2328A\Labfiles\L05\Answers\ForeignKeyProd.sql enthält ein fertiges Skript für diesen Schritt. USE ClassNorthwind ALTER TABLE dbo.Products WITH NOCHECK ADD CONSTRAINT FK_Products_Categories FOREIGN KEY(CategoryID) REFERENCES dbo.Categories(CategoryID) GO

Page 285: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 5: Implementieren der Datenintegrität 39

3. Öffnen Sie die Datei C:\Moc\2328A\Labfiles\L05\ForKey2.sql. Sehen Sie sich den Inhalt der Datei an, und führen Sie sie aus, um die verbleibenden FOREIGN KEY-Einschränkungen in der ClassNorthwind-Datenbank zu erstellen.

4. Führen Sie sp_helpconstraint Tabellenname aus, um Informationen zu einigen der zuvor erstellten FOREIGN KEY-Einschränkungen anzuzeigen. Sie können für diesen Schritt die folgenden Tabellen mit FOREIGN KEY-Einschränkungen verwenden: Products, Orders, Order Details, Suppliersund Employees.USE NorthwindGOEXEC SP_HELPCONSTRAINT Products GOEXEC SP_HELPCONSTRAINT Employees GO..

Page 286: Programmieren Einer Microsoft SQL Server 2000-Datenbank

40 Unterrichtseinheit 5: Implementieren der Datenintegrität

Wenn Sie noch Zeit haben Erstellen von Standardwerten und Regeln

In dieser Übung fügen Sie Standardwerte und Regeln zur ClassNorthwind-Datenbank hinzu.

� So erstellen Sie einen Standardwert In diesem Verfahren führen Sie ein Skript aus, um einen Standardwert zu er-stellen und an eine Spalte zu binden. Anschließend überprüfen Sie, ob der Standardwert ordnungsgemäß funktioniert. 1. Öffnen Sie C:\Moc\2328A\Labfiles\L05\CreaDefa.sql, sehen Sie sich den

Inhalt der Datei an, und führen Sie sie dann aus. Dieses Skript erstellt einen Standardwert und bindet ihn an die Suppliers.Country-Spalte. Der Standardwert ist Singapore.

2. Führen Sie eine Anweisung aus, die einen neuen Datensatz einfügt, um zu überprüfen, ob der Standardwert ordnungsgemäß funktioniert. Das folgende Beispiel veranschaulicht die Vorgehensweise für die Suppliers-Tabelle. Sie können das Beispiel ändern und einen Firmennamen Ihrer Wahl verwenden. USE ClassNorthwind INSERT Suppliers (CompanyName) VALUES ('Karl''s Bakery') GO

3. Schreiben Sie eine Anweisung, die die Suppliers-Tabelle abfragt, um die Ergebnisse anzuzeigen, und führen Sie die Anweisung aus. Im folgenden Beispiel wird davon ausgegangen, dass Sie die Daten aus dem vorherigen Schritt verwenden. USE ClassNorthwind SELECT * FROM Suppliers WHERE Country = 'Singapore' GO

� So erstellen Sie eine Regel In diesem Verfahren führen Sie ein Skript aus, um eine Regel zu erstellen und an eine Spalte zu binden. Anschließend überprüfen Sie, ob die Regel ordnungs-gemäß funktioniert. 1. Öffnen Sie C:\Moc\2328A\Labfiles\L05\CreaRule.sql, sehen Sie sich den

Inhalt der Datei an, und führen Sie sie dann aus. Dieses Skript erstellt eine Regel für Pfade, die sicherstellt, dass die Pfade für Angestelltenfotografien dem im Skript vorgegebenen Format ent-sprechen.

2. Führen Sie die folgende UPDATE-Anweisung aus, um die Regel zu testen, indem Sie versuchen, die PhotoPath-Spalte mit einem ungültigen Pfad zu aktualisieren. Die Anweisung sollte fehlschlagen, da sie gegen die Regel für den Pfad verstößt. USE ClassNorthwind UPDATE Employees SET PhotoPath = 'http://accweb/xemmployees/new.bmp' WHERE LastName = 'Fuller' GO

Page 287: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 5: Implementieren der Datenintegrität 41

Lernzielkontrolle

� Datenintegritätstypen

� Erzwingen der Datenintegrität

� Definieren von Einschränkungen

� Einschränkungstypen

� Deaktivieren von Einschränkungen

� Verwenden von Standardwerten und Regeln

� Auswählen der geeigneten Methode zum Erzwingen der Datenintegrität

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

1. Welche Art von Einschränkung würden Sie zum Country-Feld Ihrer Datenbank hinzufügen, um sicherzustellen, dass Ihre Niederlassung in Indonesien nur mit anderen indonesischen Firmen Geschäfte macht? Eine CHECK-Einschränkung (oder eine Regel).

2. Nach der Implementierung der Einschränkung oder Regel aus Frage 1 beklagen sich die Mitarbeiter, die für die Dateneingabe verantwortlich sind, dass sie das Wort Indonesia immer wieder eingeben müssen. Wie können Sie dieses Problem lösen? Mit Hilfe einer DEFAULT-Einschränkung (oder eines Standard-wertes).

ThemaVertiefen Sie die Lernziele dieser Unterrichtseinheit, indem Sie die Kernpunkte wiederholen.

EinstiegDie Fragen zur Lernziel-kontrolle beziehen sich auf einige der Schlüsselkon-zepte, die Inhalt dieser Unterrichtseinheit sind.

Page 288: Programmieren Einer Microsoft SQL Server 2000-Datenbank

42 Unterrichtseinheit 5: Implementieren der Datenintegrität

3. Ihr Unternehmen wurde umstrukturiert, und die Niederlassung in Indonesien wurde aufgelöst. Die neue Niederlassung befindet sich in Malaysia und wickelt nun Geschäfte mit zahlreichen anderen ostasiatischen Ländern ab. Derzeit gibt es 4,5 Millionen Verkaufsdatensätze, in denen das Country-Feld den Wert Indonesia enthält. Wie müssen Sie vorgehen, um neue Länder hinzufügen und gleichzeitig die Zeilen, die den Wert Indonesiaenthalten, beibehalten zu können? Ändern Sie die Tabelle, indem Sie die vorhandene Einschränkung löschen und durch eine neue Einschränkung ersetzen. Verwenden Sie beim Hinzufügen der Einschränkung die Option WITH NOCHECK.

4. Ihr Auftragseingabesystem weist zwei Haupttabellen auf: Orders und Customers. Welche Datenintegritätskomponenten sollten Sie in Betracht ziehen, wenn Sie sicherstellen möchten, dass alle Aufträge und Kunden eindeutig identifiziert werden können? Wie würden Sie die Beziehung zwischen den beiden Tabellen verwalten? Definieren Sie unbedingt eine PRIMARY KEY-Einschränkung für die „Customers“-Tabelle. Verwenden Sie eine FOREIGN KEY-Einschrän-kung für die „Orders“-Tabelle, um auf die „Customers“-Tabelle zu verweisen.

Page 289: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Inhalt

Übersicht 1

Einführung in Indizes 2

Indexarchitektur 7

Abrufen von gespeicherten Daten durch SQL Server 12

Verwaltung von Index- und Heapstrukturen durch SQL Server 19

Entscheiden, welche Spalten indiziert werden 25

Empfohlene Methoden 39

Übungseinheit A: Bestimmen der Indizes für eine Tabelle 40

Lernzielkontrolle 44

Unterrichtseinheit 6: Planen von Indizes

Page 290: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Die in diesen Unterlagen enthaltenen Angaben und Daten können ohne vorherige Ankündigung geändert werden. Die in diesen Unterlagen genannten Firmen, Produkte, Menschen, Charaktere und/oder Daten sind frei erfunden und sollen keine wirklichen Individuen, Gesellschaften, Produkte oder Veranstaltungen darstellen, soweit nichts anderes angegeben ist. Die Benutzer/innen sind verpflichtet, sich an alle anwendbaren Urheberrechtsgesetze zu halten. Ohne ausdrückliche schriftliche Erlaubnis der Microsoft Corporation darf kein Teil dieser Unterlagen für irgendwelche Zwecke vervielfältigt oder übertragen werden, unabhängig davon, auf welche Art und Weise oder mit welchen Mitteln, elektronisch oder mechanisch, dies geschieht. Wenn auf dieses Dokument nur auf elektronischem Wege zugegriffen werden kann, sind Sie hiermit berechtigt, eine (1) Kopie zum persönlichen Gebrauch auszudrucken.

Microsoft Corporation kann Inhaber von Patenten oder Patentanträgen, Marken, Urheberrechten oder anderen gewerblichen Schutzrechten sein, die den Inhalt dieses Dokuments betreffen. Die Bereitstellung dieses Dokuments gewährt keinerlei Lizenzrechte an diesen Patenten, Marken, Urheberrechten oder anderen gewerblichen Schutzrechten, es sei denn, dies wurde ausdrücklich durch einen schriftlichen Lizenzvertrag mit der Microsoft Corporation vereinbart.

2000 Microsoft Corporation. Alle Rechte vorbehalten.

Microsoft, ActiveX, BackOffice, MS-DOS, PowerPoint, Visual Basic, Visual C++, Visual Studio, Windows und Windows NT sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern.

Andere in diesem Dokument aufgeführte Produkt- und Firmennamen sind möglicherweise Marken der jeweiligen Eigentümer.

Project Lead: Rich Rose Instructional Designers: Rich Rose, Cheryl Hoople, Marilyn McGill Instructional Software Design Engineers: Karl Dehmer, Carl Raebler, Rick Byham Technical Lead: Karl Dehmer Subject Matter Experts: Karl Dehmer, Carl Raebler, Rick Byham Graphic Artist: Kirsten Larson (Independent Contractor) Editing Manager: Lynette Skinner Editor: Wendy Cleary Copy Editor: Edward McKillop (S&T Consulting) Production Manager: Miracle Davis Production Coordinator: Jenny Boe Production Support: Lori Walker (S&T Consulting) Test Manager: Sid Benavente Courseware Testing: TestingTesting123 Classroom Automation: Lorrin Smith-Bates Creative Director, Media/Sim Services: David Mahlmann Web Development Lead: Lisa Pease CD Build Specialist: Julie Challenger Online Support: David Myka (S&T Consulting) Localization Manager: Rick Terek Operations Coordinator: John Williams Manufacturing Support: Laura King; Kathy Hershey Lead Product Manager, Release Management: Bo Galford Lead Product Manager, Data Base: Margo Crandall Group Manager, Courseware Infrastructure: David Bramble Group Product Manager, Content Development: Dean Murray General Manager: Robert Stewart

Page 291: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 6: Planen von Indizes iii

Hinweise für den Kursleiter Diese Unterrichtseinheit gibt den Kursteilnehmern eine Übersicht über das Planen von Indizes. Es wird erläutert, wie Indizes die Datenbankleistung ver-bessern können. Außerdem wird beschrieben, wie Microsoft®SQL Server™ 2000 gruppierte und nicht gruppierte Indizes speichert und wie SQL Server mit Hilfe von Indizes Zeilen abruft. Weiterhin wird gezeigt, wie SQL Server Indizes verwaltet. Abschließend werden die Richtlinien beschrie-ben, mit deren Hilfe entschieden werden kann, welche Spalten indiziert werden sollen.

In der Übungseinheit untersuchen die Kursteilnehmer zwei Methoden zum Be-stimmen der Indizes für eine Tabelle.

Am Ende dieser Unterrichtseinheit werden die Kursteilnehmer in der Lage sein, die folgenden Aufgaben auszuführen:

� Beschreiben, warum und wann ein Index verwendet wird. � Beschreiben, wie SQL Server gruppierte und nicht gruppierte Indizes ver-

wendet. � Beschreiben, wie die Indexarchitektur von SQL Server das Abrufen von

Daten erleichtert. � Beschreiben, wie SQL Server Indizes und Heaps verwaltet. � Beschreiben der Bedeutung von Datenselektivität, Datendichte und Daten-

verteilung bei der Entscheidung, welche Spalten indiziert werden sollen.

Unterlagen und Vorbereitung Dieser Abschnitt beschreibt die erforderlichen Unterlagen und vorbereitenden Aufgaben, die nötig sind, um diese Unterrichtseinheit zu unterrichten.

Erforderliche Unterlagen Um diese Unterrichtseinheit zu unterrichten, benötigen Sie folgende Unterlagen:

� Die Microsoft PowerPoint®-Datei 2328A_06.ppt� Die Beispieldatei C:\Moc\2328A\Demo\D06_Ex.sql, die alle Beispiel-

skripts der Unterrichtseinheit enthält, soweit in der Unterrichtseinheit nichts anderes angegeben ist.

Vorbereitende Aufgaben Zur Vorbereitung dieser Unterrichtseinheit gehen Sie folgendermaßen vor:

� Lesen Sie alle Unterlagen für diese Unterrichtseinheit. � Arbeiten Sie die Übungseinheit durch.

Präsentation:90 Minuten

Übungseinheit:15 Minuten

Page 292: Programmieren Einer Microsoft SQL Server 2000-Datenbank

iv Unterrichtseinheit 6: Planen von Indizes

MultimediapräsentationIn diesem Abschnitt werden Vorgehensweisen bei der Multimediapräsentation beschrieben, die nicht in den Randnotizen enthalten und nicht für die Unter-lagen der Kursteilnehmer geeignet sind.

SQL Server-Indexarchitektur � So bereiten Sie die Multimediapräsentation vor und starten sie • Klicken Sie auf die Schaltfläche auf der Folie, um die Multimedia-

präsentation zu starten. In dieser Multimediapräsentation wird die SQL Server-Indexarchitektur vor-gestellt. Zu Beginn wird das Konzept des B-Baumes beschrieben (Balanced Tree, B-Tree). Anschließend wird die Architektur eines gruppierten Indexes beschrieben, und es wird erläutert, wie Daten gespeichert werden und wie in einem gruppierten Index auf Daten zugegriffen wird. Im weiteren Verlauf wird die Architektur eines nicht gruppierten Indexes beschrieben, und es wird erklärt, inwiefern sie sich von der eines grup-pierten Indexes unterscheidet. Dabei wird hervorgehoben, dass ein nicht gruppierter Index zwei unterschiedliche Strukturen aufweisen kann. Ab-schließend wird vorgeführt, wie mit Hilfe eines nicht gruppierten Indexes, der auf Basis eines Heaps erstellt wurde, und mit Hilfe eines nicht gruppier-ten Indexes, der auf Basis eines gruppierten Indexes erstellt wurde, auf Daten zugegriffen wird.

Sonstige Aktivitäten In diesem Abschnitt werden Verfahren bereitgestellt, mit denen interaktive Aktivitäten zum Anzeigen und Überprüfen von Informationen implementiert werden, wie Spiele oder Übungen mit Rollenspielen.

Anzeigen der PowerPoint-Animationen Alle Animationen sind durch ein Hyperlinksymbol in der unteren linken Ecke der Folie gekennzeichnet.

� So zeigen Sie die Folie „Suchen nach Zeilen ohne Indizes“ an Diese Folie zeigt, wie SQL Server Zeilen in einem Heap findet, wenn keine nützlichen Indizes vorhanden sind. 1. Zeigen Sie die Folie mit dem Thema an, auf der die sysindexes-Tabelle, die

IAM-Seite (Index Allocation Map) sowie Datenseiten sichtbar sind. Weisen Sie darauf hin, dass die Datenseiten in einem Heap gespeichert und keine nicht gruppierten Indizes vorhanden sind.

2. Fahren Sie mit der ersten Animation fort. Beschreiben Sie, wie die FirstIAM-Spalte der sysindexes-Tabelle SQL Server auf die IAM-Seite verweist.

3. Fahren Sie mit der letzten Animation fort. Sie zeigt, wie die IAM-Seite SQL Server zu den Blöcken führt, die Daten für die Tabelle enthalten. Besprechen Sie die IAM-Seite nicht im Detail. Weisen Sie darauf hin, dass Tabellenscans eine effiziente Methode dar-stellen, um alle Zeilen einer Tabelle zurückzugeben.

Page 293: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 6: Planen von Indizes v

� So zeigen Sie die Folie „Suchen von Zeilen in einem Heap mit einem nicht gruppierten Index“ an

Diese Folie zeigt, wie SQL Server mit Hilfe eines nicht gruppierten Indexes eines Heaps auf den Bereich von Nachnamen zwischen Masters und Ruddzugreift. 1. Zeigen Sie die Folie mit dem Thema an, auf der die Architektur eines nicht

gruppierten Indexes eines Heaps und die SELECT-Anweisung angezeigt werden.

2. Fahren Sie mit der ersten Animation fort, bei der gezeigt wird, wie SQL Server den nicht gruppierten Index verwendet, um die Blattebene des Indexes mit dem Nachnamen Matey zu suchen. Die Indexzeile ist ausge-wählt.

3. Fahren Sie mit der nächsten Animation fort. Sie zeigt, wie SQL Server die Zeilen-ID verwendet, um den Nachnamen Matey in den Datenseiten zu suchen.

4. Fahren Sie mit der letzten Animation fort. Hier zeigt der Pfeil auf die nächs-ten Zeilen auf der Blattebene des Indexes und sucht mit Hilfe der Zeilen-ID die anderen Zeilen im Heap. Betonen Sie, dass die Zeilen-ID Zeilen, die identische Nachnamen wie z. B. Jones enthalten, eindeutig identifiziert. SQL Server gibt diese Zeilen als Reaktion auf die Abfrage zurück.

� So zeigen Sie die Folie „Suchen von Zeilen in einem gruppierten Index“ an

Diese Folie zeigt, wie SQL Server eine Zeile in einem gruppierten Index sucht, wobei mit der sysindexes-Tabelle begonnen wird. 1. Zeigen Sie die Folie mit dem Thema an, auf der die Architektur eines grup-

pierten Indexes und die SELECT-Anweisung angezeigt werden. 2. Fahren Sie mit der ersten und einzigen Animation fort, bei der eine Gruppe

von Pfeilen den Pfad im Index anzeigt, den SQL Server durchläuft, um die Zeile für Ota zu suchen. Betonen Sie, dass die Blattebene des gruppierten Indexes nach dem Grup-pierungsschlüssel lastname sortiert ist.

Page 294: Programmieren Einer Microsoft SQL Server 2000-Datenbank

vi Unterrichtseinheit 6: Planen von Indizes

� So zeigen Sie die Folie „Suchen von Zeilen in einem gruppierten Index mit einem nicht gruppierten Index“ an

Diese Folie zeigt, wie SQL Server mit Hilfe eines nicht gruppierten Indexes für firstname und eines gruppierten Indexes für lastname auf eine einzelne Zeile mit dem Vornamen Mike zugreift. 1. Zeigen Sie die Folie mit dem Thema an, auf der die Architektur eines nicht

gruppierten Indexes für einen gruppierten Index und die SELECT-Anwei-sung angezeigt werden.

2. Fahren Sie mit der ersten Animation fort, bei der eine Gruppe von Pfeilen den Pfad im gruppierten Index anzeigt, den SQL Server durchläuft, um die Zeile mit dem Vornamen Mike zu suchen.

3. Fahren Sie mit der nächsten Animation fort, bei der eine Gruppe von Pfeilen zeigt, wie SQL Server den Gruppierungsschlüssel mit dem Nachnamen Nash verwendet, um die Zeile im gruppierten Index zu suchen. Weisen Sie darauf hin, dass SQL Server zwei Indizes durchlaufen muss, um den Eintrag zu finden, dass jedoch Indexabrufe schnell durchgeführt werden können und sich die oberen Ebenen des Indexes häufig im Arbeitsspeicher befinden.

� So zeigen Sie die Folie „Seitenteilungen in einem Index“ an Diese Folie zeigt, wie und warum SQL Server eine Datenseite teilt. 1. Zeigen Sie die Folie mit dem Thema an. Lesen Sie die Transact-SQL-An-

weisung, und zeigen Sie, wo die neue Zeile gespeichert wird. Weisen Sie darauf hin, dass es für die Zeile keinen Platz gibt.

2. Fahren Sie mit der Folie fort, die die Seitenteilung zeigt. Weisen Sie darauf hin, dass eine neue Seite hinzugefügt und der Inhalt auf die alte und neue Seite aufgeteilt (geteilt) wurde.

� So zeigen Sie die Folie „Vorwärtszeiger in einem Heap“ an Diese Folie zeigt, wie und warum SQL Server in einem Heap einen Vorwärts-zeiger verwendet. 1. Zeigen Sie die Folie mit dem Thema an. Lesen Sie die Transact-SQL-An-

weisung, und weisen Sie darauf hin, dass für die Aktualisierung der Zeile für Ota die Zeile größer werden muss.

2. Fahren Sie mit der nächsten Animation fort, bei der gezeigt wird, wie die Zeile mit Hilfe des Indexes gesucht werden kann. Betonen Sie, dass die Datenseite voll ist; für eine größere Zeile ist kein Platz.

3. Fahren Sie mit der letzten Animation fort. Sie zeigt, wie die Zeile auf eine andere Seite verschoben wird. Erläutern Sie, wie der ursprüngliche Speicherort einen Vorwärtszeiger für den neuen Speicherort beibehält. Wei-sen Sie darauf hin, dass der nicht gruppierte Index nach wie vor auf den ur-sprünglichen Speicherort verweist.

Page 295: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 6: Planen von Indizes vii

Strategie für die Unterrichtseinheit Verwenden Sie die folgende Strategie, um diese Unterrichtseinheit zu präsentieren:

� Einführung in Indizes Beschreiben Sie, auf welche Art und Weise SQL Server Daten speichert und auf die Daten zugreift. Erläutern Sie anschließend die Gründe, die für und gegen das Erstellen von Indizes sprechen. Erklären Sie, wie SQL Server Indizes verwendet.

� Indexarchitektur Spielen Sie die Multimediapräsentation zur SQL Server-Indexarchitektur ab. Vermeiden Sie es, auf die Verwendung von Indizes im Detail einzu-gehen, da die verschiedenen Arten des Datenabrufs in nachfolgenden Ab-schnitten dieser Unterrichtseinheit behandelt werden. Erläutern Sie, wie SQL Server Heaps verwendet, und stellen Sie bestimmte Aspekte gruppierter und nicht gruppierter Indizes dar.

� Abrufen von gespeicherten Daten durch SQL Server Die Abbildungen in diesem Abschnitt stellen eine Wiederholung eines Großteils des in der Multimediapräsentation behandelten Inhalts dar. Die Zeit, die für das Besprechen jeder Folie aufgewendet wird, sollte je nach Kenntnisstand der Kursteilnehmer variieren. Geben Sie den Kursteilnehmern eine Einführung in sysindexes. Weisen Sie darauf hin, dass die IAM-Seite für Tabellen- oder Indexscans verwendet wird und der Stamm zum Durchführen eines Drilldowns durch die Indizes verwendet wird. Unterscheiden Sie zwischen einem Heap und einer Tabelle mit einem gruppierten Index. Stellen Sie sicher, dass die Kursteilnehmer verstehen, wie ein nicht gruppierter Index entweder den gruppierten Index oder die Zeilen-ID (Row ID, RID) eines Heaps verwendet. Betonen Sie, dass ein kürzerer Wert für einen gruppierten Index einen effizienteren nicht gruppierten Index bildet, dass jedoch gruppierte Indizes hauptsächlich im Hinblick auf den Bereich von erwarteten Abfragen ausgewählt werden.

� Verwaltung von Index- und Heapstrukturen durch SQL Server Stellen Sie sicher, dass die Kursteilnehmer verstehen, warum Seiten geteilt werden. Betonen Sie, dass für Seitenteilungen normalerweise keine Index-verwaltung erforderlich ist. Gehen Sie auf Vorwärtszeiger ein, und heben Sie hervor, dass es mit ihrer Hilfe weniger häufig notwendig ist, nicht gruppierte Indizes zu aktualisieren. Wiederholen Sie die Kernpunkte in Bezug auf Aktualisierungen und Löschungen.

� Entscheiden, welche Spalten indiziert werden Wiederholen Sie Grundlegendes zu Indizes, um deutlich zu machen, wie wichtig es ist, nützliche Indizes zu erstellen. Wiederholen Sie z. B. Grund-legendes zu den Daten und zum Schreiben von Abfragen, die eine Suche begrenzen. Erklären Sie dann, wie wichtig es ist, die entsprechenden zu indizierenden Spalten auszuwählen, da sich die Datenselektivität, die Daten-dichte und die Datenverteilung die Art und Weise beeinflussen, wie der Abfrageoptimierer auf Daten zugreift.

Page 296: Programmieren Einer Microsoft SQL Server 2000-Datenbank

viii Unterrichtseinheit 6: Planen von Indizes

AnpassungsinformationenDieser Abschnitt beschreibt die Anforderungen zum Einrichten der Übungs-einheiten für eine Unterrichtseinheit sowie die Konfigurationsänderungen, die während der Übungseinheiten an den Kursteilnehmercomputern vorgenommen werden. Diese Informationen sollen Ihnen beim Replizieren oder Anpassen der Microsoft Official Curriculum-Courseware (MOC) helfen.

Die Übungseinheit in dieser Unterrichtseinheit hängt auch von der Schulungsraumkonfiguration ab, die im Abschnitt „Anpassungsinformationen“ am Ende des Dokuments Handbuch für das Einrichten von Schulungs-computern für Kurs 2328A, Programmieren einer Microsoft SQL Server 2000-Datenbank, angegeben ist.

Einrichten der Übungseinheit Im folgenden Abschnitt wird die Anforderung zum Einrichten der Übungs-einheit dieser Unterrichtseinheit beschrieben.

Anforderung zum Einrichten der Übungseinheit Für die Übungseinheit dieser Unterrichtseinheit muss sich die credit-Datenbank in den für diese Übungseinheit erforderlichen Zustand zurückversetzt werden. Damit Kursteilnehmercomputer diese Anforderung erfüllen, müssen Sie eine der folgenden Aktionen durchführen:

� Bearbeiten der vorherigen Übungseinheit. � Ausführen der Batchdatei C:\Moc\2328A\Batches\RestoreCredit.cmd.

Wenn dieser Kurs angepasst wurde, müssen die Kursteilnehmer die Batchdatei C:\Moc\2328A\Batches\RestoreCredit.cmd ausführen, um sicher-zustellen, dass die erste Übungseinheit ordnungsgemäß durchgeführt werden kann.

Ergebnisse der Übungseinheit Auf den Kursteilnehmercomputern gibt es keine Konfigurationsänderungen, die die Replikation oder die Anpassung betreffen.

Wichtig

Achtung

Page 297: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 6: Planen von Indizes 1

Übersicht

� Einführung in Indizes

� Indexarchitektur

� Abrufen von gespeicherten Daten durch SQL Server

� Verwaltung von Index- und Heapstrukturen durch SQL Server

� Entscheiden, welche Spalten indiziert werden

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Diese Unterrichtseinheit vermittelt eine Übersicht über die Planung von Indizes. Es wird erläutert, wie Indizes die Datenbankleistung verbessern können. Es wird beschrieben, wie Microsoft® SQL Server™ 2000 gruppierte und nicht gruppierte Indizes speichert und wie SQL Server Zeilen mit Hilfe von Indizes abruft. Außerdem erfahren Sie, wie SQL Server Indizes verwaltet. Die Unter-richtseinheit schließt mit Richtlinien für die Entscheidung über die zu indizie-renden Spalten.

Am Ende dieser Unterrichtseinheit werden Sie in der Lage sein, die folgenden Aufgaben auszuführen:

� Beschreiben, warum und wann ein Index verwendet wird. � Beschreiben, wie SQL Server gruppierte und nicht gruppierte Indizes

verwendet. � Beschreiben, wie die Indexarchitektur von SQL Server das Abrufen von

Daten erleichtert. � Beschreiben, wie SQL Server Indizes und Heaps verwaltet. � Beschreiben der Bedeutung von Datenselektivität, Datendichte und Daten-

verteilung bei der Entscheidung, welche Spalten indiziert werden sollen.

ThemaGeben Sie eine Übersicht über die Themen und Lern-ziele dieser Unterrichts-einheit.

EinstiegIn dieser Unterrichtseinheit lernen Sie, wann und warum Sie Indizes erstellen und welche verschiedenen Indextypen es gibt. Sie erfahren, wie SQL Server Indizes verwendet und verwaltet und wie Sie den für Ihre Zwecke geeigneten Index planen.

Page 298: Programmieren Einer Microsoft SQL Server 2000-Datenbank

2 Unterrichtseinheit 6: Planen von Indizes

���� Einführung in Indizes

� Datenspeicherung und Datenzugriff in SQL Server

� Gründe für die Indexerstellung

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Durch Verwenden von Indizes kann die Datenbankleistung erheblich verbessert werden. In diesem Abschnitt werden die grundlegenden Indexkonzepte vorge-stellt, und es wird erläutert, wann und warum Indizes verwendet werden.

ThemaGeben Sie eine Einführung in Indizes.

EinstiegIn diesem Abschnitt wird be-schrieben, warum und wann ein Index verwendet wird.

Page 299: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 6: Planen von Indizes 3

Datenspeicherung und Datenzugriff in SQL Server

� Art der Datenspeicherung� Zeilen werden in Datenseiten gespeichert� Ein Heap besteht aus mehreren Datenseiten für eine Tabelle

� Datenzugriff� Alle Datenseiten einer Tabelle werden durchsucht� Verwenden eines Indexes, der auf Daten auf einer Seite zeigt

DatenseitenSeite 7 Seite 8 Seite 9

AkhtarAkhtarFunkFunkSmithSmithMartinMartin......

Seite 4 Seite 5 Seite 6 ..............................

ConConFunkFunkWhiteWhite............

RuddRuddWhiteWhiteBarrBarr............

SmithSmithOtaOtaJonesJones............

MartinMartinPhuaPhuaJonesJonesSmithSmith......

GanioGanioJonesJonesHallHall............

......

......

......

......

......

......

......

......

......

......

......

......

......

......

......

......

......

......

......

......

......

......

......

......

......

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Um zu verstehen, wie SQL Server auf Daten zugreift, müssen Sie wissen, wie diese Daten gespeichert werden.

Auf den Datenseiten der Folie sind zwar nur die Nachnamen zu sehen, es werden dort jedoch die vollständigen Zeilen gespeichert.

Art der Datenspeicherung Ein Heap besteht aus mehreren Datenseiten, die die Zeilen einer Tabelle enthalten:

� Jede Datenseite enthält 8 KB Daten. Eine Gruppe von acht aufeinander folgenden Seiten wird als Block bezeichnet.

� Die Datenzeilen werden nicht in einer bestimmten Reihenfolge gespeichert, und es gibt auch keine bestimmte Reihenfolge für die Datenseiten.

� Die Datenseiten sind nicht in einer verknüpften Liste verknüpft. � Wenn einer Seite Zeilen hinzugefügt werden und diese Seite voll ist, wird

die Datenseite geteilt.

ThemaErläutern Sie, wie SQL Server Daten speichert und auf die Daten zugreift.

EinstiegUm zu verstehen, wie SQL Server auf Daten zu-greift, müssen Sie wissen, wie diese Daten gespeichert werden.

Methodischer Hinweis Weisen Sie darauf hin, dass auf den Datenseiten der Folie zwar nur die Nach-namen zu sehen sind, dort aber die vollständigen Zeilen gespeichert werden.

Anmerkung

Page 300: Programmieren Einer Microsoft SQL Server 2000-Datenbank

4 Unterrichtseinheit 6: Planen von Indizes

DatenzugriffSQL Server verwendet zwei Methoden für den Zugriff auf Daten:

� Alle Datenseiten einer Tabelle werden durchsucht - dieses Verfahren wird als Tabellenscan bezeichnet. Bei einem Tabellenscan geht SQL Server folgendermaßen vor:

• Der Scan beginnt am Anfang der Tabelle.

• Seite für Seite werden alle Zeilen der Tabelle gescannt.

• Die Zeilen, die den Abfragekriterien entsprechen, werden extrahiert. � Es werden Indizes verwendet. Bei der Verwendung eines Indexes geht

SQL Server folgendermaßen vor:

• Die Indexarchitektur wird nach den Zeilen durchsucht, die von der Abfrage angefordert werden.

• Es werden nur die Zeilen extrahiert, die den Abfragekriterien ent-sprechen.

Zunächst stellt SQL Server fest, ob ein Index vorhanden ist. Anschließend ermittelt der Abfrageoptimierer - die Komponente, die den optimalen Aus-führungsplan für die Abfrage generiert -, mit welcher Methode am effizien-testen auf die Daten zugegriffen werden kann: mit Hilfe eines Tabellenscans oder über den Index.

Page 301: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 6: Planen von Indizes 5

Gründe für die Indexerstellung

� Gründe für die Erstellung eines Indexes

� Beschleunigt die Datenabfrage

� Erzwingt die Eindeutigkeit der Zeilen

� Gründe gegen die Erstellung eines Indexes

� Belegt Festplattenspeicher

� Verursacht einen gewissen Verwaltungsaufwand

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Wenn Sie über die Erstellung eines Indexes nachdenken, sollten Sie zwei Fak-toren berücksichtigen, um sicherzustellen, dass der Index effizienter als ein Tabellenscan ist: die Art der Daten in der Tabelle und die Art der Abfragen für die Tabelle.

Gründe für die Erstellung eines Indexes Die Verwendung von Indizes beschleunigt die Datenabfrage. Wenn kein Index vorhanden ist, müssen Sie beispielsweise ein ganzes Textbuch Seite für Seite durchgehen, um die gesuchten Informationen zu finden.

SQL Server verwendet Indizes, um auf die Position einer Zeile in einer Daten-seite zu verweisen, sodass nicht alle Datenseiten einer Tabelle durchsucht wer-den müssen. Berücksichtigen Sie in Zusammenhang mit der Verwendung von Indizes die folgenden Aspekte und Richtlinien:

� Indizes beschleunigen im Allgemeinen die Ausführung von Abfragen, bei denen Tabellen verknüpft oder Sortier- bzw. Gruppierfunktionen ange-wendet werden.

� Sofern bei der Indexerstellung Eindeutigkeit definiert wurde, wird bei der Verwendung von Indizes die Eindeutigkeit der Zeilen vorausgesetzt.

� Indizes werden in aufsteigend sortierter Reihenfolge erstellt und verwaltet. � Indizes sollten vor allem für Spalten mit hoher Selektivität erstellt werden,

also für Spalten oder Kombinationen von Spalten, die überwiegend ein-deutige Daten enthalten.

ThemaErläutern Sie die Gründe, die für und gegen das Er-stellen von Indizes sprechen.

EinstiegDie Erstellung eines Indexes ist nicht zwingend erforder-lich. Erläutern Sie die Grün-de, die für die Erstellung eines Indexes sprechen.

Page 302: Programmieren Einer Microsoft SQL Server 2000-Datenbank

6 Unterrichtseinheit 6: Planen von Indizes

Gründe gegen die Erstellung eines Indexes Indizes sind nützlich, aber sie belegen Festplattenspeicher und verursachen Verwaltungsaufwand sowie entsprechende Kosten. Berücksichtigen Sie in Zusammenhang mit der Verwendung von Indizes die folgenden Aspekte und Richtlinien:

� Wenn Sie Daten in einer indizierten Spalte ändern, werden die zugehörigen Indizes von SQL Server aktualisiert.

� Die Verwaltung von Indizes erfordert Zeit und Ressourcen. Erstellen Sie deshalb nur dann einen Index, wenn Sie ihn regelmäßig verwenden werden.

� Bei Spalten, die sehr viele doppelte Daten enthalten, bieten Indizes nur wenige Vorteile.

Methodischer Hinweis Stellen Sie folgende Frage: Sind Indizes erfor-derlich?

Antwort: Nein. Auch ohne Index können Daten abge-fragt und geändert werden. Der Zugriff auf Daten dauert jedoch wesentlich länger.

Page 303: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 6: Planen von Indizes 7

���� Indexarchitektur

� Multimediapräsentation: SQL Server-Indexarchitektur

� Verwenden von Heaps

� Verwenden gruppierter Indizes

� Verwenden nicht gruppierter Indizes

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Gruppierte und nicht gruppierte Indizes weisen eine unterschiedliche Archi-tektur auf. Eine genaue Kenntnis dieser Unterschiede wird Ihnen bei der Erstellung des jeweils effektivsten Indextyps helfen.

ThemaGeben Sie eine Übersicht über die Architektur gruppierter und nicht gruppierter Indizes.

EinstiegIn diesem Abschnitt wird be-schrieben, wie SQL Server gruppierte und nicht grup-pierte Indizes verwendet.

Page 304: Programmieren Einer Microsoft SQL Server 2000-Datenbank

8 Unterrichtseinheit 6: Planen von Indizes

Multimediapräsentation: SQL Server-Indexarchitektur

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

In der Multimediapräsentation werden die folgenden Konzepte vorgestellt:

Gruppierte Indizes In einem gruppierten Index ist die Blattebene die aktuelle Datenseite. Daten werden in aufsteigender Reihenfolge physisch in einer Datenseite gespeichert. Die Reihenfolge der Werte innerhalb der Indexseiten ist ebenfalls aufsteigend.

Nicht gruppierte Indizes, die auf Basis eines Heaps erstellt wurden Wenn ein nicht gruppierter Index auf Basis eines Heaps erstellt wird, verwendet SQL Server Zeilen-IDs innerhalb der Indexseiten, die auf die Zeilen in den Datenseiten verweisen. Die Zeilen-IDs enthalten Informationen zum Speicher-ort der Daten.

Nicht gruppierte Indizes, die auf Basis eines gruppierten Indexes erstellt wurden Wenn ein nicht gruppierter Index auf Basis einer Tabelle mit einem gruppierten Index erstellt wird, verwendet SQL Server einen Gruppierungsschlüssel inner-halb der Indexseiten, die auf den gruppierten Index verweisen. Der Gruppie-rungsschlüssel enthält Informationen zum Speicherort der Daten.

ThemaGeben Sie eine Übersicht über die SQL Server-Index-architektur.

EinstiegIn einer Multimediapräsentation wird die SQL Server-Index-architektur vorgestellt.

Methodischer Hinweis Aktivieren Sie in Microsoft Windows Media Player im Menü Ansicht die Option Beschreibung, um die Untertitel der Präsentation anzuzeigen.

Page 305: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 6: Planen von Indizes 9

Verwenden von Heaps

SQL Server:

� Verwendet IAM-Seiten (Index Allocation Map), die:

� Informationen enthalten über den Speicherort der Blöcke eines Heaps

� Den Heap durchsuchen, um verfügbaren Speicherplatz für neu einzufügende Zeilen zu finden

� Datenseiten verbinden

� Gibt im Heap Speicherplatz für neue Zeilen frei, wenn eine Zeile gelöscht wird

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Sofern für eine Tabelle kein gruppierter Index definiert wurde, verwaltet SQL Server Datenseiten in einem Heap. Dabei geht SQL Server folgender-maßen vor:

� SQL Server verwaltet Heaps mit Hilfe von IAM-Seiten (Index Allocation Map). IAM-Seiten haben folgende Funktionen:

• Sie enthalten Informationen über den Speicherort der Blöcke eines Heaps. Die sysindexes-Systemtabelle enthält einen Zeiger auf die erste einem Heap zugeordnete IAM-Seite.

• Sie werden verwendet, um den Heap zu durchsuchen und verfügbaren Speicherplatz für neu einzufügende Zeilen zu finden.

• Sie verbinden die Datenseiten. Die Datenseiten und die in ihnen enthaltenen Zeilen sind nicht in einer bestimmten Reihenfolge angeordnet und nicht miteinander verbunden. Die in den IAM-Seiten gespeicherte Verbindung ist die einzige logische Verbindung zwischen den Datenseiten.

� SQL Server gibt im Heap Speicherplatz für neue Zeilen frei, wenn eine Zeile gelöscht wird.

ThemaErläutern Sie, wie SQL Server Heaps verwendet.

EinstiegSofern für eine Tabelle kein gruppierter Index definiert wurde, werden Datenseiten von SQL Server in einem Heap verwaltet.

Page 306: Programmieren Einer Microsoft SQL Server 2000-Datenbank

10 Unterrichtseinheit 6: Planen von Indizes

Verwenden gruppierter Indizes

� Für jede Tabelle kann es nur einen gruppierten Index geben

� Die physische Reihenfolge der Zeilen in der Tabelle ist mit der Reihenfolge der Zeilen im Index identisch

� Die Eindeutigkeit der Schlüsselwerte wird explizit oder implizit aufrechterhalten

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Gruppierte Indizes eignen sich für Spalten, die häufig nach Schlüsselwerte-bereichen durchsucht werden oder auf die in sortierter Reihenfolge zugegriffen wird. Berücksichtigen Sie bei der Erstellung eines gruppierten Indexes die folgenden Aspekte und Richtlinien:

� Für jede Tabelle kann es nur einen gruppierten Index geben. � Die physische Reihenfolge der Zeilen in der Tabelle ist mit der Reihenfolge

der Zeilen im Index identisch. Sie sollten gruppierte Indizes vor nicht grup-pierten Indizes erstellen, da ein gruppierter Index die physische Reihenfolge der Tabellenzeilen ändert. Die Zeilen werden in einer sequenziellen Reihen-folge sortiert und in dieser Reihenfolge verwaltet.

� Die Eindeutigkeit der Schlüsselwerte wird explizit, mit Hilfe des Schlüssel-wortes UNIQUE, oder implizit, über einen internen eindeutigen Bezeichner, aufrechterhalten. Diese eindeutigen Bezeichner sind intern in SQL Server festgelegt, und der Benutzer kann nicht darauf zugreifen.

� Die durchschnittliche Größe eines gruppierten Indexes beträgt etwa fünf Prozent der Tabellengröße. Die Größe gruppierter Indizes kann jedoch in Abhängigkeit von der Größe der indizierten Spalte variieren.

� Wenn eine Zeile gelöscht wird, wird der Speicherplatz freigegeben und steht für eine neue Zeile zur Verfügung.

� Während der Indexerstellung belegt SQL Server vorübergehend Speicher-platz der aktuellen Datenbank. Bei der Erstellung eines gruppierten Indexes wird ungefähr das 1,2-fache der Tabellengröße als Arbeitsbereich benötigt. Der bei der Indexerstellung benötigte Festplattenspeicher wird anschließend automatisch freigegeben.

Stellen Sie sicher, dass in der Datenbank genügend Fest-plattenspeicher zur Verfügung steht, wenn Sie gruppierte Indizes erstellen.

ThemaGeben Sie eine Übersicht über gruppierte Indizes.

EinstiegGruppierte Indizes eignen sich für Spalten, die häufig nach Schlüsselwerte-bereichen durchsucht werden oder auf die in sortierter Reihenfolge zugegriffen wird.

Methodischer Hinweis Fragen Sie die Kursteil-nehmer, nachdem Sie die im Bild aufgeführten Punkte besprochen haben, welche Auswirkungen das Hinzu-fügen von Zeilen in einer Tabelle auf einen gruppier-ten Index hat.

Stellen Sie folgende Frage: Warum können für eine Tabelle nicht zwei gruppierte Indizes verwendet werden?

Antwort: SQL Server kann pro Tabelle nur eine physi-sche Zeilenreihenfolge speichern.

Methodischer Hinweis Stellen Sie folgende Frage: Welche Bedeutung hat der Wert 1,2?

Antwort: 1 = Daten und2 = Index. Es handelt sich bei diesen Werten um Schätzwerte.

Anmerkung

Page 307: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 6: Planen von Indizes 11

Verwenden nicht gruppierter Indizes

� Nicht gruppierte Indizes werden in SQL Server standardmäßig verwendet

� Vorhandene nicht gruppierte Indizes werden in folgenden Situationen automatisch erstellt:

� Ein vorhandener gruppierter Index wird gelöscht

� Ein gruppierter Index wird erstellt

� Mit Hilfe der Option DROP_EXISTING werden die Spalten geändert, über die der gruppierte Index definiert wird

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Nicht gruppierte Indizes sind dann sinnvoll, wenn die Benutzer unterschiedliche Methoden zur Datensuche verwenden. In einem Buch über Gärtnerei suchen Leser zum Beispiel häufig sowohl nach den populären als auch den lateinischen Namen von Pflanzen. Sie könnten in diesem Fall einen nicht gruppierten Index für die Suche nach den lateinischen Namen und einen gruppierten Index für die Suche nach den populären Namen erstellen. Berücksichtigen Sie bei der Erstel-lung eines nicht gruppierten Indexes die folgenden Aspekte und Richtlinien:

� Wenn kein Indextyp angegeben wird, wird automatisch ein nicht gruppierter Index erstellt.

� In folgenden Situationen werden vorhandene nicht gruppierte Indizes von SQL Server automatisch neu erstellt:

• Ein vorhandener gruppierter Index wird gelöscht.

• Ein gruppierter Index wird erstellt.

• Mit Hilfe der Option DROP_EXISTING werden die Spalten geändert, über die der gruppierte Index definiert wird.

� Die Reihenfolge der Seiten auf Blattebene eines nicht gruppierten Indexes unterscheidet sich von der physischen Reihenfolge in der Tabelle. Die Blatt-ebene wird in aufsteigender Reihenfolge sortiert.

� Die Eindeutigkeit wird auf Blattebene mit Gruppierungsschlüsseln oder Zeilen-IDs aufrechterhalten.

� Pro Tabelle kann es bis zu 249 nicht gruppierte Indizes geben. � Nicht gruppierte Indizes eignen sich am besten für Spalten, in denen die

Datenselektivität sehr hoch bis eindeutig ist.� Erstellen Sie gruppierte Indizes vor nicht gruppierten Indizes. � Die Zeilen-IDs bestimmen die logische Reihenfolge der Zeilen und setzen

sich aus Datei-ID, Seitennummer und Zeilen-ID zusammen.

ThemaGeben Sie eine Übersicht über nicht gruppierte Indizes.

EinstiegGruppierte Indizes sind dann sinnvoll, wenn die Benutzer unterschiedliche Methoden zur Datensuche verwenden.

Page 308: Programmieren Einer Microsoft SQL Server 2000-Datenbank

12 Unterrichtseinheit 6: Planen von Indizes

���� Abrufen von gespeicherten Daten durch SQL Server

� Verwenden der „sysindexes“-Tabelle durch SQL Server

� Suchen nach Zeilen ohne Indizes

� Suchen von Zeilen in einem Heap mit einem nicht gruppierten Index

� Suchen von Zeilen in einem gruppierten Index

� Suchen von Zeilen in einem gruppierten Index mit einem nicht gruppierten Index

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Eine wichtige Voraussetzung für das Erstellen von effizienten Datenbanken ist die Kenntnis darüber, wie SQL Server gespeicherte Daten abruft. In diesem Abschnitt wird beschrieben, wie die SQL Server-Indexarchitektur das Abrufen von Daten erleichtert.

ThemaGeben Sie eine Übersicht über die Verfahren zum Abrufen von Daten.

EinstiegIn diesem Abschnitt wird beschrieben, wie die SQL Server-Indexarchitektur das Abrufen von Daten erleichtert.

Dieser Abschnitt enthält eine Wiederholung von Informationen aus früheren Kursen. Sie können ihn zügig durcharbeiten, wenn die Kursteilnehmer mit der SELECT-Anweisung bereits vertraut sind.

Page 309: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 6: Planen von Indizes 13

Verwenden der „sysindexes“-Tabelle durch SQL Server � Beschreibt die Indizes

� Speicherort für IAM, First und Root des Indizes

� Anzahl der Seiten und Zeilen

� Verteilung der Daten

indidindidindid Object TypeObject TypeObject Type

00 HeapHeap

11 Clustered IndexClustered Index

2 to 2502 to 250 Nonclustered IndexNonclustered Index

255255 text, ntext, or imagetext, ntext, or image

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Die sysindexes-Systemtabelle ist ein zentraler Speicherort für wichtige Informationen zu Tabellen und Indizes. Sie enthält statistische Informationen, z. B. die Anzahl der Zeilen und Datenseiten in den einzelnen Tabellen. In ihr ist außerdem beschrieben, wie die in einer Datentabelle gespeicherten Informationen gesucht werden.

Seitenzeiger in der sysindexes-Tabelle bilden das Stammverzeichnis für alle Seitenauflistungen für Tabellen und Indizes. Jede Tabelle verfügt über eine Auflistung von Datenseiten; diese wird ergänzt durch weitere Auflistungen von Seiten, mit denen die Indizes implementiert werden, die für die Tabelle definiert sind.

Eine Zeile in sysindexes für jede Tabelle und jeden Index wird durch die Kombination aus der Objekt-ID-Spalte (id) und der Index-ID-Spalte (indid)eindeutig identifiziert.

Die „indid“-Spalte Im Folgenden wird beschrieben, wie die Spalten der sysindexes-Tabelle die Suche nach Datenseiten für verschiedene Objekttypen unterstützen:

� Für einen Heap gibt es in sysindexes eine Zeile mit dem Wert 0 in der indid-Spalte. Die FirstIAM-Spalte in sysindexes zeigt auf die Kette der IAM-Seiten für die Auflistung der Datenseiten in der Tabelle. SQL Server muss die IAM-Seiten für die Suche nach den Seiten in der Datenseiten-auflistung verwenden, weil diese Seiten nicht miteinander verknüpft sind.

� Für einen gruppierten Index einer Tabelle gibt es in sysindexes eine Zeile mit dem Wert 1 in der indid-Spalte. Die root-Spalte in sysindexes zeigt auf den Anfang des B-Baumes des gespeicherten Indexes.

ThemaBeschreiben Sie die Funkt-ion der sysindexes-Tabelle bei einer Datensuche.

EinstiegDie sysindexes-System-tabelle stellt den ersten Schritt einer Datensuche dar.

Page 310: Programmieren Einer Microsoft SQL Server 2000-Datenbank

14 Unterrichtseinheit 6: Planen von Indizes

� Für jeden nicht gruppierten Index einer Tabelle gibt es in sysindexes eine Zeile mit einem Wert in der indid-Spalte. Der Wert für die indid-Spalte für einen nicht gruppierten Index liegt im Bereich von 2 bis 250. Die root-Spalte in sysindexes zeigt auf den Anfang des B-Baumes des nicht gruppierten Indexes.

� Für jede Tabelle, die mindestens eine text-, ntext- oder image-Spalte enthält, gibt es in sysindexes eine Zeile mit dem Wert 255 in der indid-Spalte. Die FirstIAM-Spalte in sysindexes zeigt auf die Kette von IAM-Seiten, die die text-, ntext- oder image-Seiten verwalten.

Methodischer Hinweis Die sysindexes-Tabelle enthält auch Informationen, die mit dem UPDATE STATISTICS-Befehl generiert werden.

Page 311: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 6: Planen von Indizes 15

Suchen nach Zeilen ohne Indizes

HeapExtent 127

idid indid = 0indid = 0 First IAMFirst IAMsysindexes

IAM

Extent 128 Extent 129

010102020303…………

SmithSmithOtaOtaJonesJones……......

………………............

0101020203030404……

AkhtarAkhtarFunkFunkSmithSmithMartinMartin......

………………............

010102020303…………

RuddRuddWhiteWhiteBarrBarr............

………………............

010102020303…………

ConConFunkFunkWhiteWhite............

………………............

010102020303…………

SmithSmithOtaOtaJonesJones……......

………………............

0101020203030404……

AkhtarAkhtarFunkFunkSmithSmithMartinMartin......

………………............

010102020303…………

RuddRuddWhiteWhiteBarrBarr............

………………............

01010202030304040505

ConConFunkFunkWhiteWhiteDurkinDurkinLangLang

………………............

010102020303…………

SmithSmithOtaOtaJonesJones……......

………………............

0101020203030404……

AkhtarAkhtarFunkFunkSmithSmithMartinMartin......

………………............

010102020303…………

RuddRuddWhiteWhiteBarrBarr............

………………............

010102020303…………

ConConFunkFunkWhiteWhite............

………………............

010102020303…………

SmithSmithOtaOtaJonesJones……......

………………............

0101020203030404……

AkhtarAkhtarFunkFunkSmithSmithMartinMartin......

………………............

010102020303…………

RuddRuddWhiteWhiteBarrBarr............

………………............

01010202030304040505

DunnDunnRandallRandallOtaOtaSlichterSlichterLaBrieLaBrie

………………............

010102020303…………

SmithSmithOtaOtaJonesJones……......

………………............

0101020203030404……

AkhtarAkhtarFunkFunkSmithSmithMartinMartin......

………………............

010102020303…………

RuddRuddWhiteWhiteBarrBarr............

………………............

010102020303…………

ConConFunkFunkWhiteWhite............

………………............

010102020303…………

SmithSmithOtaOtaJonesJones……......

………………............

0101020203030404……

AkhtarAkhtarFunkFunkSmithSmithMartinMartin......

………………............

010102020303…………

RuddRuddWhiteWhiteBarrBarr............

………………............

010102020303…………

SmithSmithOtaOtaJonesJones……......

………………............

0101020203030404……

AkhtarAkhtarFunkFunkSmithSmithMartinMartin......

………………............

010102020303…………

RuddRuddWhiteWhiteBarrBarr............

………………............

010102020303…………

ConConFunkFunkWhiteWhite............

………………............

010102020303…………

SmithSmithOtaOtaJonesJones……......

………………............

0101020203030404……

AkhtarAkhtarFunkFunkSmithSmithMartinMartin......

………………............

010102020303…………

RuddRuddWhiteWhiteBarrBarr............

………………............

010102020303…………

GraffGraffBaconBaconKochKoch............

………………............

Extent 1300101020203030404……

SeattleSeattleParisParisTokyoTokyoAtlantaAtlanta......

………………............

……127 1127 1128 1128 1129 0129 0130 1130 1……

Extent Bit Map

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Wenn es in einer Tabelle keinen Index gibt, muss SQL Server einen Tabellen-scan zum Abrufen von Zeilen verwenden. SQL Server verwendet die sysindexes-Tabelle für die Suche nach der IAM-Seite. Da die IAM-Seite eine Liste aller Seiten, die zu dieser Tabelle gehören, in Form einer Bitmap mit 8-seitigen Blöcken enthält, kann SQL Server dann alle Datenseiten lesen.

Das Starten einer Datensuche in einem Heap mit Hilfe einer IAM-Seite ist eine effiziente Methode für einen Tabellenscan, eignet sich jedoch besonders gut, um nach einer geringen Anzahl von Zeilen in einer großen Tabelle zu suchen.

Die Zeilen werden unsortiert zurückgegeben. Zunächst werden Sie möglicher-weise in der Eingabereihenfolge zurückgegeben, diese Reihenfolge wird jedoch nicht beibehalten. Nach Löschvorgängen werden die Lücken durch neue Ein-gaben aufgefüllt, wodurch die Reihenfolge unberechenbar wird.

ThemaBeschreiben Sie die Daten-suche in einem Heap.

EinstiegWenn eine Tabelle weder über einen gespeicherten Index noch über brauchbare nicht gespeicherte Indizes verfügt, verwendet SQL Server die IAM-Seite zum Starten eines Tabellen-scans.

Methodischer Hinweis Diese Folie enthält Animationen. Im Abschnitt „Hinweise für den Kursleiter“ finden Sie Informationen zum Navigieren durch diese Folie.

Weisen Sie darauf hin, dass die IAM-Seite sich häufig im Arbeitsspeicher befindet und effiziente, dicht gepackte Informationen enthält.

Betonen Sie, dass bei einem fehlenden Index nur über einen Tabellenscan Zeilen abgerufen werden können.

Page 312: Programmieren Einer Microsoft SQL Server 2000-Datenbank

16 Unterrichtseinheit 6: Planen von Indizes

Suchen von Zeilen in einem Heap mit einem nicht gruppierten Index

Nicht-Blattebene

Seite 12 - RootSeite 37 Seite 28

Blattebene(Schlüssel-

wert)

Seite 41 Seite 51 Seite 61 Seite 71

AkhtarAkhtar......MartinMartin

AkhtarAkhtarBarrBarrConConFunkFunkFunkFunk

4:706:014:706:014:705:034:705:034:704:014:704:014:706:024:706:024:704:024:704:02

MartinMartinSmithSmith......

SmithSmithSmithSmithSmithSmithWhiteWhiteWhiteWhite

4:706:034:706:034:708:044:708:044:707:014:707:014:704:034:704:034:705:024:705:02

AkhtarAkhtarGanioGanio......

GanioGanioHallHall

JonesJonesJonesJonesJonesJones

4:709:014:709:014:709:044:709:044:709:024:709:024:708:034:708:034:707:034:707:03

HeapSeite 707 Seite 808 Seite 709

0101020203030404......

......

......

......

......

......

AkhtarAkhtarFunkFunkSmithSmithMateyMatey......

Seite 704 Seite 705 Seite 706010102020303............

......

......

......

......

......

ConnConnFunkFunkWhiteWhite............

010102020303............

......

......

......

......

......

RuddRuddWhiteWhiteBarrBarr

......

......

010102020303............

......

......

......

......

......

SmithSmithOtaOta

JonesJones............

0101020203030404......

......

......

......

......

......

MartinMartinPhuaPhuaJonesJonesSmithSmith......

010102020303............

......

......

......

......

......

GanioGanioJonesJonesHallHall

......

......

MartinMartinMateyMateyOtaOta

PhuaPhuaRuddRudd

4:708:014:708:014:706:044:706:044:707:024:707:024:708:024:708:024:705:014:705:01

Nichtgruppierter

Index

File ID #4

idid indid = 2indid = 2 rootrootsysindexes

SELECT lastname, firstnameFROM memberWHERE lastnameBETWEEN 'Masters' AND 'Rudd'

SELECT lastname, firstnameFROM memberWHERE lastnameBETWEEN 'Masters' AND 'Rudd'

Nicht-Blattebene

Seite 12 - RootSeite 37 Seite 28

Blattebene(Schlüssel-

wert)

Seite 41 Seite 51 Seite 61 Seite 71

AkhtarAkhtar......MartinMartin

AkhtarAkhtarBarrBarrConConFunkFunkFunkFunk

4:706:014:706:014:705:034:705:034:704:014:704:014:706:024:706:024:704:024:704:02

MartinMartinSmithSmith......

SmithSmithSmithSmithSmithSmithWhiteWhiteWhiteWhite

4:706:034:706:034:708:044:708:044:707:014:707:014:704:034:704:034:705:024:705:02

AkhtarAkhtarGanioGanio......

GanioGanioHallHall

JonesJonesJonesJonesJonesJones

4:709:014:709:014:709:044:709:044:709:024:709:024:708:034:708:034:707:034:707:03

HeapSeite 707 Seite 808 Seite 709

0101020203030404......

......

......

......

......

......

AkhtarAkhtarFunkFunkSmithSmithMateyMatey......

Seite 704 Seite 705 Seite 706010102020303............

......

......

......

......

......

ConnConnFunkFunkWhiteWhite............

010102020303............

......

......

......

......

......

RuddRuddWhiteWhiteBarrBarr

......

......

010102020303............

......

......

......

......

......

SmithSmithOtaOta

JonesJones............

0101020203030404......

......

......

......

......

......

MartinMartinPhuaPhuaJonesJonesSmithSmith......

010102020303............

......

......

......

......

......

GanioGanioJonesJonesHallHall

......

......

MartinMartinMateyMateyOtaOta

PhuaPhuaRuddRudd

4:708:014:708:014:706:044:706:044:707:024:707:024:708:024:708:024:705:014:705:01

Nichtgruppierter

Index

File ID #4

MartinMartin

MartinMartin

0404 ...... MateyMatey

MateyMatey 4:706:044:706:04

0202 ...... PhuaPhua

PhuaPhua 4:708:024:708:02

0101 ...... RuddRudd

RuddRudd 4:705:014:705:01

0202 ...... OtaOta

OtaOta 4:707:024:707:02

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Ein nicht gruppierter Index ist mit dem Index eines Textbuches vergleichbar. Die Daten und der Index sind an verschiedenen Orten gespeichert. Zeiger verweisen auf den Speicherort der indizierten Elemente in der zugrunde liegenden Tabelle.

SQL Server-Indizes sind als B-Bäume organisiert. Jede Seite in einem Index enthält einen Seitenheader, gefolgt von den Indexzeilen. Jede Indexzeile enthält einen Schlüsselwert und einen Zeiger auf eine andere Seite oder eine Daten-zeile.

Jede Seite in einem Index wird als Indexknoten bezeichnet. Der oberste Knoten des B-Baumes wird als Stammknoten oder Stammebene bezeichnet. Der unterste Knoten wird als Blattknoten oder Blattebene bezeichnet. Alle Index-ebenen zwischen dem Stamm- und den Blattknoten sind so genannte Zwischen-ebenen. Auf jeder Seite in den Zwischen- und untersten Schichten befindet sich ein Zeiger auf die vorhergehenden und die folgenden Seiten in einer doppelt verknüpften Liste.

In einer Tabelle, die nur über einen nicht gruppierten Index verfügt, enthalten die Blattknoten Zeilenlokatoren mit Zeigern auf die Datenzeilen mit den Schlüsselwerten. Jeder Zeiger (Zeilen-ID oder RID) besteht aus der Datei-ID, der Seitennummer und der Nummer der Zeile in der Seite.

SELECT lastname, firstname FROM member WHERE lastname BETWEEN 'Masters' AND 'Rudd'

ThemaBeschreiben Sie die Daten-suche mit einem nicht gruppierten Index.

EinstiegZeiger spielen bei der Suche mit nicht gruppierten Indizes eine wichtige Rolle.

Methodischer Hinweis Diese Folie enthält Animationen. Im Abschnitt „Hinweise für den Kursleiter“ finden Sie Informationen zum Navigieren durch diese Folie.

Kursteilnehmer sollten mit der B-Baum-Struktur ver-traut sein. Betonen Sie die Verwendung und Struktur der Zeiger.

Beispiel

Page 313: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 6: Planen von Indizes 17

Suchen von Zeilen in einem gruppierten Index

gruppierter Index

Seite 140 - Root

Seite 100 Seite 120 Seite 130

Seite 141 Seite 145

AkhtarAkhtarBarrBarrConConFunkFunkFunkFunk......

2334233456785678253425341334133415341534......

......

......

......

......

......

......

MartinMartinMartinMartinOtaOtaPhuaPhuaRuddRudd......

1234123477787778587858787878787860786078......

......

......

......

......

......

......

SmithSmithSmithSmithSmithSmithWhiteWhiteWhiteWhite......

1434143457785778797879782234223416341634......

......

......

......

......

......

......

AkhtarAkhtarGanioGanio

………

AkhtarAkhtar……

MartinMartin

MartinMartinSmithSmith

……

Seite 110

GanioGanioHallHallJonesJonesJonesJonesJonesJones......

7678767880788078243424345978597826342634......

......

......

......

......

......

......

SELECT lastname, firstnameFROM memberWHERE lastname = 'Ota'

SELECT lastname, firstnameFROM memberWHERE lastname = 'Ota'

Gruppierter Index

Seite 140 - Root

Seite 100 Seite 120 Seite 130

Seite 141 Seite 145

AkhtarAkhtarBarrBarrConConFunkFunkFunkFunk......

2334233456785678253425341334133415341534......

......

......

......

......

......

......

MartinMartinMartinMartinOtaOtaPhuaPhuaRuddRudd......

1234123477787778587858787878787860786078......

......

......

......

......

......

......

SmithSmithSmithSmithSmithSmithWhiteWhiteWhiteWhite......

1434143457785778797879782234223416341634......

......

......

......

......

......

......

AkhtarAkhtarGanioGanio

………

AkhtarAkhtar……

MartinMartin

MartinMartinSmithSmith

……

Seite 110

GanioGanioHallHallJonesJonesJonesJonesJonesJones......

7678767880788078243424345978597826342634......

......

......

......

......

......

......

MartinMartinMartin

OtaOtaOta 587858785878 .........

MartinMartinMartin

idid indid = 1indid = 1 rootrootsysindexes

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Gruppierte und nicht gruppierte Indizes verwenden eine vergleichbare B-Baum-Struktur. Es gibt jedoch folgende Unterschiede:

� Die Datenseiten eines gruppierten Indexes sind die Blattknoten der B-Baum-Struktur.

� Die Datenzeilen eines gruppierten Indexes werden in einer sequenziellen Reihenfolge nach ihrem gruppierten Schlüssel sortiert und gespeichert.

Ein gruppierter Index ist mit einem Telefonverzeichnis vergleichbar, in dem alle Zeilen von Kunden mit demselben Nachnamen an einer Stelle des Ver-zeichnisses zu einer Gruppe zusammengefasst sind. So wie die Organisation eines Telefonverzeichnisses jemandem die Suche erleichtert, genauso kann SQL Server eine Tabelle mit einem gruppierten Index schneller durchsuchen. Da ein gruppierter Index die Reihenfolge bestimmt, in der Zeilen in einer Tabelle gespeichert werden, kann es für eine Tabelle immer nur einen gruppierten Index geben.

Je kürzer der Schlüsselwert eines gruppierten Indexes, desto mehr Indexzeilen passen in eine Indexseite und desto weniger Ebenen müssen durchsucht wer-den. Dadurch wird die Anzahl der E/A-Vorgänge auf ein Minimum reduziert.

Enthält ein gruppierter Index doppelte Werte, muss SQL Server zwischen den Zeilen mit identischen Werten in der Schlüsselspalte bzw. den Schlüsselspalten unterscheiden können. Dies geschieht mit Hilfe einer 4 Byte langen Ganzzahl (uniqueidentifier-Wert) in einer zusätzlichen systeminternen uniqueidentifier-Spalte.

SELECT lastname, firstname FROM member WHERE lastname = 'Ota'

ThemaBeschreiben Sie die Daten-suche mit einem gruppierten Index.

EinstiegGruppierte Indizes sind in sequenzieller Reihenfolge nach ihren gruppierten Schlüsseln sortiert.

Methodischer Hinweis Diese Folie enthält Animationen. Im Abschnitt „Hinweise für den Kursleiter“ finden Sie Informationen zum Navigieren durch diese Folie.

Anmerkung

Beispiel

Page 314: Programmieren Einer Microsoft SQL Server 2000-Datenbank

18 Unterrichtseinheit 6: Planen von Indizes

Suchen von Zeilen in einem gruppierten Index mit einem nicht gruppierten Index

GruppierterIndex auf demNachnamen

Nicht grup-pierter Indexauf demVornamen

NichtBlattebene

Blattebene(gruppierterSchlüssel-

wert)

AaronAaronDeannaDeanna……

AaronAaron......JoseJose

JoseJoseNinaNina……

DeannaDeannaDonDonDougDoug

DaumDaumHallHallHamptonHampton

…… ……

AaronAaronAdamAdamAmieAmie

ConConBarrBarrBaldwinBaldwin

…… ……

JoseJoseJudyJudyMikeMike

LugoLugoKaethlerKaethlerNashNash

…… ……

BarrBarr AdamAdamCoxCoxDaumDaum

ArletteArletteDeannaDeanna

…… ……

……………………

KimKimKobaraKobaraLaBrieLaBrie

ShaneShaneLindaLindaRyanRyan

…… ……

……………………

NagataNagataNashNashNixonNixon

SusanneSusanneMikeMikeTobyToby

…… ……

……………………

BarrBarrKimKimNagataNagataO’MeliaO’Melia

idid indid = 2indid = 2 rootrootsysindexes

SELECT lastname, firstname, phoneFROM memberWHERE firstname = 'Mike'

SELECT lastname, firstname, phoneFROM memberWHERE firstname = 'Mike'

GruppierterIndex auf demNachnamen

Nicht grup-pierter Indexauf demVornamen

NichtBlattebene

Blattebene(gruppierterSchlüssel-

wert)

AaronAaronDeannaDeanna……

AaronAaron......JoseJose

JoseJoseNinaNina……

DeannaDeannaDonDonDougDoug

DaumDaumHallHallHamptonHampton

…… ……

AaronAaronAdamAdamAmieAmie

ConConBarrBarrBaldwinBaldwin

…… ……

JoseJoseJudyJudyMikeMike

LugoLugoKaethlerKaethlerNashNash

…… ……

BarrBarr AdamAdamCoxCoxDaumDaum

ArletteArletteDeannaDeanna

…… ……

……………………

KimKimKobaraKobaraLaBrieLaBrie

ShaneShaneLindaLindaRyanRyan

…… ……

……………………

NagataNagataNashNashNixonNixon

SusanneSusanneMikeMikeTobyToby

…… ……

……………………

BarrBarrKimKimNagataNagataO’MeliaO’Melia

MikeMikeMike NashNashNash

NagataNagataNagata

NashNashNash MikeMikeMike ………

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Wenn einer Tabelle mit einem gruppierten Index ein nicht gruppierter Index hinzugefügt wird, enthält der Zeilenlokator jedes nicht gruppierten Indexes den Schlüsselwert des gruppierten Indexes für die Zeile.

Wird für dieselbe Tabelle sowohl ein gruppierter als auch ein nicht gruppierter Index verwendet, müssen die B-Baum-Strukturen beider Indizes bei der Daten-suche durchsucht werden. Dadurch werden zusätzliche E/A-Vorgänge generiert.

Da der Schlüsselwert eines gruppierten Indexes normalerweise länger als die 8 Byte umfassende Zeilen-ID für Heaps ist, können nicht gruppierte Indizes für Tabellen mit einem gruppiertem Index erheblich länger sein als nicht gruppierte Indizes für Heaps. Wenn Sie kleine Schlüsselwerte für den gruppierten Index verwenden, können Sie kleinere und schnellere Indizes erstellen.

SELECT lastname, firstname, phone_no FROM member WHERE firstname = 'Mike'

ThemaBeschreiben Sie die Daten-suche, wenn beide Index-typen vorhanden sind.

EinstiegDer sekundäre Index wird dazu verwendet, die Suche in zusätzlichen Spalten zu beschleunigen.

Methodischer Hinweis Diese Folie enthält Animationen. Im Abschnitt „Hinweise für den Kursleiter“ finden Sie Informationen zum Navigieren durch diese Folie.

Beispiel

Page 315: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 6: Planen von Indizes 19

���� Verwaltung von Index- und Heapstrukturen durch SQL Server

� Seitenteilungen in einem Index

� Vorwärtszeiger in einem Heap

� Zeilenaktualisierung durch SQL Server

� Löschen von Zeilen durch SQL Server

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

In diesem Abschnitt wird erläutert, wie SQL Server Indizes und Heaps verwaltet, wenn Zeilen eingefügt, aktualisiert und gelöscht werden.

ThemaGeben Sie eine Übersicht über die Verwaltung von Index- und Heapstrukturen durch SQL Server.

EinstiegIn diesem Abschnitt wird be-schrieben, wie SQL Server Indizes und Heaps verwaltet.

Page 316: Programmieren Einer Microsoft SQL Server 2000-Datenbank

20 Unterrichtseinheit 6: Planen von Indizes

Seitenteilungen in einem Index

Indexseiten

NichtBlattebene

INSERT member (last name)VALUES lastname = ‘Jackson'

INSERT member (last name)VALUES lastname = ‘Jackson'

LangLangSmithSmith

……

AkhtarAkhtarGanioGanio

……

AkhtarAkhtar……

MartinMartin

Jackson

Blattebene(Schlüssel-

wert)AkhtarAkhtarBarrBarrBarrBarrBormBormBuhlBuhl

…………………………

LangLangMartinMartinMartinMartinMartinMartinMorisMoris

…………………………

SmithSmithSmithSmithSmithSmithSmithSmithSmithSmith

…………………………

… ……GanioGanioHallHallHartHart

JonesJonesJonesJones

…………………………

Blattebene(Schlüssel-

wert)AkhtarAkhtarBarrBarrBarrBarrBormBormBuhlBuhl

…………………………

JacksonJacksonJonesJonesJonesJones

………………

LangLangMartinMartinMartinMartinMartinMartinMorisMoris

…………………………

SmithSmithSmithSmithSmithSmithSmithSmithSmithSmith

…………………………

… ……GanioGanioHallHallHartHart

……………… …

Jackson …

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Ein gruppierter Index leitet eine eingefügte oder aktualisierte Zeile an eine be-stimmte Seite weiter, die durch den gruppierten Schlüsselwert festgelegt wird. Wenn in der Datenseite oder der Indexseite nicht mehr genügend Platz zur Auf-nahme der Daten ist, wird in einem Vorgang, der als Seitenteilung bezeichnet wird, eine neue Seite hinzugefügt. Ungefähr die Hälfte der Daten verbleibt auf der alten Seite, und die andere Hälfte wird auf die neue Seite verschoben.

Logisch folgt die neue Seite auf die ursprüngliche Seite, physisch kann die neue Seite jedoch jeder vorhandenen Seite zugewiesen werden. Sind in einem Index sehr viele Seitenteilungen durchgeführt worden, kann die Leistung durch ein Neuerstellen des Indexes verbessert werden.

Wenn in einem gruppierten Index eine Seite geteilt wird, muss SQL Server die nicht gruppierten Indizes für alle Zeilen, die auf die neue Seite verschoben wurden, nicht verwalten. Der Zeilenlokator identifiziert weiter den richtigen Speicherort im gruppierten Schlüssel.

ThemaBeschreiben Sie das Kon-zept der Seitenteilung.

EinstiegDas Einfügen einer Zeile in eine volle Seite kann eine Seitenteilung verursachen.

Methodischer Hinweis Diese Folie enthält Animationen. Im Abschnitt „Hinweise für den Kursleiter“ finden Sie Informationen zum Navigieren durch diese Folie.

Methodischer Hinweis Weisen Sie darauf hin, dass der nicht gruppierte Index geändert werden muss, um Jackson hinzuzufügen, er aber nicht mit dem neuen Speicherort von Jonesaktualisiert werden muss.

Anmerkung

Page 317: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 6: Planen von Indizes 21

Vorwärtszeiger in einem Heap

NichtBlattebene

Seite 12 - RootSeite 37 Seite 28

Blattebene(Schlüssel-

wert)

Seite 41 Seite 51 Seite 61 Seite 71

AkhtarAkhtar......MartinMartin

AkhtarAkhtarBarrBarrConConFunkFunkFunkFunk

4:706:014:706:014:705:034:705:034:704:014:704:014:706:024:706:024:704:024:704:02

MartinMartinSmithSmith......

SmithSmithSmithSmithSmithSmithWhiteWhiteWhiteWhite

4:706:034:706:034:708:044:708:044:707:014:707:014:704:034:704:034:705:024:705:02

AkhtarAkhtarGanioGanio......

GanioGanioHallHall

JonesJonesJonesJonesJonesJones

4:709:014:709:014:709:044:709:044:709:024:709:024:708:034:708:034:707:034:707:03

HeapSeite 707 Seite 808 Seite 709

0101020203030404......

......

......

......

......

......

AkhtarAkhtarFunkFunkSmithSmithMartinMartin......

Seite 704 Seite 705 Seite 706010102020303............

......

......

......

......

......

ConnConnFunkFunkWhiteWhite............

010102020303............

......

......

......

......

......

RuddRuddWhiteWhiteBarrBarr

......

......

01010202030304040505

......

......

......

......

......

SmithSmithOtaOta

JonesJonesCoretsCoretsNashNash

0101020203030404......

......

......

......

......

......

MartinMartinPhuaPhuaJonesJonesSmithSmith......

010102020303............

......

......

......

......

......

GanioGanioJonesJonesHallHall

......

......

MartinMartinMartinMartin

OtaOtaPhuaPhuaRuddRudd

4:708:014:708:014:706:044:706:044:707:024:707:024:708:024:708:024:705:014:705:01

Nichtgruppierter

Index

File ID #4

idid indid = 2indid = 2 rootrootsysindexes

UPDATE memberSET Address = <something long>WHERE lastname = 'Ota'

UPDATE memberSET Address = <something long>WHERE lastname = 'Ota'

NichtBlattebene

Seite 12 - RootSeite 37 Seite 28

Blattebene(Schlüssel-

wert)

Seite 41 Seite 51 Seite 61 Seite 71

AkhtarAkhtar......MartinMartin

AkhtarAkhtarBarrBarrConConFunkFunkFunkFunk

4:706:014:706:014:705:034:705:034:704:014:704:014:706:024:706:024:704:024:704:02

MartinMartinSmithSmith......

SmithSmithSmithSmithSmithSmithWhiteWhiteWhiteWhite

4:706:034:706:034:708:044:708:044:707:014:707:014:704:034:704:034:705:024:705:02

AkhtarAkhtarGanioGanio......

GanioGanioHallHall

JonesJonesJonesJonesJonesJones

4:709:014:709:014:709:044:709:044:709:024:709:024:708:034:708:034:707:034:707:03

HeapSeite 707 Seite 808 Seite 709

0101020203030404......

......

......

......

......

......

AkhtarAkhtarFunkFunkSmithSmithMartinMartin......

Seite 704 Seite 705 Seite 706010102020303............

......

......

......

......

......

ConnConnFunkFunkWhiteWhite............

010102020303............

......

......

......

......

......

RuddRuddWhiteWhiteBarrBarr

......

......

01010202030304040505

......

......

......

......

......

SmithSmithOtaOta

JonesJonesCoretsCoretsNashNash

0101020203030404......

......

......

......

......

......

MartinMartinPhuaPhuaJonesJonesSmithSmith......

010102020303............

......

......

......

......

......

GanioGanioJonesJonesHallHall

......

......

MartinMartinMartinMartin

OtaOtaPhuaPhuaRuddRudd

4:708:014:708:014:706:044:706:044:707:024:707:024:708:024:708:024:705:014:705:01

Nichtgruppierter

Index

File ID #4

0202 ...... OtaOta0202 ...... OtaOta

MartinMartin

MartinMartin

OtaOta 4:707:024:707:02

0202 OtaOta

0404 ...... OtaOta

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

In einem Heap gibt es keine Seitenteilungen. SQL Server verwendet eine andere Methode zur Behandlung von Aktualisierungen und Einfügungen, wenn Datenseiten voll sind.

Einfügung in einen Heap Das Einfügen einer neuen Zeile in einen Heap kann keine Seitenteilung verur-sachen, weil eine neue Zeile überall eingefügt werden kann, wo genügend Platz ist.

VorwärtszeigerWenn für die Aktualisierung einer Zeile in einem Heap mehr Platz benötigt wird, als auf der betreffenden Seite verfügbar ist, wird die Zeile auf eine neue Datenseite verschoben. Am ursprünglichen Speicherort der Zeile bleibt ein Vorwärtszeiger stehen. Muss die Zeile mit dem Vorwärtszeiger erneut ver-schoben werden, wird der ursprüngliche Zeiger geändert, sodass er auf den neuen Speicherort verweist.

Durch den Vorwärtszeiger wird vermieden, dass nicht gruppierte Indizes ge-ändert werden müssen. Wenn die verschobene Zeile aufgrund einer erneuten Aktualisierung so verkleinert wird, dass sie wieder an ihren ursprünglichen Platz passt, wird bei der Aktualisierung der Zeiger gelöscht und der Datensatz wieder an seinem ursprünglichen Ort gespeichert.

Seitenteilungen in nicht gruppierten Indizes eines Heaps Ein Einfügen oder Aktualisieren kann zwar in einem Heap keine Seitenteilung verursachen, wenn es in dem Heap jedoch einen nicht gruppierten Index gibt, kann es dort durch das Einfügen oder Aktualisieren zu einer Seitenteilung kommen.

ThemaBeschreiben Sie das Kon-zept des Vorwärtszeigers.

EinstiegWenn eine Zeile in einem Heap zu groß für ihren ur-sprünglichen Speicherort wird, wird sie auf eine andere Seite verschoben.

Methodischer Hinweis Diese Folie enthält Animationen. Im Abschnitt „Hinweise für den Kursleiter“ finden Sie Informationen zum Navigieren durch diese Folie.

Page 318: Programmieren Einer Microsoft SQL Server 2000-Datenbank

22 Unterrichtseinheit 6: Planen von Indizes

Zeilenaktualisierung durch SQL Server

� Aktualisierungen verursachen normalerweise keine Zeilenverschiebung

� Eine Aktualisierung kann ein Löschen mit anschließendem Einfügen sein

� Batchaktualisierungen betreffen jeden Index nur einmal

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Viele Aktualisierungen haben keine Auswirkung auf die Struktur von Daten-zeilen.

Aktualisierungen verursachen normalerweise keine ZeilenverschiebungAktualisierungen haben normalerweise nicht zur Folge, dass Zeilen verschoben werden müssen. Wenn der Datensatz durch die Aktualisierung nicht vergrößert wird oder bei einer Vergrößerung auf derselben Seite noch genügend Platz für den Datensatz ist, ist keine Zeilenverschiebung erforderlich. Aktualisierungen generieren im Allgemeinen nur einen Protokolldatensatz.

Eine Aktualisierung kann ein Löschen mit anschließendem Einfügen sein Eine Aktualisierung, die eine Zeilenverschiebung verursacht, wird in folgenden Fällen wie ein Löschvorgang mit einem anschließenden Einfügen protokolliert:

� Die Aktualisierung passt nicht auf eine Seite eines Heaps. � Die Tabelle verfügt über einen Aktualisierungstrigger. � Die Tabelle ist für eine Replikation markiert. � Der Wert des Schlüssels des gruppierten Indexes erfordert, dass die Zeile an

einen anderen Speicherort verschoben wird. Wird ein Nachname zum Beispiel von Abercrombie in Yukish geändert, wird der Name in einem Telefonverzeichnis verschoben.

Batchaktualisierungen betreffen jeden Index nur einmal Wenn mit einer einzigen SQL-Anweisung sehr viele Zeilen eingefügt, aktua-lisiert oder gelöscht werden, werden die Änderungen von SQL Server für jeden Index vorsortiert, sodass die Änderungen in der Reihenfolge des Indexes aus-geführt werden. Diese Batchaktualisierung wird wesentlich schneller ausgeführt als eine Reihe von Transact-SQL-Anweisungen für denselben Vorgang.

ThemaBeschreiben Sie die Aus-wirkungen einer Daten-aktualisierung.

EinstiegViele Aktualisierungen haben keine Auswirkung auf die Struktur von Daten-zeilen.

Page 319: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 6: Planen von Indizes 23

Löschen von Zeilen durch SQL Server

Heapdatensätze werden einzeln verschoben

Gruppierte Indexseiten werden als eine Einheit verschoben

� Löschvorgänge erstellen Scheindatensätze

� Freigabe von Speicherbereich durch SQL Server

� Verkleinern von Dateien

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Das Löschen von Zeilen wirkt sich sowohl auf die Index- als auch auf die Datenseiten aus.

Löschvorgänge erstellen Scheindatensätze Zeilen, die aus der Blattebene eines Indexes gelöscht werden, werden nicht so-fort entfernt. Sie werden als ungültige Datensätze, so genannte Scheindaten-sätze markiert. Dieser Vorgang kann verhindern, dass benachbarte Datensätze gesperrt werden müssen. Er kann außerdem Sperrkonflikte für ganze Daten-bereiche verhindern. SQL Server startet regelmäßig einen speziellen Bereini-gungsthread, der die Indizes nach vorhandenen Scheindatensätzen durchsucht und sie entfernt.

Freigabe von Speicherbereich durch SQL Server Wenn die letzte Zeile einer Datenseite gelöscht wird, wird die Speicherreservie-rung für die gesamte Seite aufgehoben, es sei denn, es handelt sich um die letzte Seite in der Tabelle.

Löschen von Zeilen in einem Index Nach dem Löschen einer Zeile kann der Speicherbereich in einem Index sofort von benachbarten Zeilen belegt werden, einige Lücken bleiben jedoch solange bestehen, bis der Index das nächste Mal neu erstellt wird.

Löschen von Zeilen in einem Heap Gelöschte Zeilen in einem Heap werden erst komprimiert, wenn der Speicher-bereich für eine Einfügung benötigt wird.

ThemaBeschreiben Sie das Löschen von Zeilen.

EinstiegBeim Löschen einer Zeile werden sowohl die Index- als auch die Datenseiten geändert.

Page 320: Programmieren Einer Microsoft SQL Server 2000-Datenbank

24 Unterrichtseinheit 6: Planen von Indizes

Verkleinern von Dateien Nachdem Datensätze gelöscht wurden, kann eine Datei verkleinert werden. SQL Server verkleinert eine Datei, indem es Daten auf freie Seiten am Anfang der Datei verschiebt. Innerhalb eines Indexes verschiebt SQL Server ganze Seiten, sodass die Zeilen ihre korrekte sortierte Beziehung behalten. Seiten-zeiger werden angepasst, damit die Verknüpfung für die verschobene Seite in der richtigen Reihenfolge in der Tabelle steht. Wenn es keinen gruppierten Index gibt, können einzelne Zeilen an jede beliebige freie Stelle in der Datei verschoben werden.

Die Datenbankoption Automatisch verkleinern bietet die Mög-lichkeit, die Datenbank zu verkleinern, ohne dass ein manueller Eingriff erfor-derlich ist. Dies erfolgt fünf Minuten nach ihrem Start und anschließend alle dreißig Minuten. Die Datei wird auf eine Größe verkleinert, bei der 25 Prozent der Datei aus nicht verwendetem Speicherplatz bestehen, oder auf die Größe, mit der die Datei erstellt wurde, je nachdem, welcher Wert größer ist.

Methodischer Hinweis Weisen Sie darauf hin, dass Zeilen in einem Heap sofort verschoben werden. Sie behalten nicht die Reihen-folge, in der sie eingefügt wurden.

Anmerkung

Page 321: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 6: Planen von Indizes 25

���� Entscheiden, welche Spalten indiziert werden

� Verstehen der Daten

� Richtlinien für die Indizierung

� Auswählen des geeigneten gruppierten Indexes

� Unterstützen von Abfragen durch Indizierung

� Bestimmen der Selektivität

� Bestimmen der Datendichte

� Bestimmen der Datenverteilung

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Die Planung zweckmäßiger Indizes ist einer der wichtigsten Aspekte beim Optimieren der Abfrageleistung. Dazu wird eine genaue Kenntnis der Indexstruktur und der Art und Weise der Datenverwendung vorausgesetzt.

ThemaGeben Sie eine Übersicht über die Themen dieses Abschnitts.

EinstiegDie Planung zweckmäßiger Indizes ist einer der wichtigsten Aspekte beim Optimieren der Abfrage-leistung.

Page 322: Programmieren Einer Microsoft SQL Server 2000-Datenbank

26 Unterrichtseinheit 6: Planen von Indizes

Verstehen der Daten

� Der logische und physische Entwurf

� Die Dateneigenschaften

� Die Art der Verwendung der Daten

� Die verschiedenen Arten der ausgeführten Abfragen

� Die Häufigkeit von typischen Abfragen

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Bevor Sie einen Index erstellen, sollten Sie sich zunächst ein genaues Wissen über die Daten aneignen; dazu gehören folgende Informationen:

� Der logische und physische Entwurf. � Die Dateneigenschaften. � Die Art der Verwendung der Daten.

Um zweckmäßige und effektive Indizes zu entwerfen, müssen Sie die von Benutzern geschickten Abfragen analysieren. Eine schlechte Analyse der Art und Weise, wie Benutzer auf Daten zugreifen, hat eine langsame Ver-arbeitung von Abfragen oder sogar überflüssige Sperren von Tabellen zur Folge. Sie sollten bei der Analyse des Datenzugriffs durch Benutzer zwei Punkte besonders beachten:

• Die verschiedenen Arten der ausgeführten Abfragen.

• Die Häufigkeit von typischen Abfragen.

Eine genaue Kenntnis der Datenanforderungen durch die Benutzer hilft Ihnen dabei zu entscheiden, welche Spalten indiziert und welche Indextypen erstellt werden sollten. Möglicherweise müssen Sie bei der einen Abfrage Geschwin-digkeitsnachteile in Kauf nehmen, um bei einer anderen eine bessere Leistung zu erreichen.

ThemaWeisen Sie darauf hin, dass der erste Schritt beim Er-stellen von Indizes darin besteht, die Daten und die Art des Zugriffs durch Benutzer zu kennen.

EinstiegBevor Sie einen Index er-stellen, sollten Sie sich zu-nächst ein genaues Wissen über die Daten aneignen.

Page 323: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 6: Planen von Indizes 27

Richtlinien für die Indizierung

� Spalten, die indiziert werden sollten

� Primär- und Fremdschlüssel

� Solche, die regelmäßig nach Bereichen durchsucht werden

� Solche, auf die regelmäßig in sortierter Reihenfolge zugegriffen wird

� Solche, die beim Aggregieren zu Gruppen zusammengefasst werden

� Spalten, die nicht indiziert werden sollten

� Solche, die nur selten in Abfragen referenziert werden

� Solche, die wenige eindeutige Werte enthalten

� Solche, die mit den Datentypen text, ntext oder imagedefiniert sind

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Für welche Spalten ein Index erstellt werden sollte, ist von der jeweiligen Arbeitsumgebung sowie von den Eigenschaften und der Verwendung der Daten abhängig. Die Zweckmäßigkeit eines Indexes hängt unmittelbar damit zu-sammen, wie viel Prozent der Zeilen von einer Abfrage zurückgegeben werden. Ein geringer Prozentsatz bzw. eine hohe Selektivität bedeuten eine größere Effizienz.

Wenn Sie für eine Spalte einen Index erstellen, wird diese Spalte als Indexspalte bezeichnet. Ein in einer Indexspalte enthaltener Wert wird als Schlüsselwert bezeichnet.

Spalten, die indiziert werden sollten Erstellen Sie Indizes für Spalten, die häufig durchsucht werden, zum Beispiel für:

� Primärschlüssel � Fremdschlüssel oder Spalten, die häufig bei der Verknüpfung von Tabellen

verwendet werden. � Spalten, die nach Schlüsselwertebereichen durchsucht werden. � Spalten, auf die in sortierter Reihenfolge zugegriffen wird. � Spalten, die beim Aggregieren zu Gruppen zusammengefasst werden.

ThemaErläutern Sie, welche Über-legungen bei der Auswahl der zu indizierenden Spalten eine Rolle spielen.

EinstiegBeachten Sie bei der Index-erstellung auch die Umge-bungsbedingungen, und berücksichtigen Sie, wie die Daten verteilt werden sollen.

Anmerkung

Methodischer Hinweis Stellen Sie folgende Frage: Können alle Spalten indiziert werden?

Antwort: Ja, aber es wäre nicht sehr effizient, alle Spalten zu indizieren.

Stellen Sie folgende Frage: Kann eine einzige Spalte mehrfach indiziert werden?

Antwort: Ja, aber das ist im Allgemeinen nicht effizient.

Page 324: Programmieren Einer Microsoft SQL Server 2000-Datenbank

28 Unterrichtseinheit 6: Planen von Indizes

Spalten, die nicht indiziert werden sollten Erstellen Sie für folgende Spalten keinen Index:

� Spalten, die nur selten abgefragt werden. � Spalten, die wenige eindeutige Werte enthalten. Beispielsweise würde ein

Index für eine Spalte mit zwei Werten, wie „männlich“ und „weiblich“, einen hohen Prozentsatz an Zeilen zurückgeben.

� Spalten, für die der Datentyp text, ntext oder image definiert wurde. Spalten dieses Datentyps können nicht indiziert werden.

Page 325: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 6: Planen von Indizes 29

Auswählen des geeigneten gruppierten Indexes

� Häufig aktualisierte Tabellen� Ein gruppierter Index mit einer Identitätsspalte behält

aktualisierte Seiten im Hauptspeicher� Sortieren

� Ein gruppierter Index hält die Daten vorsortiert� Spaltenlänge und Datentyp

� Begrenzen Sie die Anzahl der Spalten� Verringern Sie die Anzahl der Zeichen� Verwenden Sie möglichst immer den kleinsten Datentyp

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Berücksichtigen Sie bei der Auswahl des gruppierten Indexes für einzelne Tabellen, wie die jeweilige Tabelle verwendet wird.

Häufig aktualisierte Tabellen Prüfen Sie beim Optimieren der Leistung für Dateneingaben in einer häufig verwendeten Tabelle die Erstellung eines gruppierten Indexes für eine Primär-schlüssel-Identitätsspalte. Sie können die Geschwindigkeit erhöhen, indem Sie für Einfügungen standardmäßig einige Seiten am Ende der Tabelle verwenden. Durch den regelmäßigen Zugriff bleiben diese Seiten im Arbeitsspeicher.

SortierenBei Tabellen, die häufig für Berichte sortiert, für Aggregationen gruppiert oder nach Datenbereichen durchsucht werden, ist ein gruppierter Index für die Sor-tierspalte vorteilhaft. Die Verwendung eines gruppierten Indexes ist besonders geeignet, wenn viele Spalten der Tabelle zurückgegeben werden ein nicht grup-pierter Index nicht praktikabel ist. Zum Beispiel ist bei einer Tabelle mit einer Versandliste ein gruppierter Index für die Postleitzahl vorteilhaft, weil die Ver-sandadressen in einer bestimmten Reihenfolge gedruckt und verwendet werden müssen.

ThemaErläutern Sie, wie der am besten geeignete Indextyp für eine Datenbank be-stimmt wird.

EinstiegBerücksichtigen Sie bei der Auswahl des gruppierten Indexes, wie die Tabelle verwendet wird.

Methodischer Hinweis Weisen Sie die Kursteilneh-mer darauf hin, dass sie nicht automatisch den gruppierten Index für den Primärschlüssel verwenden sollen. Berücksichtigen Sie die Verwendung der Tabelle.

Page 326: Programmieren Einer Microsoft SQL Server 2000-Datenbank

30 Unterrichtseinheit 6: Planen von Indizes

Spaltenlänge und Datentyp SQL Server verwendet den Wert des gruppierten Indexes als Zeilen-ID inner-halb der nicht gruppierten Indizes. Der Wert des gruppierte Indexes kann sich in einer Tabellenstruktur mehrfach wiederholen.

Auf folgende Weise können Sie verhindern, dass umfangreiche gruppierte Indizes die ihnen zugeordneten nicht gruppierten Indizes vergrößern und deren Verarbeitung verlangsamen:

� Begrenzen Sie die Anzahl der Spalten im gruppierten Index. � Verringern Sie die durchschnittliche Anzahl der Zeichen, indem Sie den

varchar-Datentyp statt dem char-Datentyp verwenden. � Verwenden Sie möglichst immer den jeweils kleinsten Datentyp, z. B.

tinyint statt int.

Page 327: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 6: Planen von Indizes 31

Unterstützen von Abfragen durch Indizierung

� Verwenden von Suchargumenten

� Schreiben von guten Suchargumenten

� Geben Sie in der Abfrage eine WHERE-Klausel an

� Stellen Sie sicher, dass die WHERE-Klausel die Zeilenanzahl begrenzt

� Stellen Sie sicher, dass es für jede in der Abfrage referenzierte Tabelle einen Ausdruck gibt

� Verwenden Sie möglichst keine führenden Platzhalterzeichen

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Die Abfrageleistung ist davon abhängig, wie gut Sie Ihre Indizes entworfen haben. Ebenso wichtig ist es, dass Sie Ihre Abfragen mit einem Suchargument versehen, das die Vorteile einer indizierten Spalte nutzen kann.

Verwenden von Suchargumenten Ein Suchargument schränkt eine Suche auf eine exakte Übereinstimmung, einen Wertebereich oder eine Kombination aus mindestens zwei Elementen, die durch einen AND-Operator verknüpft sind, ein. Ein Suchargument enthält einen kon-stanten Ausdruck, der mit Hilfe eines Operators auf eine Spalte angewendet wird. Durch die Verwendung von Suchargumenten beim Schreiben von Ab-fragen erhöhen Sie die Wahrscheinlichkeit, dass der Abfrageoptimierer einen Index verwenden kann.

Schreiben von guten Suchargumenten Ein Ausdruck, der eine Suche nicht einschränkt, wird als Nicht-Suchargument betrachtet. In vielen Fällen empfiehlt es sich, Abfragen neu zu schreiben, um Nicht-Suchargumente in Suchargumente zu konvertieren.

Sie haben folgende Möglichkeiten, die Suche einzuschränken:

� Geben Sie in der Abfrage eine WHERE-Klausel an. � Stellen Sie sicher, dass die WHERE-Klausel die Zeilenanzahl begrenzt. � Stellen Sie sicher, dass es für jede in der Abfrage referenzierte Tabelle einen

Ausdruck gibt. � Verwenden Sie möglichst keine führenden Platzhalterzeichen.

ThemaErläutern Sie, warum es wichtig ist, die Suche ein-zuschränken, und wie sie eingeschränkt werden kann.

EinstiegDie Abfrageleistung ist von der Qualität Ihres Index-entwurfs und der Selektivität Ihrer Abfragen abhängig. Schreiben Sie immer Ab-fragen, die eine Suche einschränken.

Page 328: Programmieren Einer Microsoft SQL Server 2000-Datenbank

32 Unterrichtseinheit 6: Planen von Indizes

Die folgende Tabelle enthält Beispiele für gute Suchargumente:

Gute Suchargumente Abfrage

WHERE cust_id = 47635 Schränkt die Suche ein, weil cust_ideindeutig ist.

WHERE date BETWEEN '07/23/2000' AND '07/30/2000'

Schränkt die Suche auf einen kleinen Datenbereich ein.

WHERE lastname LIKE 'Gre%' Schränkt die Suche auf Nachnamen ein, die mit den Buchstaben Gre beginnen.

Page 329: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 6: Planen von Indizes 33

Bestimmen der Selektivität Hohe Selektivität

member_nomember_nomember_no

11

22

..

..

last_namelast_namelast_name first_namefirst_namefirst_name

RandallRandall

FloodFloodJoshuaJoshua

KathieKathie

..

1000010000 AndersonAnderson BillBill

SELECT *FROM memberWHERE member_no > 8999

SELECT *FROM memberWHERE member_no > 8999

100010000 = 10%

Anzahl der Kriterien erfüllenden ZeilenVollständige Anzahl der Zeilenin einer Tabelle

=

Niedrige Selektivitätmember_nomember_nomember_no

11

22

..

..

last_namelast_namelast_name first_namefirst_namefirst_name

RandallRandall

FloodFloodJoshuaJoshua

KathieKathie

..

1000010000 AndersonAnderson BillBill

SELECT *FROM memberWHERE member_no < 9001

SELECT *FROM memberWHERE member_no < 9001

900010000 = 90%

Anzahl der Kriterien erfüllenden ZeilenVollständige Anzahl der Zeilenin einer Tabelle

=

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Selektivität ist ein Konzept und ein Begriff, der immer wieder in Verbindung mit Indizes verwendet wird. Bei der Festlegung der zu indizierenden Spalten und der Auswahl des zu erstellenden Indextyps sollten Sie den Grad der Selek-tivität der Datenwerte berücksichtigen.

Definieren der Selektivität Selektivität leitet sich von dem Prozentsatz der Zeilen in einer Tabelle ab, auf die mit einer Abfrage zugegriffen oder die von einer Abfrage zurückgegeben werden. Der Abfrageoptimierer bestimmt die Selektivität für SELECT-, UPDATE- und DELETE-Anweisungen. Erstellen Sie Indizes in folgenden Fällen:

� Für Spalten, die häufig in Verknüpfungsvorgängen oder in der WHERE-Klausel referenziert werden.

� Für Daten mit einem hohen Grad an Selektivität.

Hohe Selektivität und niedrige Selektivität Hohe Selektivität bedeutet, dass das Suchkriterium die Anzahl der zurückge-gebenen Zeilen auf einen möglichst niedrigen Prozentsatz der möglichen Gesamtzeilenanzahl begrenzt. Höchste Selektivität ist erreicht, wenn nur eine einzige Zeile zurückgegeben wird.

Niedrige Selektivität bedeutet, dass das Suchkriterium einen hohen Prozentsatz der Zeilen in der Tabelle zurückgibt.

Schätzen der Selektivität Sie können den Grad der Selektivität einer Abfrage bestimmen, indem Sie die Anzahl der zurückgegebenen Zeilen relativ zur Gesamtanzahl der Zeilen in der Tabelle für eine bestimmte Abfrage schätzen.

ThemaErläutern Sie das Konzept der Selektivität.

EinstiegSelektivität ist ein Konzept und ein Begriff, der immer wieder in Verbindung mit Indizes verwendet wird.

Methodischer Hinweis Das Beispiel in der Folie kann für die credit-Daten-bank nicht ausgeführt werden.

Page 330: Programmieren Einer Microsoft SQL Server 2000-Datenbank

34 Unterrichtseinheit 6: Planen von Indizes

In diesem Beispiel gibt die Abfrage, unter der Voraussetzung, dass die member-Tabelle 10.000 Zeilen enthält und die Mitgliedsnummern im Bereich von 1 bis 10.000 liegen (alles eindeutige Werte), eine einzige Zeile zurück.

SELECT * FROM member WHERE member_no = 8999

In diesem Beispiel gibt die Abfrage, unter der Voraussetzung, dass die member-Tabelle 10.000 Zeilen enthält und die Mitgliedsnummern im Bereich von 1 bis 10.000 liegen (alles eindeutige Werte), 999 Zeilen zurück.

SELECT * FROM member WHERE member_no > 9001

In diesem Beispiel gibt die Abfrage, unter der Voraussetzung, dass die member-Tabelle 10.000 Zeilen enthält und die Mitgliedsnummern im Bereich von 1 bis 10.000 liegen (alles eindeutige Werte), 9.000 Zeilen zurück.

SELECT * FROM member WHERE member_no < 9001

Beispiel 1

Beispiel 2

Beispiel 3

Page 331: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 6: Planen von Indizes 35

Bestimmen der Datendichte

last_namelast_namelast_name first_namefirst_namefirst_name

RandallRandall

..

..

..

JoshuaJoshua

RandallRandall CynthiaCynthia

RandallRandall TristanTristan

..

..

..

OtaOta LaniLani

..

..

..

SELECT *FROM memberWHERE last_name = ‘Ota’

SELECT *FROM memberWHERE last_name = ‘Ota’

Niedrige Dichte

SELECT *FROM memberWHERE last_name = ‘Randall’

SELECT *FROM memberWHERE last_name = ‘Randall’

Hohe Dichte

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Das Konzept der Dichte steht in engem Zusammenhang mit dem Konzept der Selektivität. Bei der Festlegung der zu indizierenden Spalten sollten Sie die Dichte der Daten überprüfen.

Definieren der Dichte Die Dichte bezeichnet den durchschnittlichen Prozentsatz doppelter Zeilen in einem Index. Wenn die Selektivität der Daten oder der Abfrage sehr niedrig ist, führt das zu einer sehr hohen Dichte.

� Ein Index mit sehr vielen doppelt vorkommenden Werten hat eine hohe Dichte. Ein Index für die lastname-Spalte kann zum Beispiel eine sehr hohe Dichte haben.

� Ein eindeutiger Index hat dagegen eine niedrige Dichte. Das gilt zum Beispiel für einen Index für die Sozialversicherungsnummer, die Führerscheinnummer oder für einen zusammengesetzten Index aus Vor- und Nachname.

Bestimmen der Datendichte Berücksichtigen Sie bei der Bestimmung der Datendichte, dass die Dichte eng mit den jeweiligen Datenelementen zusammenhängt. Die Dichte kann variieren. Betrachten wir zum Beispiel einen Index für die lastname-Spalte. Daten-elemente dieses Indexes sind für einen weit verbreiteten Nachnamen wie Randall sehr dicht, während sie für einen ungewöhnlichen Nachnamen wie Ota eher niedrig ist.

ThemaErläutern Sie das Konzept der Datendichte.

EinstiegDas Konzept der Dichte steht in engem Zusammen-hang mit dem der Selek-tivität. Bei der Festlegung der zu indizierenden Spalten sollten Sie die Dichte der Daten überprüfen.

Methodischer Hinweis Das Beispiel in der Folie kann für die credit-Daten-bank nicht ausgeführt werden.

Page 332: Programmieren Einer Microsoft SQL Server 2000-Datenbank

36 Unterrichtseinheit 6: Planen von Indizes

Auswirkung der Dichte auf den Abfrageplan Weil Daten nicht gleichmäßig verteilt sind, ist offen, ob der Abfrageoptimierer einen Index verwendet oder nicht. In dem in der Abbildung gezeigten Beispiel hat der Abfrageoptimierer zwei Möglichkeiten:

� Er kann einen Tabellenscan zum Abrufen des Nachnamens Randallverwenden.

� Er kann einen Index für den Zugriff auf den Nachnamen Ota verwenden.

Page 333: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 6: Planen von Indizes 37

Bestimmen der Datenverteilung

Standardverteilung der Werte

F - JA - E K - O P - U V - ZNachname

Anzahl derNachnamen

Gleichmäßige Verteilung der Werte

Nachname

Anzahl derNachnamen

C - FA - B G - K L - N O - Z

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Die Datenverteilung steht im Zusammenhang mit dem Konzept der Dichte. Bei der Bestimmung der Datendichte sollten Sie auch die Verteilung der Daten überprüfen.

Definieren der Datenverteilung Die Datenverteilung zeigt die Datenmenge für einen Datenbereich in einer be-stimmten Tabelle und die Anzahl der Zeilen in diesem Bereich an. Wenn eine indizierte Spalte nur wenige eindeutige Werte enthält, kann die Datenverteilung das Abrufen von Daten verlangsamen. Ein Telefonverzeichnis, das alphabetisch nach Nachnamen sortiert ist, kann zum Beispiel sehr viele Telefonteilnehmer mit den Nachnamen Randall oder Jones enthalten.

Standardverteilung oder gleichmäßige Verteilung Bei einer Standardverteilung bleiben die Schlüsselwertebereiche konstant, wäh-rend sich die Anzahl pro Bereich ändert. Bei einer gleichmäßigen Verteilung kann der Abfrageoptimierer sehr leicht die Selektivität einer Abfrage bestim-men, indem er die Anzahl der qualifizierten Zeilen als Prozentsatz der Gesamt-zeilenanzahl in der Tabelle schätzt.

Beziehung zwischen Dichte und Datenverteilung Ähnlich wie bei der Dichte können Datenelemente des Indexes in der Art und Weise, wie die Daten verteilt sind, variieren. Normalerweise sind Daten nicht gleichmäßig verteilt. Wenn die member-Tabelle zum Beispiel 10.000 Zeilen enthält und die lastname-Spalte einen Index besitzt, sind die Nachnamen nor-malerweise nicht gleichmäßig verteilt.

ThemaErläutern Sie das Konzept der Datenverteilung und die verschiedenen Methoden zum Überprüfen der Daten-verteilung.

EinstiegDie Datenverteilung steht im Zusammenhang mit dem Konzept der Dichte. Bei der Bestimmung der Daten-dichte sollten Sie auch die Verteilung der Daten überprüfen.

Page 334: Programmieren Einer Microsoft SQL Server 2000-Datenbank

38 Unterrichtseinheit 6: Planen von Indizes

Schätzen des Prozentsatzes der zurückgegebenen Zeilen In vielen Fällen können Sie den Prozentsatz der Daten, die in einem Resultset zurückgegeben werden, schätzen. Ist das Kriterium zum Beispiel „männlich/weiblich“, kann für das Resultset für „weiblich“ ein Satz von 50 % angenommen werden. Beim Schätzen des Prozentsatzes der Zeilen, die mit Werten wie Nachnamen, Städtenamen oder anderen geografischen Daten zurückgegeben werden, ist eine genaue Kenntnis der Daten sehr wichtig, weil die Datenverteilung in unterschiedlichen Umgebungen stark variieren kann.

Mit dieser Abfrage wird die Verteilung (Anzahl doppelter Daten) von Spalten-werten in einer vorhandenen Datenbank gezeigt. Die Abfrage in diesem Bei-spiel gibt jeden Wert nur einmal zurück, jedoch mit einem Zähler, der angibt, wie oft der jeweilige Wert in der Tabelle vorkommt.

SELECT column, count(*) AS 'Data Count' FROM table GROUP BY column ORDER BY 'Data count' DESC

Beispiel

Methodischer Hinweis Das Beispiel in der Folie kann für die credit-Daten-bank nicht ausgeführt werden.

Page 335: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 6: Planen von Indizes 39

Empfohlene Methoden

Erstellen Sie Indizes, um Eindeutigkeit zu gewährleistenErstellen Sie Indizes, um Eindeutigkeit zu gewährleisten

Löschen Sie Indizes, die nicht benötigt werdenLöschen Sie Indizes, die nicht benötigt werden

Vermeiden Sie lange und gruppierte SchlüsselVermeiden Sie lange und gruppierte Schlüssel

Erstellen Sie Indizes für Spalten, die Tabellen verknüpfenErstellen Sie Indizes für Spalten, die Tabellen verknüpfen

Verwenden Sie einen gruppierten Index, um die Sortierungund Suchvorgänge in Bereichen zu unterstützenVerwenden Sie einen gruppierten Index, um die Sortierungund Suchvorgänge in Bereichen zu unterstützen

Erstellen Sie Indizes, die die Suchargumente unterstützenErstellen Sie Indizes, die die Suchargumente unterstützen

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Die im Folgenden aufgeführten Methoden sollen Sie bei der Planung effektiver Indizes unterstützen:

� Erstellen Sie Indizes für Spalten, die Tabellen miteinander verknüpfen, einschließlich der Primär- bzw. Fremdschlüssel.

� Erstellen Sie eindeutige Indizes, um Eindeutigkeit in einer Spalte oder Spaltengruppe zu gewährleisten.

� Überprüfen Sie die Indizes, und löschen Sie alle Indizes, die nicht benötigt werden. Indizes beanspruchen Festplattenspeicherplatz und Zeit für deren Verwaltung. Datenbanken mit sehr vielen Einfügevorgängen sollten wenige Indizes enthalten. Datenbanken mit sehr vielen Lesevorgängen sollten mehr Indizes enthalten.

� Schließen Sie möglichst keine unnötigen Spalten in den gruppierten Index ein. Verwenden Sie möglichst nur kleine Datentypen, z. B. varchar statt char.

� Verwenden Sie einen gruppierten Index, um die Sortierung und Suchvor-gänge in Bereichen zu unterstützen. Wenn Sie eine Tabelle für das Abrufen von Daten optimieren, sollte der gruppierte Index das Abrufen von Daten-satzgruppen unterstützen. Wählen Sie die Spalte bzw. die Spalten für den gruppierten Schlüssel aus, der Daten in einer häufig benötigten Reihenfolge sortiert bzw. der Datensätze gruppiert, auf die gemeinsam zugegriffen werden muss.

� Erstellen Sie Indizes, die die Suchargumente allgemeiner Abfragen unter-stützen. Spalten mit einer sehr hohen Selektivität sind sehr gut für Indizes geeignet. Spalten mit einer sehr hohen Dichte eignen sich dagegen nicht besonders gut für Indizes.

ThemaGeben Sie eine Übersicht über die empfohlenen Methoden zum Planen von Indizes.

EinstiegDies sind die empfohlenen Methoden zum Planen von Indizes.

Page 336: Programmieren Einer Microsoft SQL Server 2000-Datenbank

40 Unterrichtseinheit 6: Planen von Indizes

Übungseinheit A: Bestimmen der Indizes für eine Tabelle

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

LernzieleAm Ende dieser Übungseinheit werden Sie in der Lage sein, die folgenden Aufgaben auszuführen:

� Verwenden der gespeicherten Systemprozedur sp_help zum Bestimmen der Indexarchitektur einer Tabelle.

� Abfragen der sysindexes-Tabelle zum Identifizieren der Indexarchitektur einer Tabelle.

VoraussetzungenFür diese Übungseinheit benötigen Sie die Skriptdateien für diese Übungs-einheit, die sich in C:\Moc\2328A\Labfiles\L06 befinden.

Einrichten der ÜbungseinheitUm diese Übungseinheit zu bearbeiten, ist eine der folgenden Aktionen erfor-derlich:

� Bearbeiten der vorherigen Übungseinheit. � Ausführen der Batchdatei C:\Moc\2328A\Batches\RestoreCredit.cmd.

Mit dieser Befehlsdatei wird die credit-Datenbank wieder in den Zustand zurückversetzt, der für diese Übungseinheit erforderlich ist.

Weitere Informationen Sollten Sie beim Ausführen von Dateien Hilfe benötigen, suchen Sie in der Hilfe von SQL Query Analyzer nach „Ausführen einer Abfrage“.

Daneben sind die folgenden Informationsquellen verfügbar:

� Das credit-Datenbankschema. � Die Microsoft SQL Server-Onlinedokumentation.

ThemaGeben Sie eine Einführung in die Übungseinheit.

EinstiegIn dieser Übungseinheit ver-wenden Sie zwei Methoden zum Bestimmen der Index-architektur einer Tabelle.

Erläutern Sie die Lernziele der Übungseinheit.

Page 337: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 6: Planen von Indizes 41

SzenarioDer Aufbau des Schulungsraumes soll die Organisation des weltweit agieren-den Handelsunternehmens Northwind Traders widerspiegeln. Das Unternehmen hat den fiktiven Domänennamen nwtraders.msft. Der primäre DNS-Server für nwtraders.msft ist der Kursleitercomputer, dessen IP-Adresse (Internetproto-koll) 192.168.x.200 lautet (wobei x die zugewiesene Schulungsraumnummer ist). Der Name des Kursleitercomputers ist London.

Die folgende Tabelle stellt den Benutzernamen, den Computernamen und die IP-Adresse für jeden Kursteilnehmercomputer in der fiktiven Domäne nwtraders.msft bereit. Suchen Sie den Ihrem Computer zugewiesenen Benutzernamen und notieren Sie ihn.

Benutzername Computername IP-Adresse

SQLAdmin1 Vancouver 192.168.x.1

SQLAdmin2 Denver 192.168.x.2

SQLAdmin3 Perth 192.168.x.3

SQLAdmin4 Brisbane 192.168.x.4

SQLAdmin5 Lisbon 192.168.x.5

SQLAdmin6 Bonn 192.168.x.6

SQLAdmin7 Lima 192.168.x.7

SQLAdmin8 Santiago 192.168.x.8

SQLAdmin9 Bangalore 192.168.x.9

SQLAdmin10 Singapore 192.168.x.10

SQLAdmin11 Casablanca 192.168.x.11

SQLAdmin12 Tunis 192.168.x.12

SQLAdmin13 Acapulco 192.168.x.13

SQLAdmin14 Miami 192.168.x.14

SQLAdmin15 Auckland 192.168.x.15

SQLAdmin16 Suva 192.168.x.16

SQLAdmin17 Stockholm 192.168.x.17

SQLAdmin18 Moscow 192.168.x.18

SQLAdmin19 Caracas 192.168.x.19

SQLAdmin20 Montevideo 192.168.x.20

SQLAdmin21 Manila 192.168.x.21

SQLAdmin22 Tokyo 192.168.x.22

SQLAdmin23 Khartoum 192.168.x.23

SQLAdmin24 Nairobi 192.168.x.24

Veranschlagte Zeit für die Übungseinheit: 15 Minuten

Page 338: Programmieren Einer Microsoft SQL Server 2000-Datenbank

42 Unterrichtseinheit 6: Planen von Indizes

Übung 1 Identifizieren von Indizes mit Hilfe von „sp_help“

In dieser Übung verwenden Sie die gespeicherte Systemprozedur sp_help zum Bestimmen der Indexarchitektur einer Tabelle.

� So verwenden Sie „sp_help“ In diesem Verfahren verwenden Sie die gespeicherte Systemprozedur sp_help,um die Namens-, Typ- und Schlüsselspalten des Indexes einer Tabelle zu bestimmen. 1. Melden Sie sich mit Hilfe der Informationen in der folgenden Tabelle an der

Schulungsraumdomäne nwtraders an.

Option Eingabe

Benutzername SQLAdminx (wobei x die Ihrem Computernamen zugewiesene Nummer ist, wie in der Schulungsraumdomäne nwtraders.msftfestgelegt)

Kennwort password

2. Öffnen Sie SQL Query Analyzer und melden Sie sich gegebenenfalls mit Microsoft Windows®-Authentifizierung am (lokalen) Server an. Sie sind berechtigt, sich an SQL Server anzumelden und SQL Server zu ver-walten, da Sie als SQLAdminx angemeldet und damit Mitglied der lokalen Gruppe der Administratoren von Microsoft Windows 2000 sind. Alle Mit-glieder dieser Gruppe werden automatisch der sysadmin-Rolle von SQL Server zugeordnet.

3. Klicken Sie in der Liste DB auf credit.4. Öffnen Sie das Skript

C:\Moc\2328A\Labfiles\L06\Inspect_corporation.sql, überprüfen Sie es, und führen Sie es dann aus. Dieses Skript verwendet sp_help, um Informationen zur corporation-Tabelle zurückzugeben. Diese gespeicherte Prozedur gibt sieben Datenraster zurück.

5. Navigieren Sie zum sechsten Raster mit dem Namen index_name.Wie heißen die Indizes in der corporation-Tabelle? Die corporation-Tabelle besitzt zwei Indizes: corporation_ident und corporation_region_link. ____________________________________________________________

____________________________________________________________

Ist der Primärschlüssel der corporation-Tabelle ein gruppierter oder ein nicht gruppierter Index? Der Primärschlüssel ist ein gruppierter Index mit dem Namen „corporation_ident“. ____________________________________________________________

____________________________________________________________

Page 339: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 6: Planen von Indizes 43

Übung 2 Anzeigen von Einträgen in der „sysindexes“-Tabelle

In dieser Übung fragen Sie die sysindexes-Systemtabelle ab und identifizieren Indizes.

� So zeigen Sie die „sysindexes“-Systemtabelle an In diesem Verfahren führen Sie ein Skript aus, das die sysindexes-System-tabelle abfragt. 1. Öffnen Sie das Skript

C:\Moc\2328A\Labfiles\L06\Inspect_sysindexes.sql, überprüfen Sie es, und führen Sie es dann aus. Dieses Skript fragt die Tabellen sysobjects und sysindexes nach benutzererstellten Tabellen ab, sortiert nach dem Tabellennamen. Welche Tabellen besitzen keinen gruppierten Index? Woran erkennen Sie das? Die Tabellen „charge“, „member“, „provider“ und „status“ besitzen keine gruppierten Indizes. Der Wert 0 für „indid“ zeigt einen Heap an. ____________________________________________________________

____________________________________________________________

Welche Indextypen besitzt die corporation-Tabelle? Sowohl gruppierte als auch nicht gruppierte Indizes. ____________________________________________________________

____________________________________________________________

2. Überprüfen Sie die Spaltennamen in der sysindexes-Tabelle. Wie viele Zeilen enthält die member-Tabelle? Wie viele Seiten werden verwendet? Der Wert für die Spalte „rows“ lautet 10000. Der Wert für die Spalte „used“ lautet 192. ____________________________________________________________

____________________________________________________________

Wie findet SQL Server den Stamm eines Indexes bzw. die erste IAM-Seite in einem Heap? Diese Informationen befinden sich in den Spalten „root“ und „FirstIAM“ der „sysindexes“-Tabelle. ____________________________________________________________

____________________________________________________________

Page 340: Programmieren Einer Microsoft SQL Server 2000-Datenbank

44 Unterrichtseinheit 6: Planen von Indizes

Lernzielkontrolle

� Einführung in Indizes

� Indexarchitektur

� Abrufen von gespeicherten Daten durch SQL Server

� Verwaltung von Index- und Heapstrukturen durch SQL Server

� Entscheiden, welche Spalten indiziert werden

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

1. Wie findet SQL Server in einer Kundentabelle ohne Indizes die Zeile für die Kundin mit dem Namen Eva Corets?SQL Server muss einen Tabellenscan ausführen und alle Zeilen in der Tabelle lesen, um die gesuchte Zeile zu finden.

2. Wie viele gruppierte Indizes können für eine Tabelle erstellt werden? Einer. Der gruppierte Index definiert den physischen Speicher der Datenseiten, und die gesamten Tabellendaten werden an einem einzigen Ort gespeichert.

3. Wie identifiziert ein nicht gruppierter Index die übergeordneten Zeilen in einer Tabelle mit einem gruppierten Index? Wie identifiziert ein nicht gruppierter Index die Datenzeilen in einer Tabelle, die keinen gruppierten Index besitzt? Wenn ein gruppierter Index vorhanden ist, speichert der nicht grup-pierte Index den Wert des gruppierten Indexes für jede indizierte Zeile. Ist kein gruppierter Index vorhanden, speichert der nicht gruppierte Index die Datei-ID, Seitennummer und Zeilen-ID der Datenzeile.

ThemaVertiefen Sie die Lernziele dieser Unterrichtseinheit, indem Sie die Kernpunkte wiederholen.

EinstiegDie Fragen zur Lernziel-kontrolle beziehen sich auf einige der Schlüsselkon-zepte, die Inhalt dieser Unterrichtseinheit sind.

Page 341: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 6: Planen von Indizes 45

4. Die Erweiterung eine Feldes, das zu keinem Index gehört, verursacht eine Seitenteilung. Durch die Seitenteilung wird die Zeile auf eine neue Seite verschoben. Wie wirkt sich diese Verschiebung auf die nicht gruppierten Indizes in der Tabelle aus? Es gibt keine Auswirkungen auf die nicht gruppierten Indizes. Wenn es einen gruppierten Index gab, bleibt der gruppierte Indexwert unver-ändert. Der nicht gruppierte Index zeigt weiter auf die Zeile, weil sich der gruppierte Schlüssel nicht geändert hat. Wenn es keinen gruppier-ten Index gibt, steht jetzt an der alten Position des Datensatzes ein Vorwärtszeiger, der auf die neue Position des Datensatzes verweist. In keinem der beiden Fälle muss der nicht gruppierte Index geändert werden.

5. Sie beabsichtigen, für die Spalten company name, last name und first name einer Tabelle einen zusammengesetzten, gruppierten Index zu erstellen. Welche wichtigen Aspekte müssen Sie bei der Erstellung dieses Indexes berücksichtigen und warum? Gibt es eine bessere Lösung? Der Schlüssel des gruppierten Indexes sollte möglichst klein sein. Je größer der Schlüsselwert eines gruppierten Indexes ist, desto stärker wirkt er sich auf alle nicht gruppierten Indizes aus. Je umfangreicher der gruppierte Index ist, desto geringer ist seine Effektivität. Je stärker der Umfang der Schlüsselwerte zunimmt, desto mehr Speicherplatz wird für die Werte pro Seite benötigt; die Seite beinhaltet dann weniger Schlüsselwerte, was dazu führt, dass die Struktur des gruppierten Indexes (der B-Baum) umfangreicher wird. Je größer der gruppierte Index wird (je mehr Nicht-Blattebenen vorhanden sind), desto mehr E/A-Zyklen sind zum Durchsuchen der Indexarchitektur erforderlich. Außerdem ist es möglicherweise vorteilhafter, anstelle eines eindeutigen zusammengesetzten Schlüssels einen nicht gruppierten Index oder mehrere Indizes zu verwenden. Eine bessere Lösung zur Indeximplementierung könnte darin bestehen, den gruppierten Index für eine Spalte, die die Kunden-ID enthält (so-fern vorhanden), oder die Spalte „last name“ (Nachname) zu erstellen. Wenn keine Spalte für die Kunden-ID vorhanden ist, sollten Sie even-tuell die IDENTITY-Eigenschaft verwenden oder eine neue Spalte mit Schlüsselwerten hinzufügen, die sich aus Daten zusammensetzen, die aus den einzelnen Zeilen extrahiert werden.

Page 342: Programmieren Einer Microsoft SQL Server 2000-Datenbank

2 Unterrichtseinheit 6: Planen von Indizes

This page is intentionally left blank.

Page 343: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Inhalt

Übersicht 1

Erstellen von Indizes 2

Arbeiten mit den CREATE INDEX- Optionen 13

Verwalten von Indizes 18

Übungseinheit A: Erstellen und Verwalten von Indizes 27

Einführung in die Arbeit mit Statistiken 37

Abfragen der „sysindexes“-Tabelle 48

Einrichten von Indizes mit Hilfe des Indexoptimierungs-Assistenten 50

Leistungsaspekte 53

Empfohlene Methoden 54

Übungseinheit B: Anzeigen von Indexstatistiken 56

Lernzielkontrolle 65

Unterrichtseinheit 7: Erstellen und Verwalten von Indizes

Page 344: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Die in diesen Unterlagen enthaltenen Angaben und Daten können ohne vorherige Ankündigung geändert werden. Die in diesen Unterlagen genannten Firmen, Produkte, Menschen, Charaktere und/oder Daten sind frei erfunden und sollen keine wirklichen Individuen, Gesellschaften, Produkte oder Veranstaltungen darstellen, soweit nichts anderes angegeben ist. Die Benutzer/innen sind verpflichtet, sich an alle anwendbaren Urheberrechtsgesetze zu halten. Ohne ausdrückliche schriftliche Erlaubnis der Microsoft Corporation darf kein Teil dieser Unterlagen für irgendwelche Zwecke vervielfältigt oder übertragen werden, unabhängig davon, auf welche Art und Weise oder mit welchen Mitteln, elektronisch oder mechanisch, dies geschieht. Wenn auf dieses Dokument nur auf elektronischem Wege zugegriffen werden kann, sind Sie hiermit berechtigt, eine (1) Kopie zum persönlichen Gebrauch auszudrucken.

Microsoft Corporation kann Inhaber von Patenten oder Patentanträgen, Marken, Urheberrechten oder anderen gewerblichen Schutzrechten sein, die den Inhalt dieses Dokuments betreffen. Die Bereitstellung dieses Dokuments gewährt keinerlei Lizenzrechte an diesen Patenten, Marken, Urheberrechten oder anderen gewerblichen Schutzrechten, es sei denn, dies wurde ausdrücklich durch einen schriftlichen Lizenzvertrag mit der Microsoft Corporation vereinbart.

2000 Microsoft Corporation. Alle Rechte vorbehalten.

Microsoft, ActiveX, BackOffice, MS-DOS, PowerPoint, Visual Basic, Visual C++, Visual Studio, Windows und Windows NT sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern.

Andere in diesem Dokument aufgeführte Produkt- und Firmennamen sind möglicherweise Marken der jeweiligen Eigentümer.

Project Lead: Rich Rose Instructional Designers: Rich Rose, Cheryl Hoople, Marilyn McGill Instructional Software Design Engineers: Karl Dehmer, Carl Raebler, Rick Byham Technical Lead: Karl Dehmer Subject Matter Experts: Karl Dehmer, Carl Raebler, Rick Byham Graphic Artist: Kirsten Larson (Independent Contractor) Editing Manager: Lynette Skinner Editor: Wendy Cleary Copy Editor: Edward McKillop (S&T Consulting) Production Manager: Miracle Davis Production Coordinator: Jenny Boe Production Support: Lori Walker (S&T Consulting) Test Manager: Sid Benavente Courseware Testing: TestingTesting123 Classroom Automation: Lorrin Smith-Bates Creative Director, Media/Sim Services: David Mahlmann Web Development Lead: Lisa Pease CD Build Specialist: Julie Challenger Online Support: David Myka (S&T Consulting) Localization Manager: Rick Terek Operations Coordinator: John Williams Manufacturing Support: Laura King; Kathy Hershey Lead Product Manager, Release Management: Bo Galford Lead Product Manager, Data Base: Margo Crandall Group Manager, Courseware Infrastructure: David Bramble Group Product Manager, Content Development: Dean Murray General Manager: Robert Stewart

Page 345: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 7: Erstellen und Verwalten von Indizes iii

Hinweise für den Kursleiter In dieser Unterrichtseinheit erhalten die Kursteilnehmer eine Übersicht über das Erstellen und Verwalten von Indizes mit den CREATE INDEX-Optionen. Es wird erläutert, wie Indizes mit Wartungsverfahren physisch geändert werden. In der Unterrichtseinheit werden Wartungstools behandelt und die Verwendung von Statistiken in Microsoft® SQL Server™ 2000 beschrieben. Darüber hinaus werden Möglichkeiten aufgezeigt, um zu prüfen, ob Indizes verwendet werden, und es wird erklärt, wie festgestellt werden kann, ob die Indizes eine optimale Leistung aufweisen. Die Unterrichtseinheit schließt mit einer Erklärung, wann der Indexoptimierungs-Assistent eingesetzt werden sollte.

Am Ende dieser Unterrichtseinheit werden die Kursteilnehmer in der Lage sein, die folgenden Aufgaben auszuführen:

� Erstellen von eindeutigen oder zusammengesetzten Indizes und indizierten Sichten.

� Verwenden der CREATE INDEX-Optionen. � Erläutern, wie Indizes über einen längeren Zeitraum verwaltet werden. � Erläutern, wie mit dem Abfrageoptimierer Statistiken erstellt, gespeichert,

verwaltet und verwendet werden, um Abfragen zu optimieren. � Abfragen der sysindexes-Tabelle. � Erläutern, wie der Indexoptimierungs-Assistent arbeitet und wann er ver-

wendet werden sollte. � Erläutern der Leistungsaspekte, die Auswirkungen auf das Erstellen und

Verwalten von Indizes haben.

Unterlagen und Vorbereitung In diesem Abschnitt werden die erforderlichen Unterlagen und vorbereitenden Aufgaben erläutert, die nötig sind, um diese Unterrichtseinheit zu unterrichten.

Erforderliche Unterlagen Um diese Unterrichtseinheit zu unterrichten, benötigen Sie folgende Unterlagen:

� Die Microsoft PowerPoint®-Datei 2328A_07.ppt� Die Beispieldatei C:\Moc\2328A\Demo\D07_Ex.sql, die alle Beispiel-

skripts der Unterrichtseinheit enthält, soweit in der Unterrichtseinheit nichts anderes angegeben ist.

Vorbereitende Aufgaben Zur Vorbereitung dieser Unterrichtseinheit gehen Sie folgendermaßen vor:

� Lesen Sie alle Unterlagen für diese Unterrichtseinheit. � Arbeiten Sie die Übungseinheiten durch.

Präsentation:60 Minuten

Übungseinheit:60 Minuten

Page 346: Programmieren Einer Microsoft SQL Server 2000-Datenbank

iv Unterrichtseinheit 7: Erstellen und Verwalten von Indizes

Strategie für die Unterrichtseinheit Verwenden Sie die folgende Strategie, um diese Unterrichtseinheit zu präsentieren:

� Erstellen von Indizes Erläutern Sie die Anweisungen CREATE INDEX und DROP INDEX, und erklären Sie die Vorteile des Definierens eindeutiger oder zusammenge-setzter Indizes. Erklären Sie, dass es empfehlenswert ist, zunächst Informa-tionen zu vorhandenen Indizes abzurufen, bevor die Kursteilnehmer Indizes erstellen, ändern oder löschen.

� Arbeiten mit CREATE INDEX-Optionen Erläutern Sie die Verwendung der Option FILLFACTOR. Betonen Sie, wie wichtig es ist, die Option FILLFACTOR zusammen mit der Option PAD_INDEX zu verwenden, um langfristig die Einfüge- und Aktualisie-rungsleistung bei Tabellen zu optimieren, die Indizes enthalten.

� Verwalten von Indizes Erläutern Sie, dass Indizes von Zeit zu Zeit verwaltet werden müssen, da die Daten fragmentiert werden, sobald die Tabellen größer werden. Erklären Sie, wie die DBCC SHOWCONTIG-Anweisung dabei hilft, die Index-leistung beizubehalten. Weisen Sie anschließend darauf hin, dass die Option DROP_EXISTING verwendet wird, um vorhandene Indizes zu verwalten. Mit dieser Option wird die Indexdefinition geändert und das erneute Er-stellen von Indizes beschleunigt.

� Einführung in die Arbeit mit Statistiken Erläutern Sie, in welcher Weise der Abfrageoptimierer Statistiken verwen-det, um zu ermitteln, ob ein Index nützlich ist. Erklären Sie, wie statistische Daten gesammelt, gespeichert, erstellt, aktualisiert und angezeigt werden. Betonen Sie, wie wichtig das Vorhandensein von aktuellen Statistiken ist.

� Abfragen der sysindexes-Tabelle Erläutern Sie, wie die sysindexes-Tabelle abgefragt wird, um zusätzlich zur Statistik für jeden Index Informationen zur Tabelle und zum Index abzu-rufen. Besprechen Sie die partielle Liste mit Informationen, die eine Ab-frage zurückgeben kann.

� Einrichten von Indizes mit Hilfe des Indexoptimierungs-Assistenten Stellen Sie den Indexoptimierungs-Assistenten vor, und erklären Sie, wann der Assistent verwendet werden sollte. Besprechen Sie die Aspekte und Richtlinien, die beim Verwenden des Assistenten berücksichtigt werden sollten.

� Leistungsaspekte Erläutern Sie die Leistungsaspekte, die Auswirkungen auf das Erstellen und Verwalten von Indizes haben.

Page 347: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 7: Erstellen und Verwalten von Indizes v

AnpassungsinformationenDieser Abschnitt beschreibt die Anforderungen zum Einrichten der Übungs-einheiten für eine Unterrichtseinheit sowie die Konfigurationsänderungen, die während der Übungseinheiten an den Kursteilnehmercomputern vorgenommen werden. Diese Informationen sollen Ihnen beim Replizieren oder Anpassen der Microsoft Official Curriculum-Courseware (MOC) helfen.

Die Übungseinheiten in dieser Unterrichtseinheit hängen auch von der Schulungsraumkonfiguration ab, die im Abschnitt „Anpassungsinformationen“ am Ende des Dokuments Handbuch für das Einrichten von Schulungs-computern für Kurs 2328A, Programmieren einer Microsoft SQL Server 2000-Datenbank, angegeben ist.

Einrichten der Übungseinheiten Der folgende Abschnitt beschreibt die Anforderungen zum Einrichten der Übungseinheiten für diese Unterrichtseinheit.

Anforderung zum Einrichten der Übungseinheit A Die Übungseinheit in dieser Unterrichtseinheit setzt voraus, dass sich die ClassNorthwind-Datenbank in dem für diese Übungseinheit erforderlichen Zustand befindet. Um die Kursteilnehmercomputer so vorzubereiten, dass sie dieser Anforderung entsprechen, führen Sie eine der folgenden Aktionen durch:

� Bearbeiten der vorhergehenden Übungseinheit. � Ausführen der Batchdatei C:\Moc\2328A\Batches\Restore07A.cmd.

Anforderung zum Einrichten der Übungseinheit B Die Übungseinheit in dieser Unterrichtseinheit setzt voraus, dass sich die ClassNorthwind-Datenbank in dem für diese Übungseinheit erforderlichen Zustand befindet. Um die Kursteilnehmercomputer so vorzubereiten, dass sie dieser Anforderung entsprechen, führen Sie eine der folgenden Aktionen durch:

� Bearbeiten der vorhergehenden Übungseinheit. � Ausführen der Batchdatei C:\Moc\2328A\Batches\Restore07B.cmd.

Wenn dieser Kurs angepasst wurde, müssen die Kursteilnehmer die Batchdatei C:\Moc\2328A\Batches\Restore07A.cmd ausführen, damit sicher-gestellt ist, dass die erste Übungseinheit ordnungsgemäß durchgeführt werden kann.Wenn dieser Kurs angepasst wurde, müssen die Kursteilnehmer die Batchdatei C:\Moc\2328A\Batches\Restore07B.cmd ausführen, damit sichergestellt ist, dass die zweite Übungseinheit ordnungsgemäß durchgeführt werden kann.

Ergebnisse der Übungseinheiten Auf den Kursteilnehmercomputern gibt es keine Konfigurationsänderungen, die die Replikation oder die Anpassung betreffen.

Wichtig

Achtung

Page 348: Programmieren Einer Microsoft SQL Server 2000-Datenbank

vi Unterrichtseinheit 7: Erstellen und Verwalten von Indizes

This page is intentionally left blank.

Page 349: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 7: Erstellen und Verwalten von Indizes 1

Übersicht

� Erstellen von Indizes

� Arbeiten mit CREATE INDEX-Optionen

� Verwalten von Indizes

� Einführung in die Arbeit mit Statistiken

� Abfragen der „sysindexes“-Tabelle

� Einrichten von Indizes mit Hilfe des Indexoptimierungs-Assistenten

� Leistungsaspekte

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Wenn Sie eine Datenbank programmieren, möchten Sie nützliche Indizes erstellen, die Ihnen einen schnellen Zugriff auf Daten ermöglichen. Mit Hilfe von Microsoft® Windows® 2000 können Sie Indizes und Statistiken erstellen und verwalten. Wenn Sie den Indexoptimierungs-Assistent verwenden, erstellt Microsoft SQL Server™ 2000 Indizes, analysiert Ihre Abfragen und ermittelt die Indizes, die erstellt werden sollten.

Am Ende dieser Unterrichtseinheit werden Sie in der Lage sein, die folgenden Aufgaben auszuführen:

� Erstellen von eindeutigen oder zusammengesetzten Indizes und indizierten Sichten.

� Verwenden der CREATE INDEX-Optionen. � Erläutern, wie Indizes über einen längeren Zeitraum verwaltet werden. � Erläutern, wie mit dem Abfrageoptimierer Statistiken erstellt, gespeichert,

verwaltet und verwendet werden, um Abfragen zu optimieren. � Abfragen der sysindexes-Tabelle. � Erläutern, wie der Indexoptimierungs-Assistent arbeitet und wann er ver-

wendet werden sollte. � Erläutern der Leistungsaspekte, die Auswirkungen auf das Erstellen und

Verwalten von Indizes haben.

ThemaGeben Sie eine Übersicht über die Themen und Lern-ziele dieser Unterrichts-einheit.

EinstiegIn dieser Unterrichtseinheit lernen Sie, wie Indizes er-stellt und verwaltet werden.

Page 350: Programmieren Einer Microsoft SQL Server 2000-Datenbank

2 Unterrichtseinheit 7: Erstellen und Verwalten von Indizes

���� Erstellen von Indizes

� Erstellen und Löschen von Indizes

� Erstellen eindeutiger Indizes

� Erstellen zusammengesetzter Indizes

� Erstellen von Indizes für berechnete Spalten

� Abrufen von Informationen zu vorhandenen Indizes

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Da Sie nun mit den unterschiedlichen Architekturen von Indizes vertraut sind, wollen wir uns mit dem Erstellen und Löschen von Indizes befassen und unter-suchen, wie Informationen zu vorhandenen Indizes abgerufen werden können.

ThemaStellen Sie die Themen zum Erstellen von Indizes vor.

EinstiegDa Sie nun mit den unter-schiedlichen Architekturen von Indizes vertraut sind, wollen wir uns mit dem Erstellen von Indizes be-fassen und untersuchen, wie Informationen zu vor-handenen Indizes abgerufen werden können.

Page 351: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 7: Erstellen und Verwalten von Indizes 3

Erstellen und Löschen von Indizes

USE NorthwindCREATE CLUSTERED INDEX CL_lastnameON employees(lastname)

USE NorthwindCREATE CLUSTERED INDEX CL_lastnameON employees(lastname)

� Verwenden der CREATE INDEX-Anweisung � Für Tabellen mit PRIMARY KEY- oder UNIQUE-

Einschränkung werden Indizes automatisch erstellt

� Indizes können unter bestimmten Voraussetzungen auch für Sichten erstellt werden

� Verwenden der DROP INDEX-Anweisung

USE NorthwindDROP INDEX employees.CL_lastname

USE NorthwindDROP INDEX employees.CL_lastname

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Zum Erstellen von Indizes verwenden Sie die CREATE INDEX-Anweisung und zum Löschen von Indizes die DROP INDEX-Anweisung.

Um eine der beiden Anweisungen in einer Datenbank anwenden zu können, müssen Sie der Besitzer der jeweiligen Tabelle sein.

Verwenden der CREATE INDEX-Anweisung Verwenden Sie zum Erstellen von Indizes die CREATE INDEX-Anweisung. Sie können auch den Indexerstellungs-Assistenten von SQL Server Enterprise Manager verwenden. Wenn Sie für eine oder mehrere Spalten einer Tabelle einen Index erstellen, sollten Sie die folgenden Aspekte und Richtlinien berück-sichtigen:

� Wenn für eine Tabelle eine PRIMARY KEY- oder UNIQUE-Einschrän-kung erstellt wird, werden von SQL Server automatisch Indizes erstellt. Das Definieren einer PRIMARY KEY- oder UNIQUE-Einschränkung ist dem Erstellen von Standardindizes vorzuziehen.

� Um eine CREATE INDEX-Anweisung ausführen zu können, müssen Sie der Besitzer der Tabelle sein.

� Indizes können für Sichten erstellt werden. � Indexinformationen werden von SQL Server in der sysindexes-System-

tabelle gespeichert. � Bevor Sie für eine Spalte einen Index erstellen, müssen Sie ermitteln, ob für

diese Spalte bereits Indizes vorhanden ist. � Sorgen Sie dafür, dass Ihre Indizes nicht zu groß werden, indem Sie sie für

kleine Spalten definieren. Weniger umfangreiche Indizes sind normaler-weise effizienter als Indizes mit umfangreicheren Schlüsselwerten.

ThemaGeben Sie eine Übersicht über die CREATE INDEX-Anweisung und die DROP INDEX-Anweisung.

EinstiegZum Erstellen von Indizes verwenden Sie die CREATE INDEX-Anweisung und zum Entfernen von Indizes die DROP INDEX-Anweisung.

Anmerkung

Page 352: Programmieren Einer Microsoft SQL Server 2000-Datenbank

4 Unterrichtseinheit 7: Erstellen und Verwalten von Indizes

� Legen Sie bei der Spaltenauswahl Eindeutigkeit zugrunde, sodass jedes Schlüsselwort eine geringe Anzahl von Zeilen identifiziert.

� Wenn Sie einen gruppierten Index erstellen, werden alle vorhandenen nicht gruppierten Indizes neu erstellt.

CREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_name ON { table | view } ( column [ ASC | DESC ] [ ,...n ] ) [WITH [PAD_INDEX ] [[,] FILLFACTOR = fillfactor ][[,] IGNORE_DUP_KEY ] [[,] DROP_EXISTING ] [[,] STATISTICS_NORECOMPUTE ] [[,] SORT_IN_TEMPDB ] ][ON filegroup ]

In diesem Beispiel wird für die LastName-Spalte der Employees-Tabelle ein gruppierter Index erstellt.

CREATE CLUSTERED INDEX CL_lastname ON employees(lastname)

Verwenden der DROP INDEX-Anweisung Verwenden Sie zum Entfernen eines Indexes für eine Tabelle die DROP INDEX-Anweisung. Berücksichtigen Sie beim Löschen eines Indexes die fol-genden Aspekte:

� Wenn Sie die DROP INDEX-Anweisung ausführen, gibt SQL Server den vom betreffenden Index belegten Festplattenspeicher frei.

� Sie können die DROP INDEX-Anweisung nicht auf Indizes anwenden, die mit der PRIMARY KEY-Einschränkung oder der UNIQUE-Einschränkung erstellt wurden. Sie müssen die Einschränkung entfernen, um solche Indizes löschen zu können.

� Wenn Sie eine Tabelle löschen, werden auch alle für diese Tabelle erstellten Indizes gelöscht.

� Wenn Sie einen gruppierten Index löschen, werden alle nicht gruppierten Indizes der Tabelle automatisch neu erstellt.

� Um einen Index zu löschen, müssen Sie sich in der Datenbank befinden, in der sich der Index befindet.

� Die DROP INDEX-Anweisung kann nicht auf Systemtabellen angewendet werden.

DROP INDEX 'table.index | view.index' [, ...n ]

In diesem Beispiel wird der Index cl_lastname aus der Employees-Tabelle gelöscht.

USE Northwind DROP INDEX employees.CL_lastname

Syntax

Beispiel 1

Syntax

Beispiel 2

Page 353: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 7: Erstellen und Verwalten von Indizes 5

Erstellen eindeutiger Indizes

USE NorthwindCREATE UNIQUE NONCLUSTERED INDEX U_CustID

ON customers(CustomerID)

USE NorthwindCREATE UNIQUE NONCLUSTERED INDEX U_CustID

ON customers(CustomerID)

RANCHRANCH Santé GourmetSanté Gourmet Jonas BergulfsenJonas Bergulfsen ……

Beim Hinzufügen neuer Zeilen zu einer Tabelle dürfen keine doppeltenSchlüsselwerte vorkommen

Beim Hinzufügen neuer Zeilen zu einer Tabelle dürfen keine doppeltenSchlüsselwerte vorkommen

CustomersCustomersCustomersCustomerIDCustomerID CompanyNameCompanyName ContactNameContactName ……

QUICKBONAP12

QUICKBONAP12

QUICK-StopBon app'Walking

QUICK-StopBon app'Walking

Horst KlossLaurence LebihanHenry David Thoreau

Horst KlossLaurence LebihanHenry David ThoreauRANCH Rancho grande Sergio Gutiérrez

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Durch einen eindeutigen Index wird sichergestellt, dass sämtliche in einer indi-zierten Spalte enthaltenen Daten eindeutig sind und keine doppelten Werte ent-halten.

Eindeutige Indizes stellen sicher, dass Daten in indizierten Spalten eindeutig sind. Wenn für eine Tabelle eine PRIMARY KEY- oder UNIQUE-Einschrän-kung definiert wurde, wird von SQL Server automatisch ein eindeutiger Index erstellt, wenn Sie die CREATE TABLE-Anweisung oder die ALTER TABLE-Anweisung ausführen.

Sicherstellen der Eindeutigkeit von Daten in indizierten Spalten Erstellen Sie für gruppierte oder nicht gruppierte Indizes einen eindeutigen Index, wenn die Daten selbst von vornherein eindeutig sind (z. B. bei fort-laufender Nummerierung).

Wenn die Eindeutigkeit jedoch vom System erzwungen werden muss, sollten Sie anstelle eines eindeutigen Indexes für die betreffende Spalte eine PRIMARY KEY- oder UNIQUE-Einschränkung erstellen. Berücksichtigen Sie beim Erstellen eines eindeutigen Indexes die folgenden Aspekte und Richt-linien:

� Für Spalten einer Tabelle, die mit PRIMARY KEY- oder UNIQUE-Ein-schränkungen definiert wurden, werden von SQL Server automatisch ein-deutige Indizes erstellt.

� Falls eine Tabelle Daten enthält, sucht SQL Server nach doppelten Werten, wenn Sie den Index erstellen.

� Die Daten werden von SQL Server jedes Mal auf doppelte Werte überprüft, wenn Sie die INSERT-Anweisung oder die UPDATE-Anweisung ausfüh-ren. Wenn doppelte Schlüsselwerte vorhanden sind, bricht SQL Server Ihre Anweisung ab und gibt eine Fehlermeldung zurück, mit der auf den vorhan-denen doppelten Wert hingewiesen wird.

ThemaErklären Sie, wie mit Hilfe eindeutiger Indizes die Ein-deutigkeit indizierter Spalten sichergestellt wird.

EinstiegBei einem eindeutigen Index dürfen Schlüsselwerte nicht in mehreren Zeilen vor-kommen.

Page 354: Programmieren Einer Microsoft SQL Server 2000-Datenbank

6 Unterrichtseinheit 7: Erstellen und Verwalten von Indizes

� Stellen Sie sicher, dass jede Zeile einen eindeutigen Wert enthält - wenn für eine Spalte ein eindeutiger Index erstellt wird, darf ein und dieselbe ID nicht in mehreren Zeilen verwendet werden. Auf diese Weise wird sichergestellt, dass jede Einheit eindeutig zu identifizieren ist.

� Erstellen Sie eindeutige Indizes nur für Spalten, bei denen die Integrität der Einheiten erzwungen werden kann. Beispielsweise würden Sie für die Spalte LastName der Employees-Tabelle keinen eindeutigen Index er-stellen, da einige Mitarbeiter eventuell denselben Nachnamen haben.

In diesem Beispiel wird für die Customers-Tabelle ein eindeutiger, nicht gruppierter Index mit dem Namen U_CustID erstellt. Der Index wird für die CustomerID-Spalte erstellt. Der Wert in der CustomerID-Spalte muss in jeder Zeile der Tabelle eindeutig sein.

USE Northwind CREATE UNIQUE NONCLUSTERED INDEX U_CustID ON customers(CustomerID)

Ermitteln aller in einer Spalte enthaltenen doppelten Werte Wenn beim Erstellen eines eindeutigen Indexes doppelte Schlüsselwerte vor-handen sind, kann die CREATE INDEX-Anweisung nicht ausgeführt werden. SQL Server gibt dann eine Fehlermeldung zurück, die auf den ersten doppelten Wert hinweist, wobei jedoch noch weitere doppelte Werte vorhanden sein kön-nen. Mit Hilfe des folgenden Beispielskripts, das für jede beliebige Tabelle ausgeführt werden kann, können Sie sämtliche doppelten Werte einer Spalte ermitteln. Ersetzen Sie den Text in Kursivschrift durch die für Ihre eigene Abfrage erforderlichen Informationen.

SELECT index_col, COUNT (index_col)FROM tablenameGROUP BY index_colHAVING COUNT(index_col)>1 ORDER BY index_col

In diesem Beispiel wird ermittelt, ob in der CustomerID-Spalte der Customers-Tabelle doppelte Kundenkennungen vorhanden sind. Wenn dies der Fall ist, gibt SQL Server im Resultset die jeweilige Kundenkennung und die Anzahl doppelter Einträge zurück.

SELECT CustomerID, COUNT(CustomerID) AS '# of Duplicates' FROM Northwind.dbo.Customers GROUP BY CustomerID HAVING COUNT(CustomerID)>1 ORDER BY CustomerID

CustomerID # of Duplicates

(0 row(s) affected)

Beispiel 1

Beispiel 2

Ergebnis

Page 355: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 7: Erstellen und Verwalten von Indizes 7

Erstellen zusammengesetzter Indizes

USE NorthwindCREATE UNIQUE NONCLUSTERED INDEX U_OrdID_ProdIDON [Order Details] (OrderID, ProductID)

USE NorthwindCREATE UNIQUE NONCLUSTERED INDEX U_OrdID_ProdIDON [Order Details] (OrderID, ProductID)

Zusammengesetzter Schlüssel

Zusammengesetzter Schlüssel

Spalte 1 Spalte 2

Order DetailsOrder DetailsOrder DetailsOrderIDOrderID ProductIDProductID UnitPriceUnitPrice QuantityQuantity

102481024810248

102481024810248

114272

114272

14.0009.80034.800

14.0009.80034.800

12105

12105

DiscountDiscount

0.00.00.0

0.00.00.0

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

In zusammengesetzten Indizes werden mehrere Spalten als Schlüsselwert angegeben. Erstellen Sie zusammengesetzte Indizes in folgenden Fällen:

� Wenn es am günstigsten ist, zwei oder mehr Spalten als Schlüssel zu suchen.

� Wenn sich Abfragen nur auf die Spalten des Indexes beziehen.

Ein gutes Beispiel für die sinnvolle Verwendung eines zusammengesetzten Indexes ist ein Telefonverzeichnis. Das Verzeichnis ist nach Nachnamen sor-tiert. Die Einträge der einzelnen Nachnamen sind wiederum nach Vornamen sortiert, da zahlreiche Einträge mit demselben Nachnamen vorhanden sind.

Berücksichtigen Sie beim Erstellen eines zusammengesetzten Indexes die folgenden Aspekte und Richtlinien:

� In einem zusammengesetzten Index können Sie bis zu 16 Spalten kom-binieren. Die Gesamtlänge aller Spalten, aus denen der zusammengesetzte Index besteht, darf 900 Byte nicht überschreiten.

� Alle Spalten eines zusammengesetzten Indexes müssen aus der gleichen Tabelle stammen, es sei denn, der Index wird für eine Sicht erstellt.

� Definieren Sie zuerst die Spalte, die am eindeutigsten ist. Die Spalte, die in der CREATE INDEX-Anweisung zuerst definiert wird, gilt als die Spalte mit der höchsten Priorität.

� In der WHERE-Klausel einer Abfrage muss auf die erste Spalte des zusam-mengesetzten Indexes verwiesen werden, damit der Abfrageoptimierer den zusammengesetzten Index verwenden kann.

� Ein Index für (Spalte 1, Spalte 2) ist nicht mit einem Index für (Spalte 2,Spalte 1) identisch - jeder Index verfügt über eine spezifische Spalten-reihenfolge. Für die Spaltenreihenfolge ist meistens ausschlaggebend, welche Spalte die selektiveren Daten enthält bzw. den geringsten Prozent-satz an Zeilen zurückgeben würde.

ThemaErläutern Sie die Funktions-weise zusammengesetzter Indizes.

EinstiegIn zusammengesetzten Indizes werden mehrere Spalten als Schlüsselwert angegeben.

Methodischer Hinweis Weisen Sie darauf hin, dass die OrderID-Spalte deshalb als erste Spalte verwendet wird, weil sie selektiver ist als die ProductID-Spalte.

Page 356: Programmieren Einer Microsoft SQL Server 2000-Datenbank

8 Unterrichtseinheit 7: Erstellen und Verwalten von Indizes

� Zusammengesetzte Indizes eignen sich für Tabellen mit mehreren Spalten-schlüsseln.

� Verwenden Sie zusammengesetzte Indizes, um die Abfrageleistung zu er-höhen und um die Anzahl der Indizes, die für eine Tabelle erstellt werden müssen, möglichst gering zu halten.

Es empfiehlt sich normalerweise nicht, für dieselben Spalten meh-rere Indizes zu erstellen.

In diesem Beispiel wird ein nicht gruppierter zusammengesetzter Index für die Order Details-Tabelle erstellt. Die OrderID-Spalte und die ProductID-Spalte dienen als zusammengesetzte Schlüsselwerte. Beachten Sie, dass die Spalte OrderID deshalb zuerst angegeben wird, weil sie selektiver ist als die Spalte ProductID.

USE Northwind CREATE UNIQUE NONCLUSTERED INDEX U_OrdID_ProdID ON [Order Details] (OrderID, ProductID)

Anmerkung

Beispiel

Page 357: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 7: Erstellen und Verwalten von Indizes 9

Erstellen von Indizes für berechnete Spalten

� Sie können Indizes für berechnete Spalten erstellen, wenn die folgenden Voraussetzungen erfüllt sind:� Der Ausdruck computed_column_expression ist

deterministisch und präzise� Die Verbindungsebenenoption ANSI_NULL ist auf ON

festgelegt� Die berechnete Spalte kann die Datentypen text, ntext oder

image nicht auswerten� Die erforderlichen SET-Optionen sind auf ON festgelegt,

während ein Index erstellt wird und wenn INSERT-, UPDATE-oder DELETE-Anweisungen den Indexwert verändern

� Die Option NUMERIC_ROUNDABORT ist auf OFF festgelegt

� Der Abfrageoptimierer ignoriert möglicherweise einenIndex für eine berechnete Spalte

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Sie können Indizes für berechnete Spalten erstellen, wenn die folgenden Voraussetzungen erfüllt sind:

� Der Ausdruck computed_column_expression ist deterministisch. Deter-ministische Ausdrücke geben immer das gleiche Ergebnis zurück.

� Die Verbindungsebenenoption ANSI_NULL ist auf ON festgelegt, wenn die CREATE TABLE-Anweisung ausgeführt wird. Die OBJECTPROPERTY-Funktion meldet mit Hilfe der IsAnsiNullsOn-Eigenschaft, ob die Option auf ON festgelegt ist.

� Der Ausdruck computed_column_expression, der für die berechnete Spalte definiert wurde, kann die Datentypen text, ntext oder image nicht auswerten.

� Die Verbindung, unter der der Index erstellt wird, und alle Verbindungen, unter denen versucht wird, INSERT-, UPDATE- oder DELETE-Anwei-sungen auszuführen, mit denen Werte im Index geändert werden, verfügen über sechs SET-Optionen, die auf ON und eine SET-Option, die auf OFF festgelegt ist. Die folgenden Optionen müssen auf ON festgelegt werden:

• ANSI_NULLS

• ANSI_PADDING

• ANSI_WARNINGS

• ARITHABORT

• CONCAT_NULL_YIELDS_NULL

• QUOTED_IDENTIFIER

ThemaErläutern Sie, welche An-forderungen beim Erstellen eines Indexes für eine berechnete Spalte erfüllt sein müssen.

EinstiegBevor Sie einen Index für eine berechnete Spalte erstellen können, müssen mehrere Voraussetzungen erfüllt sein.

Weitere Informationen Weisen Sie die Kursteil-nehmer darauf hin, dass die SQL Server-Online-dokumentation weitere Informationen über deter-ministische und nicht deter-ministische Funktionen enthält.

Weitere Informationen Weisen Sie die Kursteil-nehmer darauf hin, dass die SQL Server-Onlinedoku-mentation weitere Informa-tionen über SET-Optionen enthält, die Auswirkungen auf Ergebnisse haben.

Page 358: Programmieren Einer Microsoft SQL Server 2000-Datenbank

10 Unterrichtseinheit 7: Erstellen und Verwalten von Indizes

� Daneben muss die Option NUMERIC_ROUNDABORT auf OFF festgelegt werden.

Der Abfrageoptimierer ignoriert einen Index für eine berechnete Spalte für jede SELECT-Anweisung, die unter einer Verbindung ausgeführt wird, die nicht über die vorstehend genannten Optionseinstellungen verfügt.

Anmerkung

Page 359: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 7: Erstellen und Verwalten von Indizes 11

Abrufen von Informationen zu vorhandenen Indizes

� Die gespeicherte Systemprozedur „sp_helpindex“

� Die gespeicherte Systemprozedur „sp_help tablename“

USE NorthwindEXEC sp_helpindex Customers

USE NorthwindEXEC sp_helpindex Customers

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Bevor Sie einen Index erstellen, ändern oder entfernen, benötigen Sie eventuell Informationen zu bereits vorhandenen Indizes.

Die gespeicherte Systemprozedur „sp_helpindex“ Um Indexinformationen, wie den Namen und die Art eines Indexes sowie die für eine bestimmte Tabelle gültigen Optionen abzufragen, können Sie entweder SQL Server Enterprise Manager verwenden oder die gespeicherte System-prozedur sp_helpindex ausführen.

In diesem Beispiel werden die für die Customers-Tabelle vorhandenen Indizes abgefragt.

USE Northwind EXEC sp_helpindex Customers

index_name index_description index_keys

PK_Customers clustered, unique, Primary Key located on PRIMARY CustomerID PostalCode nonclustered located on PRIMARY PostalCode City nonclustered located on PRIMARY City

(1 row(s) affected)

ThemaErklären Sie, wie Informa-tionen zu vorhandenen Indizes abgerufen werden.

EinstiegBevor Sie einen Index er-stellen, ändern oder ent-fernen, benötigen Sie even-tuell Informationen zu be-reits vorhandenen Indizes.

Beispiel

Ergebnis

Page 360: Programmieren Einer Microsoft SQL Server 2000-Datenbank

12 Unterrichtseinheit 7: Erstellen und Verwalten von Indizes

Die gespeicherte Systemprozedur „sp_help tablename“Sie können auch die gespeicherte Systemprozedur sp_help tablename aus-führen, um Informationen zu Indizes sowie weitere Tabelleninformationen abzurufen.

Methodischer Hinweis Erläutern Sie das Ergebnis der Abfrage sp_helptablename, indem Sie die folgende Anweisung aus-führen:

USE Northwind EXEC sp_help Customers

Weisen Sie auf die zusätz-lichen Tabelleninforma-tionen hin.

Page 361: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 7: Erstellen und Verwalten von Indizes 13

���� Arbeiten mit den CREATE INDEX-Optionen

� Verwenden der Option FILLFACTOR

� Verwenden der Option PAD_INDEX

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

SQL Server bietet CREATE INDEX-Optionen, die die Indexerstellung beschleunigen und auch die Leistung eines Indexes langfristig verbessern können.

ThemaGeben Sie eine kurze Über-sicht über einige der CREATE INDEX-Optionen.

EinstiegSQL Server bietet CREATE INDEX-Optionen, die die Indexerstellung beschleu-nigen und auch die Leistung eines Indexes langfristig verbessern können.

Page 362: Programmieren Einer Microsoft SQL Server 2000-Datenbank

14 Unterrichtseinheit 7: Erstellen und Verwalten von Indizes

Verwenden der Option FILLFACTOR

� Gibt an, zu welchem Prozentsatz Seiten gefüllt werden� Wirkt sich auf Seiten auf Blattebene aus

Gefüllte SeitenConFunkWhiteRudd

...

...

...

...

470401470402470403470501

White ... 470502Barr ... 470503

AkhtarFunkSmithMartinSmith

...

...

...

...

...

470601470602470603470604470701

Ota ... 470702

MartinPhuaJonesSmithGanio

...

...

...

...

...

470801470802470803470804470901

Jones ... 470902

Fillfactor 50 = Blattseite zu 50% gefülltConFunkWhite

...

...

...

470401470402470403

RuddWhiteBarr

...

...

...

470501470502470503

AkhtarFunkSmith

...

...

...

470601470402470603

MartinSmithOta

...

...

...

470604470701470702

MartinPhuaJones

...

...

...

470801470802470803

SmithGanioWhite

...

...

...

470804470901470902

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Sie können die Option FILLFACTOR verwenden, um die Leistung von INSERT- und UPDATE-Anweisungen für Tabellen zu optimieren, die gruppierte oder nicht gruppierte Indizes enthalten.

Wenn eine Indexseite vollständig gefüllt wurde, benötigt SQL Server etwas Zeit, um die Seite aufzuteilen und so für neue Zeilen Platz zu schaffen. Verwen-den Sie die Option FILLFACTOR, um einen bestimmten Prozentsatz freien Speicherplatz für die Indexseiten der Blattebene zu reservieren und damit die Anzahl von Seitenteilungen zu reduzieren.

Die Option FILLFACTOR wird nur beim Erstellen bzw. erneuten Erstellen eines Index angewendet. Der jeweils angegebene Prozentsatz des für die Indexseiten reservierten Speicherplatzes wird von SQL Server nicht dyna-misch verwaltet.

Der für eine Tabelle zu definierende Füllfaktorwert ist davon abhängig, wie häufig die Daten (mittels INSERT- und UPDATE-Anweisungen) geändert wer-den und wie Ihre Organisationsumgebung jeweils konfiguriert ist. Generell gelten folgende Richtlinien:

� Definieren Sie für OLTP-Umgebungen (Online Transaction Processing) einen niedrigen Füllfaktorwert.

� Verwenden Sie für SQL Server Analysis Services-Umgebungen einen hohen Füllfaktorwert.

ThemaErläutern Sie, wann und wie die FILLFACTOR-Optionen verwendet werden, um die Leistung zu verbessern.

EinstiegSie können die Option FILLFACTOR verwenden, um die Leistung von INSERT- und UPDATE-Anweisungen für Tabellen zu optimieren, die über gruppierte oder nicht gruppierte Indizes verfügen.

Anmerkung

Page 363: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 7: Erstellen und Verwalten von Indizes 15

In der folgenden Tabelle sind die Einstellungen der Option FILLFACTOR auf-geführt sowie die Umgebungen, für die diese Füllfaktorwerte üblicherweise verwendet werden.

FILLFACTOR-Prozentsatz

Seiten auf Blattebene

Seiten auf Nicht-Blattebene

Änderungen, die die Schlüssel-werte betreffen Typische Arbeitsumgebung

0 (Standard) Vollständig füllen

Platz lassen für einen Indexeintrag

Keine bis gering-fügige Änderungen

Analysis Services

1-99 Bis zum ange-gebenen Prozentsatz füllen

Platz lassen für einen Indexeintrag

Kleine bis umfang-reiche Änderungen

Gemischt oder OLTP

100 Vollständig füllen

Platz lassen für einen Indexeintrag

Keine bis gering-fügige Änderungen

Analysis Services

Berücksichtigen Sie beim Verwenden der Option FILLFACTOR die folgenden Aspekte und Richtlinien:

� Es kann ein Füllfaktorwert von 1 bis 100 Prozent definiert werden. � Der Standardfüllfaktorwert ist 0. Dieser Wert sorgt dafür, dass die Index-

seiten der Blattebene zu 100 Prozent gefüllt werden und dass in den Index-seiten der Nicht-Blattebene Platz für die maximale Größe von einem Index-eintrag freigelassen wird. Sie können nicht explizit fillfactor = 0 angeben.

� Der Standardfüllfaktorwert kann auf Serverebene mit Hilfe der gespeicher-ten Systemprozedur sp_configure geändert werden.

� In der sysindexes-Systemtabelle werden der jeweils zuletzt angewendete Füllfaktorwert zusammen mit anderen Indexinformationen gespeichert.

� Der Füllfaktorwert wird als Prozentsatz angegeben. Der Prozentsatz be-stimmt, wie weit die Seiten der Blattebene gefüllt werden sollen. Mit einem Füllfaktor von 65 Prozent wird beispielsweise festgelegt, dass die Seiten der Blattebene zu 65 Prozent gefüllt werden, wobei 35 Prozent des Speicher-platzes der Seite für neue Zeilen zur Verfügung stehen. Wie viele Zeilen der angegebene Füllfaktorprozentsatz jeweils pro Seite zulässt, ist von der Zeilenlänge abhängig.

� Verwenden Sie die Option FILLFACTOR, wenn in Tabellen viele Zeilen eingefügt werden oder die Schlüsselwerte gruppierter Indizes häufig geän-dert werden.

Page 364: Programmieren Einer Microsoft SQL Server 2000-Datenbank

16 Unterrichtseinheit 7: Erstellen und Verwalten von Indizes

Verwenden der Option PAD_INDEX

� Die Option PAD_INDEX gilt für Indexseiten der Nicht-Blattebene

� Ist PAD_INDEX nicht angegeben, wird auf Seiten derNicht-Blattebene standardmäßig eine Zeile freigelassen

� Die Anzahl der Zeilen auf Seiten der Nicht-Blattebene istnie kleiner als zwei

� PAD_INDEX verwendet den Füllfaktorwert

USE NorthwindCREATE INDEX OrderID_ind

ON Orders(OrderID)WITH PAD_INDEX, FILLFACTOR=70

USE NorthwindCREATE INDEX OrderID_ind

ON Orders(OrderID)WITH PAD_INDEX, FILLFACTOR=70

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Mit der Option PAD_INDEX wird der Prozentsatz angegeben, bis zu dem die Indexseiten der Nicht-Blattebene gefüllt werden können. Die Option PAD_INDEX kann nur verwendet werden, wenn FILLFACTOR angegeben wurde, da der Wert für den PAD_INDEX-Prozentsatz von dem für FILLFACTOR angegebenen Prozentsatz abhängig ist.

Die folgende Tabelle zeigt, wie sich die Einstellungen der Option FILLFACTOR auswirken, wenn Sie die Option PAD_INDEX verwenden. Außerdem ist aufgeführt, in welcher Umgebung PAD_INDEX-Werte normalerweise verwendet werden.

FILLFACTOR-Prozentsatz

Seiten auf Blattebene

Seiten auf Nicht-Blattebene

Änderungen, die die Schlüssel-werte betreffen Typische Arbeitsumgebung

1-99 Bis zum ange-gebenen Prozentsatz füllen

Bis zum angegebenen Prozentsatz füllen

Kleine bis umfang-reiche Änderungen

OLTP

Berücksichtigen Sie bei der Verwendung der Option PAD_INDEX die fol-genden Aspekte:

� SQL Server wendet den mit der Option FILLFACTOR angegebenen Prozentsatz auf die Seiten der Blattebene und der Nicht-Blattebene an.

� Standardmäßig sorgt SQL Server dafür, dass unabhängig von der Höhe des Füllfaktorwertes für jede Seite der Nicht-Blattebene ausreichend Platz für mindestens eine Zeile der maximalen Indexgröße übrig bleibt.

� Die Indexseite auf Nicht-Blattebene enthält immer mindestens zwei Ein-träge, unabhängig davon, wie gering der Füllfaktorwert ist.

� PAD_INDEX verwendet den Füllfaktorwert.

ThemaErläutern Sie, wie die Option PAD_INDEX verwendet wird.

EinstiegSie können die Option PAD_INDEX zusammen mit der Option FILLFACTOR verwenden, um die Leistung zu optimieren, wenn Sie einen Index erstellen oder neu erstellen.

Methodischer Hinweis Weisen Sie die Kursteilneh-mer darauf hin, dass die Option PAD_INDEX selten verwendet wird. Ein Großteil des Leistungsgewinns wird erreicht, indem die Option FILLFACTOR in geeigneter Weise verwendet wird.

Page 365: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 7: Erstellen und Verwalten von Indizes 17

In diesem Beispiel wird der Index OrderID_ind für die OrdersID-Spalte der Orders-Tabelle erstellt. Da die Option PAD_INDEX mit der Option FILLFACTOR angegeben wird, werden die von SQL Server erstellten Seiten der Blattebene und der Nicht-Blattebene zu 70 Prozent gefüllt. Wenn Sie die Option PAD_INDEX jedoch nicht verwenden, werden die Seiten der Blatt-ebene zu 70 Prozent und die Seiten der Nicht-Blattebene beinahe vollständig gefüllt.

USE Northwind CREATE INDEX OrderID_ind ON Orders(OrderID) WITH PAD_INDEX, FILLFACTOR=70

Beispiel

Page 366: Programmieren Einer Microsoft SQL Server 2000-Datenbank

18 Unterrichtseinheit 7: Erstellen und Verwalten von Indizes

���� Verwalten von Indizes

� Datenfragmentierung

� DBCC SHOWCONTIG-Anweisung

� DBCC INDEXDEFRAG-Anweisung

� Option DROP_EXISTING

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Um eine optimale Leistung sicherzustellen, müssen Sie erstellte Indizes verwal-ten. Im Laufe der Zeit werden die Daten fragmentiert. Daher müssen Sie die Fragmentierung der Daten entsprechend den Anforderungen Ihrer Organisa-tionsumgebung verwalten.

SQL Server verfügt über einen Indexoptimierungs-Assistenten, der die Ver-wendung Ihrer Indizes automatisch nachverfolgt und beim Verwenden und Erstellen von Indizes mit optimaler Leistung hilfreich ist.

Sie können auch verschiedene Optionen und Tools verwenden, die beim er-neuten Erstellen von Indizes und beim Überprüfen der Indexoptimierung hilfreich sind.

ThemaGeben Sie eine kurze Über-sicht über einige Verwal-tungstools.

EinstiegUm eine optimale Leistung sicherzustellen, müssen Sie erstellte Indizes verwalten.

Page 367: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 7: Erstellen und Verwalten von Indizes 19

Datenfragmentierung

� Ursachen der Fragmentierung� SQL Server organisiert Indexseiten neu, wenn Daten geändert

werden� Die Neuanordnung bewirkt, dass Indexseiten geteilt werden

� Möglichkeiten zum Verwalten der Fragmentierung� Löschen und erneutes Erstellen des Indexes unter Angabe

eines Füllfaktorwertes � Erneutes Erstellen des Indexes unter Angabe eines

Füllfaktorwertes

� Geschäftsumgebung� In einer OLTP-Umgebung kann sich die Fragmentierung

positiv auswirken� In einer Analysis Services-Umgebung kann sich die

Fragmentierung nachteilig auswirken

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Entsprechend den Anforderungen Ihrer Geschäftsumgebung kann sich eine Fragmentierung sowohl positiv als auch negativ auf die Systemleistung aus-wirken.

Ursachen der Fragmentierung Eine Fragmentierung wird durchgeführt, wenn Daten geändert werden. Wenn beispielsweise zu einer Tabelle neue Zeilen hinzugefügt oder vorhandene ge-löscht werden oder wenn Werte in indizierten Spalten geändert werden, passt SQL Server die Indexseiten an, sodass die Änderungen integriert und die indi-zierten Daten entsprechend gespeichert werden können. Die Anpassung der Indexseiten wird als Seitenteilung bezeichnet. Durch den Teilungsvorgang vergrößert sich eine Tabelle, und die für das Verarbeiten von Abfragen be-nötigte Zeit erhöht sich.

Möglichkeiten zum Verwalten der Fragmentierung SQL Server bietet zwei Möglichkeiten, die Fragmentierung zu verwalten. Die erste Möglichkeit besteht darin, einen gruppierten Index zu löschen, anschlie-ßend neu zu erstellen und mit Hilfe der Option FILLFACTOR einen Füllfaktor-wert anzugeben. Die zweite Möglichkeit besteht darin, einen Index neu zu er-stellen und einen Füllfaktorwert anzugeben.

GeschäftsumgebungWelcher Grad der Fragmentierung für Ihre Datenbanken noch akzeptabel ist, hängt jeweils von Ihrer Arbeitsumgebung ab:

� In einer OLTP-Umgebung kann sich die Fragmentierung positiv auswirken, da es sich hierbei um eine schreibintensive Umgebung handelt. Ein typisches OLTP-System weist eine große Anzahl gleichzeitiger Benutzer auf, die Daten aktiv hinzufügen und bearbeiten.

� In einer Analysis Services-Umgebung kann sich die Fragmentierung nach-teilig auswirken, da es sich hierbei um eine leseintensive Umgebung handelt.

ThemaErläutern Sie, wie die Datenfragmentierung zu-stande kommt, und nennen Sie Möglichkeiten zum Verwalten der Datenfrag-mentierung.

EinstiegMit der Zeit findet eine Frag-mentierung der Daten statt, da die Tabellen immer wie-der geändert werden. Entsprechend den Anforde-rungen Ihrer Geschäftsum-gebung haben Sie verschie-dene Möglichkeiten, die Fragmentierung zu ver-walten.

Page 368: Programmieren Einer Microsoft SQL Server 2000-Datenbank

20 Unterrichtseinheit 7: Erstellen und Verwalten von Indizes

DBCC SHOWCONTIG-Anweisung

� Ergebnisse der DBCC SHOWCONTIG-Anweisung � Feststellen, ob eine Tabelle oder ein Index stark

fragmentiert ist� Feststellen, ob Daten- oder Indexseiten voll sind

� Wann die Ausführung erfolgen sollte� Wenn Tabellen in größerem Umfang geändert wurden� Wenn Tabellen importierte Daten enthalten� Wenn Tabellen im Verdacht stehen, eine schlechte

Abfrageleistung zu verursachen

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Die DBCC SHOWCONTIG-Anweisung zeigt Fragmentierungsinformationen zu den Daten und Indizes einer angegebenen Tabelle an.

Ergebnisse der DBCC SHOWCONTIG-Anweisung Wenn Sie die DBCC SHOWCONTIG-Anweisung ausführen, untersucht SQL Server die Indexseiten auf der Blattebene, um zu ermitteln, ob eine Tabelle oder ein angegebener Index stark fragmentiert ist. Mit Hilfe der DBCC SHOWCONTIG-Anweisung wird ebenfalls ermittelt, ob die Daten- und Index-seiten gefüllt sind.

Wann die Ausführung erfolgen sollte Führen Sie die DBCC SHOWCONTIG-Anweisung für Tabellen aus, die in größerem Umfang geändert wurden, die importierte Daten enthalten, oder die im Verdacht stehen, eine schlechte Abfrageleistung zu verursachen. Berück-sichtigen Sie beim Ausführen der DBCC SHOWCONTIG-Anweisung die folgenden Aspekte und Richtlinien:

� Wenn Sie die DBCC SHOWCONTIG-Anweisung ausführen, ist es unter SQL Server erforderlich, entweder auf eine Tabellen-ID oder auf eine Index-ID zu verweisen. Führen Sie eine Abfrage der sysindexes-Tabelle durch, um die Tabellen- oder Index-ID zu ermitteln.

� Ermitteln Sie, wie häufig die DBCC SHOWCONTIG-Anweisung ausge-führt werden sollte. Ermitteln Sie hierzu auf täglicher, wöchentlicher oder monatlicher Basis das Aktivitätsniveau für eine Tabelle.

ThemaErläutern Sie die Verwendung der DBCC SHOWCONTIG-Anweisung.

EinstiegWenn Sie sich über die Fragmentierung Ihrer Daten informieren möchten, führen Sie die DBCC SHOWCONTIG-Anweisung aus, um zu ermitteln, ob Ihre Tabelle oder Ihre Indizes fragmentiert sind.

Methodischer Hinweis Führen Sie die DBCC SHOWCONTIG-Anweisung für eine Tabelle in der ClassNorthwind-Daten-bank vor, und besprechen Sie das Ergebnis, ohne dabei auf Details einzu-gehen.

Methodischer Hinweis Führen Sie eine der beiden Möglichkeiten vor, die Tabellen-ID einer Tabelle zu ermitteln. Eine Möglichkeit besteht darin, die Funktion OBJECT_ID zu verwenden. Alternativ kann die sysindexes-Systemtabelle der ClassNorthwind-Datenbank abgefragt werden.

Page 369: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 7: Erstellen und Verwalten von Indizes 21

In der folgenden Tabelle werden die Statistiken beschrieben, die von der DBCC SHOWCONTIG-Anweisung zurückgegeben werden.

Statistik Beschreibung

Gescannte Seiten Anzahl der Seiten in der Tabelle oder im Index.

Gescannte Blöcke Anzahl der Blöcke in der Tabelle oder im Index.

Blockwechsel Die Häufigkeit, mit der die DBCC-Anweisung beim Durchsuchen der Seiten eines Blocks diesen Block verlassen hat.

Seiten pro Block (Durchschnitt)

Die Anzahl der Seiten pro Block in der Seitenkette.

Scandichte [Bester Wert: Tatsächlicher Wert]

Der Wert für die Scandichte ist 100 (Prozentsatz), wenn die Daten fortlaufend gespeichert sind; bei einem Wert unter 100 liegt eine Fragmentierung vor. Der beste Wert ist die ideale Anzahl Blockwechsel, die dann stattfinden, wenn sämtliche Daten fortlaufend verknüpft sind. Der tatsächliche Wert gibt die tatsächliche Anzahl der Blockwechsel an.

Logische Scan-fragmentierung

Prozentsatz der Seiten, die beim Scannen der Blattseiten eines Index nicht korrekt einsortiert waren. Diese Zahl ist für Heaps und Textindizes nicht von Bedeutung. Für eine Seite, die beim Scannen der Blattseiten eines Index nicht korrekt einsortiert war, ist die nächste in einer IAM (Index Allocation Map) angegebene Seite nicht die, auf die mit dem Verweis „Nächste Seite“ auf der Blattseite verwiesen wird.

Blockscanfragmentierung Prozentsatz der Blöcke, die beim Scannen der Blattseiten eines Index nicht korrekt einsortiert waren. Diese Zahl ist für Heaps nicht relevant. Für einen Block, der beim Scannen der Blattseiten eines Index nicht korrekt ein-sortiert war, ist der Block, der die aktuellen Seite eines Indexes enthält, nicht der nächste physische Block nach dem Block, der die vorherige Seite eines Indexes enthält.

Byte frei pro Seite (Durchschnitt)

Die durchschnittliche Anzahl freier Bytes auf den durch-suchten Seiten. Je größer der Wert ist, desto weniger sind die Seiten gefüllt - niedrige Werte sind daher besser. Beachten Sie jedoch, dass dieser Wert ebenfalls von der Zeilenlänge beeinflusst wird. Lange Zeilen können zu einem höheren Wert führen.

Mittlere Seitendichte (voll) Dieser Wert gibt über den Füllungsgrad einer Seite Aus-kunft. Da hierbei die Zeilenlänge berücksichtigt wird, lässt sich der Füllungsgrad einer Seite anhand dieses Wertes genauer ablesen. Höhere Prozentsätze sind günstiger als niedrige Prozentsätze.

Page 370: Programmieren Einer Microsoft SQL Server 2000-Datenbank

22 Unterrichtseinheit 7: Erstellen und Verwalten von Indizes

DBCC SHOWCONTIG [({table_name | table_id | view_name | view_id } [, index_name | index_id ] )] [ WITH { ALL_INDEXES | FAST [, ALL_INDEXES ] | TABLERESULTS [, { ALL_INDEXES } ] [, { FAST | ALL_LEVELS } ] } ]

In diesem Beispiel wird eine Anweisung ausgeführt, mit der auf die Customers-Tabelle zugegriffen wird.

USE Northwind DBCC SHOWCONTIG (Customers, PK_Customers)

DBCC SHOWCONTIG scannt 'Customers'-Tabelle... Tabelle: 'Customers' (2073058421); Index-ID: 1, Datenbank-ID: 6 Scan auf Ebene TABLE durchgeführt. Gescannte Seiten: 3 Gescannte Blöcke: 2 Blockwechsel: 1 Seiten pro Block (Durchschnitt): 1.5 Scandichte [Bester Wert:Tatsächlicher Wert]:

50.00% [1:2]

Logische Scanfragmentierung 0.00% Blockscanfragmentierung: 50.00% Byte frei pro Seite (Durchschnitt): 246.7 Mittlere Seitendichte (voll): 96.95% DBCC-Ausführung abgeschlossen. Falls DBCC Fehlermeldungen ausgegeben hat, wenden Sie sich bitte an den System-admistrator.

Syntax

Beispiel

Ergebnis

Methodischer Hinweis Stellen Sie fest, ob diese Er-gebnisse für eine bestimmte Arbeitsumgebung als ge-eignet zu beurteilen sind.

Page 371: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 7: Erstellen und Verwalten von Indizes 23

DBCC INDEXDEFRAG-Anweisung

� Verwenden der DBCC INDEXDEFRAG-Anweisung

� Defragmentieren der Blattebene eines Indexes

� Anordnen der Seiten auf Blattebene, sodass die physische Reihenfolge der Seiten einer logischenReihenfolge von links nach rechts entspricht

� Verbessern der Scanleistung für die Indizes

� Defragmentieren oder erneutes Erstellen von Indizes

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Wenn sich die Daten in einer Tabelle ändern, werden die Indizes der Tabelle manchmal fragmentiert. Mit der DBCC INDEXDEFRAG-Anweisung kann die Blattebene von gruppierten und nicht gruppierten Indizes für Tabellen und Sichten defragmentiert werden. Beim Defragmentieren werden die Seiten so angeordnet, dass die physische Reihenfolge der Seiten der logischen Reihen-folge der Blattknoten von links nach rechts entspricht. Mit dieser Neuordnung wird die Scanleistung für die Indizes verbessert.

Verwenden der DBCC INDEXDEFRAG-Anweisung Wenn Sie die DBCC INDEXDEFRAG-Anweisung verwenden, tritt Folgendes ein:

� Die Seiten eines Indexes werden unter Berücksichtigung des beim Erstellen des Index angegebenen FILLFACTOR-Wertes komprimiert. Alle leeren Seiten, die durch diese Komprimierung erstellt wurden, werden entfernt.

� Wenn sich ein Index über mehr als eine Datei erstreckt, werden die Dateien nacheinander defragmentiert. Seiten werden nicht zwischen Dateien ver-schoben.

� Dem Benutzer wird ein Schätzwert in Prozent betreffend den Fortschritt der Defragmentierung angezeigt. Diese Meldung erfolgt alle 5 Minuten. Die Ausführung der DBCC INDEXDEFRAG-Anweisung kann jederzeit be-endet werden, wobei bis zu diesem Punkt fertig gestellte Teile beibehalten werden.

� Es handelt sich um einen Onlinevorgang. Sperren werden nicht für längere Zeit aufrechterhalten, und laufende Abfragen oder Aktualisierungen werden nicht blockiert. Die Defragmentierung wird immer vollständig protokolliert, ungeachtet der Einstellung für das Datenbank-Wiederherstellungsmodell.

ThemaErläutern Sie die Verwendung der DBCC INDEXDEFRAG-Anwei-sung.

EinstiegMit der DBCC INDEXDEFRAG-Anweisung kann die Blattebene von gruppierten und nicht gruppierten Indizes für Tabellen und Sichten defragmentiert werden.

Page 372: Programmieren Einer Microsoft SQL Server 2000-Datenbank

24 Unterrichtseinheit 7: Erstellen und Verwalten von Indizes

Defragmentieren oder erneutes Erstellen von Indizes Die für eine Defragmentierung benötigte Zeit ist abhängig vom Grad der Frag-mentierung. Bei einem hochgradig fragmentierten Index dauert die Defragmen-tierung möglicherweise länger als die Neuerstellung. Die Defragmentierung eines geringfügig fragmentierten Indexes wird schneller ausgeführt als das er-neute Erstellen eines Indexes.

Mit Hilfe der DBCC INDEXDEFRAG-Anweisung kann die Leis-tung nicht verbessert werden, wenn Indizes physisch auf der Festplatte defrag-mentiert werden. Wenn ein Index physisch defragmentiert werden soll, müssen Sie den Index neu erstellen.

DBCC INDEXDEFRAG ( { database_name | database_id | 0 } , { table_name | table_id | 'view_name' | view_id } , { index_name | index_id } ) [ WITH NO_INFOMSGS ]

In diesem Beispiel wird die DBCC INDEXDEFRAG-Anweisung für den Index mem_no_CL der Member-Tabelle in der credit-Datenbank ausgeführt.

DBCC INDEXDEFRAG(credit, member, mem_no_CL)

Pages scanned Pages moved Pages removed

150 28 9

(1 row(s) affected)

Anmerkung

Syntax

Beispiel

Ergebnis

Page 373: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 7: Erstellen und Verwalten von Indizes 25

Option DROP_EXISTING

CREATE UNIQUE NONCLUSTERED INDEX U_OrdID_ProdIDON [Order Details] (OrderID, ProductID)WITH DROP_EXISTING, FILLFACTOR=65

CREATE UNIQUE NONCLUSTERED INDEX U_OrdID_ProdIDON [Order Details] (OrderID, ProductID)WITH DROP_EXISTING, FILLFACTOR=65

� Erneutes Erstellen eines Indexes� Die Seiten der Blattebene werden neu organisiert� Die Fragmentierung wird entfernt� Die Indexstatistiken werden erneut berechnet

� Ändern der Indexeigenschaften� Typ� Indexspalten� Optionen

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Mit Hilfe der Option DROP_EXISTING können Sie die Eigenschaften eines Indexes ändern oder Indizes neu erstellen, ohne dass hierzu der Index gelöscht und anschließend neu erstellt werden muss. Die Option DROP_EXISTING hat den Vorteil, dass damit Indizes geändert werden können, die mit PRIMARY KEY- oder UNIQUE-Einschränkungen erstellt wurden.

Erneutes Erstellen eines Indexes Führen Sie die CREATE INDEX-Anweisung mit der Option DROP_EXISTING aus, um einen benannten gruppierten oder nicht gruppierten Index neu zu erstellen:

� Die Seiten der Blattebene werden neu organisiert, indem Zeilen kom-primiert oder erweitert werden.

� Die Fragmentierung wird entfernt. � Die Indexstatistiken werden erneut berechnet.

Ändern der Indexeigenschaften Mit Hilfe der Option DROP_EXISTING können die folgenden Indexeigen-schaften geändert werden:

� Typ

• Sie können einen nicht gruppierten Index in einen gruppierten Index ändern.

• Ein gruppierter Index kann jedoch nicht in einen nicht gruppierten Index geändert werden.

ThemaErläutern Sie, wie die Option DROP_EXISTING verwen-det wird, mit der die Index-definition geändert oder Indizes neu erstellt werden können.

EinstiegVerwenden Sie die Option DROP_EXISTING, um die Indexdefinition zu ändern oder Indizes neu zu er-stellen.

Weitere Informationen Sprechen Sie nicht über die DBCC DBREINDEX-Anweisung.DROP_EXISTING stellt mehr Funktionalität bereit. Der einzige Vorteil der DBCC DBREINDEX-Anweisung besteht darin, dass mehrere Indizes gleichzeitig neu erstellt werden können.

Page 374: Programmieren Einer Microsoft SQL Server 2000-Datenbank

26 Unterrichtseinheit 7: Erstellen und Verwalten von Indizes

� Indexspalten

• Sie können die Indexdefinition ändern, um andere Spalten anzugeben.

• Sie können in einem zusammengesetzten Index zusätzliche Spalten angeben oder angegebene Spalten daraus entfernen.

• Sie können die Indexspalten in eindeutige oder nicht eindeutige Spalten ändern.

� Optionen

• Sie können den für die Optionen FILLFACTOR und PAD_INDEX fest-gelegten Prozentsatz ändern.

Berücksichtigen Sie die folgenden Aspekte und Richtlinien, wenn Sie die Option DROP_EXISTING verwenden:

� Bei Verwendung eines gruppierten Indexes erfordert SQL Server die Freigabe des 1,2-fachen Tabellenspeicherplatzes, um die Daten physisch neu organisieren zu können.

� Die Option DROP_EXISTING beschleunigt die Erstellung gruppierter und nicht gruppierter Indizes, da das Sortierverfahren nicht durchgeführt wird.

� Verwenden Sie zusammen mit der Option DROP_EXISTING die Option FILLFACTOR, wenn Sie möchten, dass die Seiten der Blattebene bis zu einem bestimmten Prozentsatz gefüllt werden. Dies kann sehr nützlich sein, wenn Speicherplatz für neue Daten reserviert oder der Index komprimiert werden muss.

� Für Systemtabellen können Sie keine Indizes neu erstellen. � Wenn Sie die Option DROP_EXISTING bei einem gruppierten Index ver-

wenden, vermeiden Sie unnötige Arbeiten wie das Löschen und erneute Erstellen von nicht gruppierten Indizes, wenn der gruppierte Index für die gleiche Spalte neu erstellt wird.

� Die nicht gruppierten Indizes werden einmal neu erstellt, dies aber nur dann, wenn die Schlüssel unterschiedlich sind.

In diesem Beispiel wird der vorhandene Index U_OrdID_ProdID der OrderDetails-Tabelle neu erstellt. Der Index wird als ein gruppierter zusammen-gesetzter Index mit einer angegebenen Option neu definiert. Mit dieser Option werden sämtliche Datenseiten zu 65 Prozent gefüllt. Beachten Sie, dass bei der Anweisung ein Fehler auftritt, wenn für die Order Details-Tabelle bereits ein gruppierter Index vorhanden ist.

CREATE UNIQUE NONCLUSTERED INDEX U_OrdID_ProdID ON [Order Details] (OrderID, ProductID) WITH DROP_EXISTING, FILLFACTOR=65

Beispiel

Page 375: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 7: Erstellen und Verwalten von Indizes 27

Übungseinheit A: Erstellen und Verwalten von Indizes

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

LernzieleAm Ende dieser Übungseinheit werden Sie in der Lage sein, die folgenden Aufgaben auszuführen:

� Erstellen von Indizes. � Ermitteln der Größe und Dichte von Indizes.

VoraussetzungenUm diese Übungseinheit zu bearbeiten, benötigen Sie Folgendes:

� Die Skriptdateien für diese Übungseinheit, die sich in C:\Moc\2328A\Labfiles\L07 befinden.

� Die Antwortdateien für diese Übungseinheit, die sich in C:\Moc\2328A\Labfiles\L07\Answers befinden.

Einrichten der ÜbungseinheitUm diese Übungseinheit zu bearbeiten, ist eine der folgenden Aktionen erforderlich:

� Bearbeiten der vorherigen Übungseinheit. � Ausführen der Batchdatei C:\Moc\2328A\Batches\Restore07A.cmd.

Mit dieser Befehlsdatei wird die ClassNorthwind-Datenbank wieder in den Zustand zurückversetzt, der für diese Übungseinheit erforderlich ist.

Weitere Informationen Sollten Sie beim Ausführen von Dateien Hilfe benötigen, suchen Sie in der Hilfe von SQL Query Analyzer nach „Ausführen einer Abfrage“.

ThemaGeben Sie eine Einführung in die Übungseinheit.

EinstiegIn dieser Übungseinheit erstellen Sie Indizes und ermitteln die Größe und Dichte von Indizes.

Erläutern Sie die Lernziele der Übungseinheit.

Page 376: Programmieren Einer Microsoft SQL Server 2000-Datenbank

28 Unterrichtseinheit 7: Erstellen und Verwalten von Indizes

Daneben sind die folgenden Informationsquellen verfügbar:

� Das Northwind-Datenbankschema. � Das credit-Datenbankschema. � Die Microsoft SQL Server-Onlinedokumentation.

SzenarioDer Aufbau des Schulungsraumes soll die Organisation des weltweit agieren-den Handelsunternehmens Northwind Traders widerspiegeln. Das Unternehmen hat den fiktiven Domänennamen nwtraders.msft. Der primäre DNS-Server für nwtraders.msft ist der Kursleitercomputer, dessen IP-Adresse (Internetproto-koll) 192.168.x.200 lautet (wobei x die zugewiesene Schulungsraumnummer ist). Der Name des Kursleitercomputers ist London.

Die folgende Tabelle stellt den Benutzernamen, den Computernamen und die IP-Adresse für jeden Kursteilnehmercomputer in der fiktiven Domäne nwtraders.msft bereit. Suchen Sie den Ihrem Computer zugewiesenen Benutzernamen und notieren Sie ihn.

Benutzername Computername IP-Adresse

SQLAdmin1 Vancouver 192.168.x.1

SQLAdmin2 Denver 192.168.x.2

SQLAdmin3 Perth 192.168.x.3

SQLAdmin4 Brisbane 192.168.x.4

SQLAdmin5 Lisbon 192.168.x.5

SQLAdmin6 Bonn 192.168.x.6

SQLAdmin7 Lima 192.168.x.7

SQLAdmin8 Santiago 192.168.x.8

SQLAdmin9 Bangalore 192.168.x.9

SQLAdmin10 Singapore 192.168.x.10

SQLAdmin11 Casablanca 192.168.x.11

SQLAdmin12 Tunis 192.168.x.12

SQLAdmin13 Acapulco 192.168.x.13

SQLAdmin14 Miami 192.168.x.14

SQLAdmin15 Auckland 192.168.x.15

SQLAdmin16 Suva 192.168.x.16

SQLAdmin17 Stockholm 192.168.x.17

SQLAdmin18 Moscow 192.168.x.18

SQLAdmin19 Caracas 192.168.x.19

SQLAdmin20 Montevideo 192.168.x.20

SQLAdmin21 Manila 192.168.x.21

SQLAdmin22 Tokyo 192.168.x.22

SQLAdmin23 Khartoum 192.168.x.23

SQLAdmin24 Nairobi 192.168.x.24

Veranschlagte Zeit für die Übungseinheit: 30 Minuten

Page 377: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 7: Erstellen und Verwalten von Indizes 29

Übung 1 Erstellen von Indizes

In dieser Übung erstellen Sie mehrere Indizes, die für einige Tabellen der ClassNorthwind-Datenbank FOREIGN KEY-Einschränkungen berück-sichtigen.

� So erstellen Sie einen Index für die Tabelle „Orders“ Mit diesem Verfahren öffnen Sie eine Skriptdatei, mit der ein Index erstellt werden soll, überprüfen deren Inhalt, führen das Skript aus und überprüfen anschließend, ob der Index erstellt wurde. 1. Melden Sie sich mit Hilfe der Informationen in der folgenden Tabelle an der

Schulungsraumdomäne nwtraders an.

Option Eingabe

Benutzername SQLAdminx (wobei x die Ihrem Computernamen zugewiesene Nummer ist, wie in der Schulungsraumdomäne nwtraders.msftfestgelegt)

Kennwort password

2. Öffnen Sie SQL Query Analyzer, und melden Sie sich gegebenenfalls mit Microsoft Windows-Authentifizierung am (lokalen) Server an. Sie sind berechtigt, sich an SQL Server anzumelden und SQL Server zu verwalten, da Sie als SQLAdminx angemeldet und damit Mitglied der lokalen Administratorgruppe von Windows 2000 sind. Alle Mitglieder dieser Gruppe werden automatisch der sysadmin-Rolle von SQL Server zugeordnet.

3. Klicken Sie in der Liste DB auf ClassNorthwind.4. Öffnen Sie die Skriptdatei C:\Moc\2328A\Labfiles\L07\CreaIndx1.sql.5. Überprüfen Sie die CREATE INDEX-Anweisung.

Mit diesem Skript wird ein nicht gruppierter Index mit Namen Orders_Customers_link für die CustomerID-Spalte in der Orders-Tabelle mit einem Füllfaktorwert von 75 erstellt.

6. Führen Sie die Skriptdatei aus. 7. Überprüfen Sie, ob der Index Orders_Customers_link erstellt wurde,

indem Sie die folgende Anweisung ausführen: EXEC sp_help Orders

Die Ausgabe der gespeicherten Systemprozedur sp_help zeigt, dass der nicht gruppierte Index Orders_Customer_link für die CustomerID-Spalte in der Orders-Tabelle vorhanden ist.

Page 378: Programmieren Einer Microsoft SQL Server 2000-Datenbank

30 Unterrichtseinheit 7: Erstellen und Verwalten von Indizes

� So erstellen Sie Indizes für Fremdschlüssel, die auf die Tabelle „Products“ verweisen

Mit diesem Verfahren erstellen Sie unter Verwendung der folgenden Informa-tionen gruppierte und nicht gruppierte Indizes für sämtliche Fremdschlüssel-verweise in der Products-Tabelle. Sie können hierzu entweder den Index-erstellungs-Assistenten von SQL Server Enterprise Manager verwenden oder in SQL Query Analyzer eine Transact-SQL-Anweisung schreiben. Ein vollständi-ges Skript für dieses Verfahren finden Sie in C:\Moc\2328A\Labfiles\L07\Answers\CreaIndx2.sql.1. Stellen Sie sicher, dass Sie die ClassNorthwind-Datenbank verwenden. 2. Schreiben Sie ein Skript zur Erstellung der folgenden Indizes, und führen

Sie es aus.

Indextyp Name Tabelle Spalte Füllfaktorwert

Gruppiert Products_CategoryID_link Products CategoryID 0

Nicht gruppiert Products_SupplierID_link Products SupplierID 0

CREATE CLUSTERED INDEX Products_CategoryID_link ON Products(CategoryID)

CREATE NONCLUSTERED INDEX Products_SupplierID_link ON Products(SupplierID)

3. Führen Sie eine Abfrage der sysindexes-Systemtabelle durch, um zu über-prüfen, ob die Indizes erstellt wurden.

Page 379: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 7: Erstellen und Verwalten von Indizes 31

� So überprüfen Sie, ob die von Ihnen erstellten Indizes vorhanden sind In diesem Verfahren führen Sie verschiedene Anweisungen aus, mit denen Sie überprüfen, ob die von Ihnen erstellten Indizes vorhanden sind und korrekt arbeiten. 1. Führen Sie die gespeicherte Systemprozedur sp_helpindex für die Orders-

Tabelle aus. Wie sieht das Ergebnis aus? Orders_Customers_link. ____________________________________________________________

____________________________________________________________

2. Führen Sie die gespeicherte Systemprozedur sp_helpindex für die Products-Tabelle aus. Warum sind Indizes für die Fremdschlüsselspalten vorhanden? Ein Index für einen Fremdschlüssel ist zwar nicht zwingend erforder-lich, wird aber empfohlen, um eine Verbindung zwischen den Fremd-schlüsselelementen und dem Primärschlüssel herzustellen. ____________________________________________________________

____________________________________________________________

Weshalb ist keiner dieser Indizes eindeutig? Weil diese Indizes Fremdschlüssel beinhalten. Zwischen Primär- und Fremdschlüsseln besteht häufig eine 1:n-Beziehung. Daher kann sich ein eindeutiger Schlüsselwert im Primärschlüssel auf mehrere iden-tische Schlüsselwerte in der Fremdschlüsselspalte beziehen. ____________________________________________________________

____________________________________________________________

Page 380: Programmieren Einer Microsoft SQL Server 2000-Datenbank

32 Unterrichtseinheit 7: Erstellen und Verwalten von Indizes

Übung 2 Untersuchen von Indexstrukturen

In dieser Übung verwenden Sie SQL Query Analyzer, um vor dem Erstellen von Indizes die Tabellenstrukturen zu untersuchen. Sie erstellen verschiedene Arten von Indizes mit unterschiedlichen Füllfaktoren und beobachten die Auswirkungen auf die Tabellenstruktur.

Sie können Abschnitte der Skriptdatei ExamIndex.sql im Ordner C:\Moc\2328A\Labfiles\L07 öffnen, sichten und ausführen, oder Sie können die angegebenen Transact-SQL-Anweisungen eingeben und ausführen.

� So zeigen Sie die ursprüngliche Tabellenstruktur an In diesem Verfahren führen Sie eine Transact-SQL-Anweisung aus, um Infor-mationen über die Member-Tabelle abzurufen. 1. Geben Sie diese Anweisungen einzeln ein, und führen Sie sie einzeln aus,

um Informationen über die Member-Tabelle abzurufen: USE credit GOEXEC sp_spaceused member

SELECT * FROM sysindexes WHERE id = OBJECT_ID('member')

DBCC SHOWCONTIG ('member')

2. Zeichnen Sie die statistischen Daten in der folgenden Tabelle auf.

Informationen Quelle Ergebnis

Anzahl Zeilen sp_spaceused: rows 10.000

Anzahl Indizes SELECT * FROM sysindexes WHERE id = OBJECT_ID('member')

Zwei. Eine Zeile in „sysindexes“ mit einer 0 als Wert für indid steht für die Tabelle selbst.

Anzahl Seiten SHOWCONTIG: Gescannte Seiten 145

Anzahl Zeilen pro Seite Berechnen Sie die Ergebnisse, und runden Sie den Wert auf.

(Anzahl Zeilen / Anzahl Seiten) = Anzahl Zeilen pro Seite

69

Anzahl Blöcke SHOWCONTIG: Blockwechsel 18

Durchschnittl. Blockfüllung SHOWCONTIG: Seiten pro Block (Durchschnitt) 7.6

Durchschnittl. Seitenfüllung SHOWCONTIG: Mittlere Seitendichte (voll) 98.82%

Page 381: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 7: Erstellen und Verwalten von Indizes 33

� So erstellen Sie einen gruppierten Index In diesem Verfahren erstellen Sie einen eindeutigen gruppierten Index und beobachten die Änderungen an der Tabellenstruktur. Darüber hinaus rufen Sie auch Informationen über die Indexstruktur ab. 1. Geben Sie die nachstehende Anweisung ein, und führen Sie sie aus, um

einen eindeutigen gruppierten Index für die member_no-Spalte der Member-Tabelle ohne Angabe eines Füllfaktors zu erstellen: USE credit CREATE UNIQUE CLUSTERED INDEX mem_no_CL ON member (member_no)

2. Geben Sie die folgende Anweisung ein, und führen Sie sie aus, um Infor-mationen über die Member-Tabelle abzurufen: USE credit SELECT * FROM sysindexes WHERE id = OBJECT_ID('member')

DBCC SHOWCONTIG ('member')

3. Zeichnen Sie die statistischen Daten in der folgenden Tabelle auf.

Informationen Quelle Ergebnis

Anzahl gruppierter Indexseiten

sysindexes row: used 183

Anzahl Datenseiten im gruppierten Index

sysindexes row: dpages 145

Anzahl Nicht-Datenseiten im gruppierten Index

(used – dpages) 183 - 145 = 38

Anzahl Indizes SELECT * FROM sysindexes Drei. Eine Zeile in „sysindexes“ mit einer 1 als Wert für indid steht für den gruppierten Index.

Anzahl Seiten SHOWCONTIG: Gescannte Seiten 145

Anzahl Zeilen pro Seite Berechnen Sie die Ergebnisse, und runden Sie den Wert auf.

(Anzahl Zeilen / Anzahl Seiten) = Anzahl Zeilen pro Seite

69

Anzahl Blöcke SHOWCONTIG: Blockwechsel 18

Durchschnittl. Blockfüllung SHOWCONTIG: Seiten pro Block (Durchschnitt)

7.6

Durchschnittl. Seitenfüllung SHOWCONTIG: Mittlere Seitendichte (voll)

98.82%

Page 382: Programmieren Einer Microsoft SQL Server 2000-Datenbank

34 Unterrichtseinheit 7: Erstellen und Verwalten von Indizes

Sind die Seiten immer noch voll? Ja.____________________________________________________________

____________________________________________________________

Ist die Tabelle noch immer fortlaufend? Ja.____________________________________________________________

____________________________________________________________

Werden die Seiten mit dem Erstellen eines gruppierten Index immer kom-primiert? Begründung? Nein. Mit dem Erstellen eines gruppierten Index werden die Seiten nicht immer komprimiert. Dies ist abhängig von der Natur der Daten. Seiten können komprimiert werden, wenn die Tabelle aufgrund von Aktualisierungen des Schlüsselwertes oder aufgrund von unsortierten Einfügungen und Löschungen fragmentiert ist. Wenn die Seiten bereits komprimiert wurden, hat das Erstellen eines gruppierten Index keinerlei diesbezügliche Auswirkungen. ____________________________________________________________

____________________________________________________________

____________________________________________________________

� So erstellen Sie einen nicht gruppierten Index In diesem Verfahren erstellen Sie einen nicht gruppierten Index und rufen Infor-mationen über die Indexstruktur ab. 1. Geben Sie die folgende Anweisung ein, und führen Sie sie aus, um den im

Vorfeld erstellten Index zu löschen: USE credit EXEC index_cleanup member

2. Geben Sie die nachstehende Anweisung ein, und führen Sie sie aus, um einen nicht gruppierten Index für die firstname-Spalte der Member-Tabelle ohne Angabe eines Füllfaktors zu erstellen: USE credit CREATE NONCLUSTERED INDEX indx_fname ON member(firstname)

Page 383: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 7: Erstellen und Verwalten von Indizes 35

3. Geben Sie die nachstehende SELECT-Anweisung ein, und führen Sie sie aus, mit der die sysindexes-Zeilen für die Member-Tabelle abgerufen werden: USE credit SELECT * FROM sysindexes WHERE id = OBJECT_ID('member')

4. Zeichnen Sie die statistischen Daten in der folgenden Tabelle auf.

Informationen Quelle Ergebnis

Anzahl Seiten im nicht gruppierten Index für die firstname-Spalte

sysindexes: used 35

Anzahl Seiten auf der Blattebene sysindexes: dpages 33

Ungefähre Anzahl Zeilen pro Blattseite (Anzahl Zeilen in Tabelle / Anzahl Seiten auf der Blattebene)

(10000 / 33) = 303

� So erstellen Sie einen nicht gruppierten Index mit einem Füllfaktor In diesem Verfahren erstellen Sie einen nicht gruppierten Index und beobachten die Änderungen an der Tabellenstruktur. 1. Geben Sie die folgende Anweisung ein, und führen Sie sie aus, um den nicht

gruppierten Index der Member-Tabelle zu löschen: USE credit EXEC index_cleanup member

2. Geben Sie die nachstehende Anweisung ein, und führen Sie sie aus, um dem gleichen Index mit einem Füllfaktor von 25 % zu erstellen: USE credit CREATE NONCLUSTERED INDEX indx_fname ON member(firstname) WITH FILLFACTOR=25

3. Geben Sie die nachstehende SELECT-Anweisung ein, und führen Sie sie aus, mit der die sysindexes-Zeilen für die Member-Tabelle abgerufen werden: USE credit SELECT * FROM sysindexes WHERE id = OBJECT_ID('member')

Page 384: Programmieren Einer Microsoft SQL Server 2000-Datenbank

36 Unterrichtseinheit 7: Erstellen und Verwalten von Indizes

4. Zeichnen Sie die statistischen Daten in der folgenden Tabelle auf.

Informationen Quelle Ergebnis

Anzahl Seiten in diesem Index sysindexes: used 132

Anzahl Seiten auf der Blattebene sysindexes: dpages 130

Ungefähre Anzahl Zeilen pro Blattseite (Anzahl Zeilen in Tabelle / Anzahl Seiten auf der Blattebene)

(10000 / 130) = 77

Ist der Größenanstieg auf Blattebene proportional zum Füllfaktor? Ja, der Anstieg ist proportional. _____________________________________________________________

Wie können Sie feststellen, ob der Größenanstieg auf der Blattebene pro-portional zum Größenfaktor von 25 % erfolgt ist? Bei Verwendung eines Füllfaktors von 0 (Standard) passen auf eine Blattseite 303 Zeilen. 303 multipliziert mit 25 Prozent ergibt ungefähr 77 Zeilen. Diese Anzahl Zeilen passt auf eine Blattseite, die nur zu 25 % gefüllt ist. ____________________________________________________________

____________________________________________________________

Page 385: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 7: Erstellen und Verwalten von Indizes 37

���� Einführung in die Arbeit mit Statistiken

� Sammeln von Statistiken

� Speichern von Statistiken

� Erstellen von Statistiken

� Aktualisieren von Statistiken

� Anzeigen von Statistiken

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Statistiken können für Indizes und Spalten erstellt werden. Da der Abfrage-optimierer Statistiken verwendet, um Abfragen zu optimieren, sollten Sie wissen, wo diese Daten gesammelt, gespeichert, erstellt, aktualisiert und angezeigt werden.

ThemaGeben Sie eine Übersicht über die Themen dieses Abschnitts.

EinstiegStatistiken können für Indizes und Spalten erstellt werden. Da der Abfrage-optimierer Statistiken ver-wendet, um Abfragen zu optimieren, sollten Sie wissen, wo diese Daten gesammelt, gespeichert, erstellt, aktualisiert und angezeigt werden.

Page 386: Programmieren Einer Microsoft SQL Server 2000-Datenbank

38 Unterrichtseinheit 7: Erstellen und Verwalten von Indizes

Sammeln von Statistiken

� Lesen von Spaltenwerten oder einer Stichprobe aus Spaltenwerten� Erzeugt eine gleichmäßig verteilte und sortierte Liste mit

Werten� Ausführen eines vollständigen Scans oder Erheben von

Stichproben aus Zeilen� Der Prozentsatz der Zeilen, aus denen Stichproben

genommen werden sollen, wird basierend auf der Anzahl der Zeilen in der Tabelle dynamisch ermittelt

� Auswählen von Stichproben� Aus der Tabelle oder dem kleinsten nicht gruppierten Index

der Spalten� Alle Zeilen der Datenseite werden verwendet, um die

statistischen Daten zu aktualisieren

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Statistiken sind eine Stichprobe aus Spaltenwerten.

Lesen von Spaltenwerten oder einer Stichprobe aus SpaltenwertenSQL Server sammelt Statistiken, indem eine Stichprobe aus den Spaltenwerten oder alle Spaltenwerte gelesen werden, um eine gleichmäßig verteilte und sortierte Liste mit Werten zu erstellen, die als Verteilungsschritte bezeichnetwerden. SQL Server erzeugt Verteilungsschritte mit Hilfe eines vollständigen Scans oder mit Hilfe eines Stichprobenscans, aus dem dann Stichproben ausgewählt werden.

Ausführen eines vollständigen Scans oder Erheben von Stichproben aus Zeilen SQL Server ermittelt basierend auf der Anzahl der Zeilen in der Tabelle dynamisch den Prozentsatz der Zeilen, aus denen Stichproben genommen werden sollen. Der Abfrageoptimierer führt beim Sammeln von Statistiken entweder einen vollständigen Scan durch oder nimmt Stichproben aus Zeilen.

� Die Option SAMPLE ist die Standardoption für das Aktualisieren und Erstellen von Statistiken.

� Die Option FULLSCAN wird in folgenden Fällen verwendet:

• Indizes werden erstellt.

• Die Option FULLSCAN ist in der CREATE STATISTICS-Anweisung angegeben.

• Die UPDATE STATISTICS-Anweisung wird ausgeführt.

ThemaErläutern Sie, wie SQL Server Statistiken sammelt.

EinstiegStatistiken sind eine Stich-probe aus Spaltenwerten.

Page 387: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 7: Erstellen und Verwalten von Indizes 39

Auswählen von Stichproben Die Stichprobe wird zufällig aus den Datenseiten der Tabelle oder aus dem kleinsten nicht gruppierten Index der Spalten ausgewählt, die für die Statistiken benötigt werden. Nachdem eine Datenseite vom Datenträger gelesen wurde, werden alle Zeilen auf der Datenseite verwendet, um die statistischen Daten zu aktualisieren.

Wenn der Abfrageoptimierer Stichproben sammelt, ist Folgendes zu berück-sichtigen:

� Die Tabellengröße bestimmt die zu wählende Methode. � Es wird die minimale Anzahl von Werten als Stichprobe genommen, mit der

sinnvolle Statistiken abgeleitet werden können. � Wenn die Anzahl der angegebenen Zeilen für ein aussagefähiges Ergebnis

zu gering ist, korrigiert der Abfrageoptimierer die Stichprobenerhebung automatisch basierend auf der Anzahl der in der Tabelle vorhandenen Zeilen.

� Statistiken werden lediglich für die erste in einem zusammengesetzten Index definierte Spalte beibehalten.

Page 388: Programmieren Einer Microsoft SQL Server 2000-Datenbank

40 Unterrichtseinheit 7: Erstellen und Verwalten von Indizes

Speichern von Statistiken Schritt

AL

CA

IL

IL

OR

TX

WA

WY

Sales ………

…………………………………………………………

…………………………………………………………

………

…………………………………………………………

…………………………………………………………

StatusStatusStatus

ALAKCACACACTILILILILIL

MTORORPATXTXWAWAWAWIWY

ALAKCACACACTILILILILIL

MTORORPATXTXWAWAWAWIWY

Schritt#0

1

2

3

4

5

6

7

statblobstatblobstatblob

ALCAILIL

ORTXWAWY

ALCAILIL

ORTXWAWY

………

……………………

……………………

………

……………………

……………………

sysindexes

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Statistiken werden in der statblob-Spalte der sysindexes-Systemtabelle gespeichert.

VerteilungsschritteJeder in der statblob-Spalte gespeicherte Wert wird als Verteilungsschritt be-zeichnet. Verteilungsschritte beziehen sich auf den Abstand zwischen den Stichprobendaten bzw. darauf, wie viele Zeilen übersprungen werden, bevor die nächste Stichprobe genommen und gespeichert wird. Die ersten und letzten Schlüsselwerte im Index sind immer in der Statistik eingeschlossen. Dies kön-nen bis zu 300 Werte sein, von denen der 300. Wert den Endpunkt darstellt.

Inhalt der „statblob“-Spalte Neben den Verteilungsschritten wird in der statblob-Spalte auch Folgendes gespeichert:

� Datum und Uhrzeit der letzten Aktualisierung der Statistik. � Anzahl der Zeilen in der Tabelle. � Anzahl der Zeilen der Stichprobenerhebung zum Erstellen des Histogramms

und zum Ermitteln der Dichte. � Anzahl der Verteilungsschritte. � Durchschnittliche Schlüssellänge. � Dichte für die einzelnen Spalten und für alle kombinierten Spalten. � Anzahl der Zeilen, die in einen Histogrammschritt fallen.

ThemaErläutern Sie, wie Statis-tiken in SQL Server ge-speichert werden.

EinstiegStatistiken werden in der statblob-Spalte der sysindexes-Systemtabelle gespeichert.

Methodischer Hinweis Wenn Sie einen Index für die Sales-Tabelle erstellen, erstellt SQL Server auto-matisch Statistiken.

Dieses Beispiel veranschau-licht das Erstellen von Statistiken durch SQL Server.

Page 389: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 7: Erstellen und Verwalten von Indizes 41

� Anzahl der Zeilen, deren Wert identisch mit dem oberen Grenzwert des Histogrammschrittes ist.

� Anzahl der unterschiedlichen Werte innerhalb eines Histogrammschrittes.

Für die statblob-Spalte wird der Datentyp image definiert. Anmerkung

Page 390: Programmieren Einer Microsoft SQL Server 2000-Datenbank

42 Unterrichtseinheit 7: Erstellen und Verwalten von Indizes

Erstellen von Statistiken

� Automatisches Erstellen von Statistiken

� Indizierte Spalten, die Daten enthalten

� Nicht indizierte Spalten, die in einem JOIN-Prädikat oder in einer WHERE-Klausel verwendet werden

� Manuelles Erstellen von Statistiken

� Für Spalten, die nicht indiziert sind

� Für alle Spalten außer der ersten Spalte eines zusammengesetzten Indexes

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Sie können Statistiken automatisch oder manuell erstellen. Es empfiehlt sich jedoch, SQL Server die Statistiken automatisch erstellen zu lassen.

Automatisches Erstellen von Statistiken Wenn die standardmäßige Datenbankoption auto create statistics auf ON fest-gelegt ist, erstellt SQL Server automatisch Statistiken für die folgenden Elemente:

� Indizierte Spalten, die Daten enthalten. � Nicht indizierte Spalten, die in einem JOIN-Prädikat oder in einer WHERE-

Klausel verwendet werden.

Der Abfrageoptimierer aktiviert die automatische Erstellung von Statistiken beim Optimieren einer Abfrage. Dies kann sich nachteilig auswirken, wenn der Abfrageoptimierer feststellt, dass Statistiken fehlen. Der Ausführungsplan schließt die Aktion zur Erstellung von Statistiken ein, wofür beim Verarbeiten der Abfrage zusätzliche Zeit benötigt wird.

Wenn Sie eine Abfrage ausführen und den Ausführungsplan an-zeigen, schlägt der Abfrageoptimierer möglicherweise eine Aktion zum Be-heben des Fehlers vor, wie beispielsweise das Erstellen oder Aktualisieren von Statistiken oder das Erstellen eines Indexes. An diesem Punkt können Sie Statistiken und Indizes sofort erstellen oder aktualisieren.

ThemaErläutern Sie, wann Statistiken erstellt und warum sie erstellt werden.

EinstiegSie können Statistiken automatisch oder manuell erstellen. Es empfiehlt sich jedoch, SQL Server die Statistiken automatisch erstellen zu lassen.

Anmerkung

Page 391: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 7: Erstellen und Verwalten von Indizes 43

Manuelles Erstellen von Statistiken Sie können die CREATE STATISTICS-Anweisung ausführen, um ein Histo-gramm und hiermit verbundene Dichtegruppen für bestimmte Spalten zu er-stellen. Statistiken können für folgende Spalten erstellt werden:

� Spalten, die nicht indiziert sind. � Alle Spalten außer der ersten Spalte eines zusammengesetzten Indexes. � Berechnete Spalten nur dann, wenn die Bedingungen zum Erstellen eines

Indexes für diese Spalten erfüllt sind. � Spalten, für die nicht die Datentypen image, text und ntext definiert

wurden.

Das manuelle Erstellen von Statistiken ist sinnvoll bei einer Spalte, für die ein Index zwar keine Vorteile brächte, bei der Statistiken für diese Spalte jedoch für das Erstellen eines leistungsfähigeren Ausführungsplanes von Nutzen wäre. Werden für solche Spalten Statistiken erstellt, erübrigt sich der Verwaltungs-aufwand für ein Index, während der Abfrageoptimierer die Spalte jedoch für das Optimieren von Abfragen heranziehen kann.

Um manuell Statistiken für eine Tabelle erstellen zu können, müssen Sie der Besitzer der Tabelle sein.

CREATE STATISTICS statistics_name ON {table| view} (column [,...n])

Anmerkung

Teilsyntax

Page 392: Programmieren Einer Microsoft SQL Server 2000-Datenbank

44 Unterrichtseinheit 7: Erstellen und Verwalten von Indizes

Aktualisieren von Statistiken

� Häufigkeit der Aktualisierung von Statistiken

� Automatisches Aktualisieren von Statistiken

� Manuelles Aktualisieren von Statistiken

� Wenn Sie einen Index erstellen, bevor eine Tabelle mit Daten gefüllt wird

� Wenn die Tabelle abgeschnitten wurde

� Wenn Sie viele Zeilen zu einer Tabelle hinzufügen, die wenig oder gar keine Daten enthält, und Sie für die Tabelle sofort eine Abfrage ausführen möchten

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Nach einer gewissen Zeit können Statistiken veraltet sein, wodurch die Leistung des Abfrageoptimierers beeinträchtigt wird.

Häufigkeit der Aktualisierung von Statistiken SQL Server aktualisiert die statistischen Daten, wenn die Daten veraltet sind. Hierbei bestimmt die Menge der Daten in der Spalte und das Verhältnis zur Menge der sich ändernden Daten die Häufigkeit der Aktualisierung. Beispiel:

� Die Statistiken einer Tabelle mit 10.000 Zeilen muss möglicherweise aktua-lisiert werden, wenn 1.000 Indexwerte geändert wurden, da 1.000 Index-werte einen signifikanten Prozentsatz der Tabelle darstellen.

� Die Statistik einer Tabelle mit 10 Millionen Indexeinträgen muss möglicher-weise nicht aktualisiert werden, wenn 1.000 Indexwerte geändert wurden, da 1.000 Indexwerte bei dieser Tabelle nur einen geringen Prozentsatz darstellen.

SQL Server nimmt immer eine minimale Anzahl von Zeilen als Stichprobe. Tabellen, die kleiner als 8 MB sind, werden beim Sammeln statistischer Daten immer vollständig gescannt.

SQL Server gibt eine Warnung aus, wenn Statistiken veraltet sind oder nicht verfügbar. Diese Warnung wird angezeigt, wenn der Ausführungs-plan angezeigt wird, indem SQL Query Analyzer ausgeführt wird. Sie können mit Hilfe von SQL Profiler die Ereignisklasse Missing Column Statistics über-wachen. Diese Ereignisklasse zeigt an, dass Statistiken fehlen.

ThemaErläutern Sie, wie SQL Server ermittelt, wie oft und wann Statistiken aktualisiert werden müssen.

EinstiegNach einer gewissen Zeit können Statistiken veraltet sein, wodurch die Leistung des Abfrageoptimierers beeinträchtigt wird.

Anmerkung

Page 393: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 7: Erstellen und Verwalten von Indizes 45

Automatisches Aktualisieren von Statistiken Es empfiehlt sich, SQL Server die Statistiken automatisch aktualisieren zu lassen. Wenn die Datenbankoption auto update statistics auf ON festgelegt wurde (Standard), aktualisiert SQL Server vorhandene Statistiken automatisch, wenn diese ihre Gültigkeit verlieren.

Wenn beispielsweise eine Tabelle seit der letzten Erstellung oder Aktualisie-rung der Statistik umfangreiche Aktualisierungen erfahren hat, aktualisiert SQL Server automatisch die Statistik, um Abfragen zu optimieren, die auf die Tabelle zugreifen.

Der Abfrageoptimierer aktiviert das automatische Aktualisieren von Statistiken beim Optimieren einer Abfrage. Dies kann sich nachteilig auswirken, wenn der Abfrageoptimierer feststellt, dass Statistiken veraltet sind. Der Ausführungsplan schließt die Aktion zum Aktualisieren von Statistiken ein, wofür beim Verar-beiten der Abfrage zusätzliche Zeit benötigt wird.

Manuelles Aktualisieren von Statistiken Sie können die UPDATE STATISTICS-Anweisung ausführen, um die Informa-tionen zur Verteilung von Schlüsselwerten für eine oder mehrere Statistiken in einer angegebenen Tabelle zu aktualisieren. In den folgenden Fällen möchten Sie die Statistiken einer Tabelle oder einer Spalte möglicherweise manuell aktualisieren:

� Wenn Sie einen Index erstellen, bevor eine Tabelle mit Daten gefüllt wird. � Wenn die Tabelle abgeschnitten wurde. � Wenn Sie viele Zeilen zu einer Tabelle hinzufügen, die wenig oder gar

keine Daten enthält, und Sie für die Tabelle sofort eine Abfrage ausführen möchten.

UPDATE STATISTICS table| view [index | (statistics_name[,...n])]

Um eine Liste von Indexnamen und Beschreibungen anzuzeigen, führen Sie die gespeicherte Systemprozedur sp_helpindex unter Angabe des Tabellennamens aus.

Teilsyntax

Anmerkung

Page 394: Programmieren Einer Microsoft SQL Server 2000-Datenbank

46 Unterrichtseinheit 7: Erstellen und Verwalten von Indizes

Anzeigen von Statistiken

� Die DBCC SHOW_STATISTICS-Anweisung gibt statistische Daten auf der Verteilungsseite eines Indexes oder einerSpalte zurück

� Zu den statistischen Daten gehören die folgenden: � Die Uhrzeit der letzten Aktualisierung der Statistik� Die Anzahl der als Stichproben genommenen Zeilen, um das

Histogramm zu erstellen � Informationen zur Datendichte � Die durchschnittliche Schlüssellänge� Informationen zu den Histogrammschritten

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Sie können statistische Daten auf der Verteilungsseite eines Indexes oder einer Spalte anzeigen, indem Sie die DBCC SHOW_STATISTICS-Anweisung aus-führen.

In der folgenden Tabelle werden die Informationen erläutert, die von der DBCC SHOW_STATISTICS-Anweisung zurückgegeben werden.

Spaltenname Beschreibung

Updated Datum und Uhrzeit der letzten Aktualisierung der Statistik

Rows Anzahl der Zeilen in der Tabelle

Rows sampled Anzahl der Zeilen, die für statistische Daten als Stichproben genommen wurden

Steps Anzahl der Verteilungsschritte

Density Selektivität des ersten Indexspaltenpräfixes (nicht häufig)

Average key length Durchschnittliche Länge des ersten Indexspaltenpräfixes

All density Selektivität einer Gruppe von Indexspaltenpräfixen (häufig)

Average length Durchschnittliche Länge einer Gruppe von Indexspaltenpräfixen

Columns Namen der Indexspaltenpräfixe, für die All density und Average length angezeigt werden

RANGE_HI_KEY Oberer Grenzwert für einen Histogrammschritt

RANGE_ROWS Anzahl der Zeilen aus der Stichprobe, die in einen Histogrammschritt fallen, mit Ausnahme des oberen Grenzwertes

ThemaErläutern Sie, wie Infor-mationen zu Statistiken angezeigt werden.

EinstiegSie können statistische Daten auf der Verteilungs-seite eines Indexes oder einer Spalte anzeigen, indem Sie die DBCC SHOW_STATISTICS-Anweisung ausführen.

Page 395: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 7: Erstellen und Verwalten von Indizes 47

(Fortsetzung) Spaltenname Beschreibung

EQ_ROWS Anzahl von Zeilen aus der Stichprobe, deren Wert identisch mit dem oberen Grenzwert des Histogramm-schrittes ist

DISTINCT_RANGE_ROWS Anzahl von unterschiedlichen Werten in einem Histo-grammschritt, mit Ausnahme des oberen Grenzwertes

AVG_RANGE_ROWS Durchschnittliche Anzahl von doppelten Werten in einem Histogrammschritt, mit Ausnahme des oberen Grenzwertes (RANGE_ROWS / DISTINCT_RANGE_ROWS for DISTINCT_RANGE_ROWS > 0)

DBCC SHOW_STATISTICS (table, target)

Das Anzeigen von Statistiken erweist sich in der Regel als nützlich, wenn Sie für bestimmte Abfragen eine Leistungsoptimierung auf höchster Ebene vor-nehmen. Bei den meisten Anwendungen ist es nicht erforderlich, Statistiken anzuzeigen.

Syntax

Page 396: Programmieren Einer Microsoft SQL Server 2000-Datenbank

48 Unterrichtseinheit 7: Erstellen und Verwalten von Indizes

Abfragen der „sysindexes“-Tabelle

� Speichern von Tabellen- und Indexinformationen

� Indextyp (indid)

� Verwendeter Speicherplatz (dpages, reserved und used)

� Füllfaktor (OrigFillFactor)

� Speichern von Statistiken für jeden Index

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Sie können die sysindexes-Tabelle abfragen, um zusätzlich zu Statistiken für jeden Index Informationen zu Tabelle und Index abzurufen. Die folgende Tabelle enthält einen Teil der Informationen, die angezeigt werden können und die von den in der sysindexes-Tabelle gespeicherten Daten stammen.

Spalte Beschreibung Werte

indid(Indextyp)

ID des Indexes (Indextyp) Folgende Werte sind möglich:

• 0 für nicht gruppierte Tabelle

• 1 für gruppierten Index

• >1 für nicht gruppierten Index

• 255 für Tabellen, die Daten vom Typ text oder image enthalten

dpages (verwendeter Speicherplatz)

Anzahl der Indexseiten auf Blattebene

Für indid = 0 oder indid = 1 ist dpages die Anzahl der verwendeten Datenseiten.

Für indid = 255 wird dpages auf 0 festgelegt.

Andernfalls ist dpages die Anzahl der verwendeten, nicht gruppierten Indexseiten.

reserved(verwendeter Speicherplatz)

Anzahl der für einen Index reservierten Seiten

Für indid = 0 oder indid = 1 ist reserved die Anzahl der für alle Indizes und Tabellendaten reservierten Seiten.

Für indid = 255 ist reserved die Anzahl der für text- oder image-Daten reservierten Seiten.

Andernfalls ist reserved die Anzahl der für den Index reservierten Seiten.

ThemaErläutern Sie, wie die sysindexes-Tabelle abge-fragt wird, um Tabellen- und Indexinformationen abzu-rufen.

EinstiegSie können die sysindexes-Tabelle abfragen, um zu-sätzlich zu Statistiken für jeden Index Informationen zu Tabelle und Index abzurufen.

Page 397: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 7: Erstellen und Verwalten von Indizes 49

(Fortsetzung) Spalte Beschreibung Werte

used(verwendeter Speicherplatz)

Größe des von einem Index verwendeten Speicherplatzes

Für indid = 0 oder indid = 1 ist used die Gesamtzahl der Seiten, die für alle Index- und Tabellendaten verwendet werden.

Für indid = 255 ist used die Anzahl der für text- oder image-Daten reservierten Seiten.

Andernfalls ist used die Anzahl der für den Index verwen-deten Seiten.

OrigFillFactor (Füllfaktor)

Ursprünglicher Füllfaktorwert, der beim Erstellen des Indexes verwendet wurde

Dieser Wert wird nicht verwaltet; er kann sich jedoch als nützlich erweisen, wenn Sie einen Index neu erstellen müssen und sich nicht an den verwendeten Füllfaktor erinnern können.

minlen Minimale Länge einer Zeile Ganzzahliger Wert.

xmaxlen Maximale Länge einer Zeile Ganzzahliger Wert.

maxirow Maximale Länge einer Nicht-Blatt-Indexzeile

Ganzzahliger Wert.

keys Beschreibung von Schlüssel-spalten

Trifft nur zu, wenn es sich bei dem Eintrag um einen Index handelt.

statversion Anzahl der Aktualisierungen der Statistiken

Ganzzahliger Wert.

statblob BLOB (Binary Large Object) der Statistik

Speichert statistische Daten.

Die in diesem Beispiel ausgeführte Anweisung greift auf die Index-ID und weitere in der sysindexes-Systemtabelle gespeicherte Informationen zu. Um die Index-ID eines gruppierten Indexes zu ermitteln, müssen Sie in der WHERE-Klausel den Namen des gruppierten Indexes (index_name) angeben.

SELECT id, indid, reserved, used, origfillfactor, name FROM Northwind.dbo.sysindexes WHERE name = 'PK_customers'

id indid reserved used origfillfactor name

2073058421 1 15 15 0 PK_Customers (1 row(s) affected)

Beispiel

Ergebnis

Page 398: Programmieren Einer Microsoft SQL Server 2000-Datenbank

50 Unterrichtseinheit 7: Erstellen und Verwalten von Indizes

Einrichten von Indizes mit Hilfe des Indexoptimierungs-Assistenten

� Der Indexoptimierungs-Assistent erfüllt folgende Funktionen:� Empfehlen oder Überprüfen der optimalen Indexkonfiguration� Bereitstellen von Kostenanalyseberichten� Empfehlen von Verfahren zum Optimieren der Datenbank � Angeben von Kriterien für ein Auswerten der

Arbeitsauslastung� Der Indexoptimierungs-Assistent sollte für folgende Elemente

nicht verwendet werden:� Tabellen, auf die in datenbankübergreifenden Abfragen

verwiesen wird und die nicht vorhanden sind� Systemtabellen, PRIMARY KEY-Einschränkungen, eindeutige

Indizes

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Der Indexoptimierungs-Assistent kann Einsteigern ebenso wie fortgeschrittenen Benutzern von SQL Server dabei helfen, geeignete Indizes für eine neue Daten-bank zu erstellen oder die vorhandenen Indizes einer aktuellen Datenbank zu überprüfen. Der Indexoptimierungs-Assistent berücksichtigt die Abfragelast, um zu ermitteln, welche Indizes sinnvoll sind, wohingegen das Feature Aus-führungsplan anzeigt, welche Indizes in Abfragen verwendet werden.

Ermitteln, wann der Indexoptimierungs-Assistent verwendet werden sollte Einsteigern ist der Assistent dabei behilflich, innerhalb kürzester Zeit eine optimale Indexkonfiguration zu erstellen. Fortgeschrittene Benutzer können den Assistenten verwenden, um eine Ausgangsindexkonfiguration zu erstellen. Fortgeschrittene Benutzer können die vorhandenen Indexkonfigurationen dann auf benutzerdefinierte Weise optimieren oder überprüfen.

Der Indexoptimierungs-Assistent erfüllt folgende Funktionen:

� Empfehlen oder Überprüfen der optimalen Indexkonfiguration für eine Datenbank unter Berücksichtigung einer bestimmten Arbeitsauslastung oder Ablaufverfolgungsdatei mit Hilfe der Kostenanalyse des Abfrage-optimierers.

� Bereitstellen von Kostenanalyseberichten über die Auswirkungen der vor-geschlagenen Änderungen, wie z. B. die folgenden:

• Beanspruchung aktueller und empfohlener Indizes.

• Verbesserung der Abfrageleistung für die hundert teuersten Abfragen und den Anteil der Tabellen an der Arbeitsauslastung.

ThemaStellen Sie den Index-optimierungs-Assistenten vor.

EinstiegDer Indexoptimierungs-Assistent kann Einsteigern ebenso wie fortgeschrit-tenen Benutzern von SQL Server dabei helfen, geeignete Indizes für eine neue Datenbank zu er-stellen oder die vorhan-denen Indizes einer aktuellen Datenbank zu überprüfen.

Page 399: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 7: Erstellen und Verwalten von Indizes 51

� Empfehlen von Verfahren zum Optimieren der Datenbank für eine kleine Anzahl problematischer Abfragen.

� Angeben von Kriterien, die zu berücksichtigen sind, wenn der Index-optimierungs-Assistent eine Arbeitsauslastung auswertet, wie beispielsweise die maximale Anzahl zu optimierender Abfragen, der maximal verfügbare Speicherplatz für die empfohlenen Indizes und die maximale Anzahl der Spalten pro Index.

Ermitteln, wie der Assistent verwendet werden soll Berücksichtigen Sie die folgenden Aspekte und Richtlinien, wenn Sie den Indexoptimierungs-Assistenten verwenden:

� Ein Benutzer, der den Indexoptimierungs-Assistenten aufruft, muss ein Mit-glied der festen Serverrolle sysadmin sein, da die Abfragen in der Arbeits-auslastung im Sicherheitskontext des Benutzers analysiert werden.

� Der Indexoptimierungs-Assistent sollte für folgende Elemente nicht ver-wendet werden:

• Tabellen, auf die in datenbankübergreifenden Abfragen verwiesen wird und die in der momentan ausgewählten Datenbank nicht vorhanden sind.

• Systemtabellen

• PRIMARY KEY-Einschränkungen und eindeutige Indizes. Der Assistent könnte einen gruppierten Index löschen oder ersetzen, der nicht eindeutig ist oder der aktuell für eine PRIMARY KEY-Einschrän-kung erstellt wurde.

� Wenn die Option Alle vorhandenen Indizes beibehalten ausgewählt wurde, sollten keine Indizes gelöscht werden. Der Assistent empfiehlt nur neue Indizes, wenn dies angebracht erscheint. Wenn Sie diese Option deaktivieren, kann hierdurch jedoch eventuell höhere Leistungssteigerung der Arbeitsauslastung erzielt werden.

� Es empfiehlt sich, die Option Indizierte Sichten hinzufügen aktiviert zu lassen.

� Hinweise verhindern möglicherweise, dass der Indexoptimierungs-Assistent einen besseren Ausführungsplan wählt. Entfernen Sie möglichst alle Index-hinweise aus Abfragen, bevor Sie die Arbeitsauslastung analysieren.

� Wenn Sie die Ausführungszeit des Indexoptimierungs-Assistenten verrin-gern möchten, sollten Sie folgendermaßen vorgehen:

• Stellen Sie sicher, dass die Option Ausführliche Analyse durchführenim Dialogfeld Server und Datenbank auswählen nicht aktiviert ist. Durch das Ausführen einer ausführlichen Analyse nimmt der Index-optimierungs-Assistent eine umfassende Analyse der Abfragen vor, was eine längere Ausführungszeit zur Folge hat. Wenn Sie diese Option akti-vieren, kann hierdurch jedoch eventuell höhere Leistungssteigerung der optimierten Arbeitsauslastung erzielt werden.

• Nehmen Sie die Optimierung lediglich für eine Teilmenge der Tabellen in der Datenbank vor.

Page 400: Programmieren Einer Microsoft SQL Server 2000-Datenbank

52 Unterrichtseinheit 7: Erstellen und Verwalten von Indizes

• Reduzieren Sie die Größe der Arbeitsauslastungsdatei.

Wenn Sie den Indexoptimierungs-Assistenten zum Analysieren eines Transact-SQL-Skripts verwenden, das nicht über die Dateinamen-erweiterung SQL verfügt, wie beispielsweise Mein_Skript.txt, und Sie die Datei öffnen, während Dateiformat auf Auto festgelegt ist, erzeugt der Assistent die Fehlermeldung Kein gültiges Dateiformat. Legen Sie die Option Dateiformat stattdessen auf ANSI SQL oder auf UNICODE SQL fest.

Anmerkung

Page 401: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 7: Erstellen und Verwalten von Indizes 53

Leistungsaspekte

� Erstellen Sie Indizes für Fremdschlüssel

� Erstellen Sie gruppierte Indizes vor nicht gruppierten Indizes

� Erstellen Sie zusammengesetzte Indizes

� Erstellen Sie für eine Tabelle, die häufig gelesen wird, mehrere Indizes

� Verwenden Sie den Indexoptimierungs-Assistenten

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Gehen Sie beim Erstellen und Verwenden von Indizes folgendermaßen vor, um eine Beeinträchtigung der Leistung so weit wie möglich zu vermeiden:

� Erstellen Sie Indizes für Fremdschlüssel, da in Abfragen normalerweise auf Fremdschlüssel verwiesen wird.

� Erstellen Sie gruppierte Indizes vor nicht gruppierten Indizes, da sich durch einen gruppierten Index die physische Reihenfolge der Tabellenzeilen ändert.

� Erstellen Sie zusammengesetzte Indizes. Die Abfrageleistung wird durch zusammengesetzte Indizes verbessert, vor allem wenn die Informationen von den Benutzern häufig auf unterschiedliche Weise abgefragt werden.

� Erstellen Sie für eine Tabelle mehrere Indizes, vor allem wenn die Tabelle häufig gelesen wird. Die Abfrageleistung wird verbessert, wenn eine Tabelle sowohl über einen gruppierten als auch über nicht gruppierte Indizes verfügt.

� Verwenden Sie den Indexoptimierungs-Assistenten, um die Verwendung Ihrer Indizes automatisch nachverfolgen zu lassen. Er ist zudem beim Verwalten und Erstellen von Indizes mit optimaler Leistung hilfreich.

ThemaErläutern Sie die Leistungs-aspekte für das Planen und Erstellen von Indizes.

EinstiegGehen Sie beim Erstellen und Verwenden von Indizes folgendermaßen vor, um eine Beeinträchtigung der Leistung so weit wie möglich zu vermeiden.

Page 402: Programmieren Einer Microsoft SQL Server 2000-Datenbank

54 Unterrichtseinheit 7: Erstellen und Verwalten von Indizes

Empfohlene Methoden

Verwenden Sie die Option FILLFACTOR, um die Leistung zu optimierenVerwenden Sie die Option FILLFACTOR, um die Leistung zu optimieren

Führen Sie DBCC SHOWCONTIG aus, um die Fragmentierung zu ermitteln

Lassen Sie SQL Server Statistiken automatisch erstellen und aktualisieren

Erwägen Sie, Statistiken für nicht indizierte Spalten zu erstellen, um effizientere Ausführungspläne zu erstellen

Verwenden Sie die Option DROP_EXISTING, um Indizes zu verwalten

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Um Ihre Indizes optimal nutzen zu können, sollten Sie die folgenden Methoden beachten:

� Verwenden Sie die Option FILLFACTOR, um die optimale Arbeitsweise von INSERT- und UPDATE-Anweisungen sicherzustellen. Diese Option ermöglicht Ihnen, einen Prozentwert für den freien Platz auf Seiten der Blattebene anzugeben.

� Mit Hilfe der Option DROP_EXISTING können Sie Indizes in kurzer Zeit neu erstellen.

� Führen Sie die DBCC SHOWCONTIG-Anweisung aus, um den Grad der Fragmentierung einer Tabelle zu ermitteln. Mit der DBCC SHOWCONTIG-Anweisung erhalten Sie Auskunft über den Prozentsatz der Fragmentierung und die durchschnittliche Seitendichte innerhalb einer Tabelle.

� Lassen Sie SQL Server Statistiken automatisch erstellen und aktualisieren. Statistiken sind nach einer gewissen Zeit manchmal veraltet, wodurch die Leistung des Abfrageoptimierers beeinträchtigt werden kann. Sie sollten auto update statistics und auto create statistics daher auf ON festlegen.

� Erwägen Sie, Statistiken für nicht indizierte Spalten und Sekundärspalten eines zusammengesetzten Indexes zu erstellen. Sie können die Abfrage-leistung erhöhen, ohne dass ein Verwaltungsaufwand für zusätzliche Indizes entsteht. Werden Statistiken erstellt, ist es dem Abfrageoptimierer möglich, effizientere Ausführungspläne zu erstellen.

ThemaListen Sie die empfohlenen Methoden zum Verwenden oder Erstellen von Indizes auf.

EinstiegUm Ihre Indizes optimal nutzen zu können, sollten Sie die folgenden empfoh-lenen Methoden beachten.

Page 403: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 7: Erstellen und Verwalten von Indizes 55

Zusätzliche Informationen zu den folgenden Themen erhalten Sie in der SQL Server-Onlinedokumentation.

Thema Suchbegriff

Indexstatistik sp_autostats

DBCC SHOW_STATISTICS

"Statistik aktualisieren"

Erstellen von Indizes "Empfehlungen für die Indexoptimierung"

Berechnete Spalten "SET-Optionen mit Auswirkungen auf Ergebnisse"

Funktionen "Deterministische und nicht deterministische Funktionen"

Page 404: Programmieren Einer Microsoft SQL Server 2000-Datenbank

56 Unterrichtseinheit 7: Erstellen und Verwalten von Indizes

Übungseinheit B: Anzeigen von Indexstatistiken

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

LernzieleAm Ende dieser Übungseinheit werden Sie in der Lage sein, die folgenden Aufgaben auszuführen:

� Schätzen der Dichte und Ermitteln der Selektivität von Indizes. � Anzeigen von Indexstatistiken, um zu ermitteln, ob der Index selektiv ist.

VoraussetzungenUm diese Übungseinheit zu bearbeiten, benötigen Sie Folgendes:

� Die Skriptdateien für diese Übungseinheit, die sich in C:\Moc\2328A\Labfiles\L07 befinden.

� Die Antwortdateien für diese Übungseinheit, die sich in C:\Moc\2328A\Labfiles\L07\Answers befinden.

Einrichten der ÜbungseinheitUm diese Übungseinheit zu bearbeiten, ist eine der folgenden Aktionen erforderlich:

� Bearbeiten der vorherigen Übungseinheit. � Ausführen der Batchdatei C:\Moc\2328A\Batches\Restore07B.cmd.

Mit dieser Befehlsdatei wird die ClassNorthwind-Datenbank wieder in den Zustand zurückversetzt, der für die Übungseinheit erforderlich ist.

ThemaGeben Sie eine Einführung in die Übungseinheit.

EinstiegIn dieser Übungseinheit führen Sie Abfragen aus und vergleichen Statistiken.

Erläutern Sie die Lernziele der Übungseinheit.

Page 405: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 7: Erstellen und Verwalten von Indizes 57

Weitere Informationen Sollten Sie beim Ausführen von Dateien Hilfe benötigen, suchen Sie in der Hilfe von SQL Query Analyzer nach „Ausführen einer Abfrage“.

Daneben sind die folgenden Informationsquellen verfügbar:

� Das credit-Datenbankschema. � Die Microsoft SQL Server-Onlinedokumentation.

SzenarioDer Aufbau des Schulungsraumes soll die Organisation des weltweit agieren-den Handelsunternehmens Northwind Traders widerspiegeln. Das Unternehmen hat den fiktiven Domänennamen nwtraders.msft. Der primäre DNS-Server für nwtraders.msft ist der Kursleitercomputer, dessen IP-Adresse (Internetproto-koll) 192.168.x.200 lautet (wobei x die zugewiesene Schulungsraumnummer ist). Der Name des Kursleitercomputers ist London.

Die folgende Tabelle stellt den Benutzernamen, den Computernamen und die IP-Adresse für jeden Kursteilnehmercomputer in der fiktiven Domäne nwtraders.msft bereit. Suchen Sie den Ihrem Computer zugewiesenen Benutzernamen und notieren Sie ihn.

Benutzername Computername IP-Adresse

SQLAdmin1 Vancouver 192.168.x.1SQLAdmin2 Denver 192.168.x.2SQLAdmin3 Perth 192.168.x.3SQLAdmin4 Brisbane 192.168.x.4SQLAdmin5 Lisbon 192.168.x.5SQLAdmin6 Bonn 192.168.x.6SQLAdmin7 Lima 192.168.x.7SQLAdmin8 Santiago 192.168.x.8SQLAdmin9 Bangalore 192.168.x.9SQLAdmin10 Singapore 192.168.x.10SQLAdmin11 Casablanca 192.168.x.11SQLAdmin12 Tunis 192.168.x.12SQLAdmin13 Acapulco 192.168.x.13SQLAdmin14 Miami 192.168.x.14SQLAdmin15 Auckland 192.168.x.15SQLAdmin16 Suva 192.168.x.16SQLAdmin17 Stockholm 192.168.x.17SQLAdmin18 Moscow 192.168.x.18SQLAdmin19 Caracas 192.168.x.19SQLAdmin20 Montevideo 192.168.x.20SQLAdmin21 Manila 192.168.x.21SQLAdmin22 Tokyo 192.168.x.22SQLAdmin23 Khartoum 192.168.x.23SQLAdmin24 Nairobi 192.168.x.24

Veranschlagte Zeit für die Übungseinheit: 30 Minuten

Page 406: Programmieren Einer Microsoft SQL Server 2000-Datenbank

58 Unterrichtseinheit 7: Erstellen und Verwalten von Indizes

Übung 1 Überprüfen der Verwendung von Indizes

In dieser Übung erstellen Sie Indizes, führen eine Reihe von SELECT-Anwei-sungen aus, um die Dichte der vier Spalten in der Charge-Tabelle zu über-prüfen, und ermitteln die Selektivität.

Sie können Abschnitte der Skriptdatei ExamUse.sql im Ordner C:\Moc\2328A\Labfiles\L07 öffnen, sichten und ausführen, oder Sie können die angegebenen Transact-SQL-Anweisungen eingeben und ausführen.

� So erstellen Sie Indizes In diesem Verfahren löschen Sie die für die Charge-Tabelle vorhandenen Indizes und erstellen nicht gruppierte Indizes. 1. Melden Sie sich mit Hilfe der Informationen in der folgenden Tabelle an der

Schulungsraumdomäne nwtraders an.

Option Eingabe

Benutzername SQLAdminx (wobei x die Ihrem Computernamen zugewiesene Nummer ist, wie in der Schulungsraumdomäne nwtraders.msftfestgelegt)

Kennwort password

2. Öffnen Sie SQL Query Analyzer und melden Sie sich gegebenenfalls mit Microsoft Windows-Authentifizierung am (lokalen) Server an. Sie sind berechtigt, sich an SQL Server anzumelden und SQL Server zu verwalten, da Sie als SQLAdminx angemeldet und damit Mitglied der lokalen Administratorgruppe von Windows 2000 sind. Alle Mitglieder dieser Gruppe werden automatisch der sysadmin-Rolle von SQL Server zugeordnet.

3. Geben Sie die nachstehende Anweisung ein, und führen Sie sie aus, um eindeutige, nicht gruppierte Indizes für die Spalten charge_no,member_no, provider_no und category_no der Charge-Tabelle zu erstellen:USE credit CREATE UNIQUE NONCLUSTERED INDEX charge_no_CL ON charge (charge_no) CREATE NONCLUSTERED INDEX indx_member_no ON charge (member_no) CREATE NONCLUSTERED INDEX indx_provider_no ON charge (provider_no) CREATE NONCLUSTERED INDEX indx_category_no ON charge (category_no) GO

Page 407: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 7: Erstellen und Verwalten von Indizes 59

� So prüfen Sie die Struktur der „Charge“-Tabelle In diesem Verfahren erstellen Sie Indizes für die Charge-Tabelle und ermitteln die Minimal- und Maximalwerte für indizierte Spalten. 1. Geben Sie die folgenden Anweisungen ein, oder markieren Sie sie, und

führen Sie sie aus, um die Minimal- und Maximalwerte für die Spalten charge_no, member_no, provider_no und category_no zu erhalten: SELECT 'Charge_No ', MIN(Charge_No) AS 'Minimum Value', MAX(Charge_No) AS 'Maximum Value' FROM charge UNIONSELECT 'Member_No ', MIN(Member_No) AS 'Minimum Value', MAX(Member_No) AS 'Maximum Value' FROM charge UNIONSELECT 'Provider_No ', MIN(Provider_No) AS 'Minimum Value', MAX(Provider_No) AS 'Maximum Value' FROM charge UNIONSELECT 'Category_No ', MIN(Category_No) AS 'Minimum Value', MAX(Category_No) AS 'Maximum Value' FROM charge GO

2. Zeichnen Sie die Informationen in der folgenden Tabelle auf.

Value charge_no member_no provider_no category_no

Min 1 41 18 1

Max 100.000 10.000 500 10

� So ermitteln Sie die Selektivität In diesem Verfahren führen Sie eine Reihe von SELECT-Anweisungen aus, mit denen alle Zeilen in der Charge-Tabelle ausgewählt werden. Für jede SELECT-Anweisung wird ein Tabellenscan vorgenommen. Für jede SELECT-Anweisung wird zuerst die Abfrage ausgewählt und dann der geschätzte Aus-führungsplan angezeigt. Sie ändern die WHERE-Klausel so, dass der Abfrage-optimierer einen Index verwendet, um die Zeilen abzurufen, und führen dann die Abfrage aus. Nach dem Ausführen der Abfrage notieren Sie die maximale Anzahl Zeilen, die unter Verwendung eines Index zurückgegeben werden können, und werten diese aus. USE credit SELECT * FROM charge WHERE charge_no BETWEEN 1 AND 100000

USE credit SELECT * FROM charge WHERE member_no BETWEEN 1 AND 10000

USE credit SELECT * FROM charge WHERE provider_no BETWEEN 1 AND 500

USE credit SELECT * FROM charge WHERE category_no between 1 AND 10

Page 408: Programmieren Einer Microsoft SQL Server 2000-Datenbank

60 Unterrichtseinheit 7: Erstellen und Verwalten von Indizes

1. Markieren Sie die erste Anweisung, führen Sie sie jedoch nicht aus. 2. Klicken Sie im Abfragefenster im Menü Abfrage auf Geschätzten Aus-

führungsplan anzeigen.Beachten Sie den Abfrageplan für die Anweisung.

3. Ändern Sie den Bereich in den SELECT-Anweisungen so, dass der Abfrageoptimierer anstelle eines Tabellenscans oder eines vollständigen Indexscans einen Index zum Abrufen der Zeilen verwendet. Berücksichtigen Sie bei der Auswahl eines Bereichs die folgenden Aspekte:

• Jede Seite verfügt über ungefähr 172 Rechnungen (Charges).

• Ältere Mitglieder und Provider sind weniger aktiv als neuere.

• Alle Kategorien sind gleich beliebt. 4. Führen Sie die Anweisungen aus. 5. Zeichnen Sie in der nachstehenden Tabelle die maximale Anzahl Zeilen auf,

die unter Verwendung eines Index zurückgegeben werden kann.

WHERE-Klausel Ungefähre Anzahl Zeilen

WHERE charge_no BETWEEN 1 AND n 116

WHERE member_no BETWEEN 1 AND n 264

WHERE provider_no BETWEEN 1 AND n 767

WHERE category_no BETWEEN 1 AND n 0

6. Wiederholen Sie die Schritte 1 bis 5 für die verbleibenden SELECT-Anweisungen.

Sie werden feststellen, dass es nicht so einfach ist, die Selek-tivität einer Abfrage vorherzusagen, auch dann nicht, wenn Sie die Werte aller Argumente kennen. Am besten lassen Sie den Abfrageoptimierer ent-scheiden, wie die Abfrage ausgeführt werden soll.

Anmerkung

Page 409: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 7: Erstellen und Verwalten von Indizes 61

Ist die Anzahl der Zeilen, auf die der Abfrageoptimierer zugegriffen hat, für alle Indizes die gleiche? Begründung? Nein. Wenn sich die Selektivität erhöht und die Verteilung ändert, verlieren Indizes aus folgenden Gründen an Effektivität für den Abfrageoptimierer:

• Die „Charge“-Zahlen sind gleichmäßig über die Tabelle verteilt, und sie sind eindeutig. Die Vorhersehbarkeit der Daten ist sehr akkurat.

• Die „Member“-Zahl ist weniger selektiv und ungleichmäßig verteilt. Die Schätzung der Anzahl der zurückgegebenen Zeilen verliert an Genauigkeit.

• Die „Provider“-Zahlen sind nicht gleichmäßig über die „Charge“-Tabelle verteilt. Die älteren Provider (die mit der niedrigen Providernummer) verfügen nicht über so viele Charges wie die neueren Provider. Um die gleiche Anzahl an Charges wie die neueren Provider zu erhalten, wird bei der Auswahl von Charges ein größerer Prozentsatz älterer Provider verwendet.

• Kategorien sind gleichmäßig über die Tabelle verteilt. Da es jedoch nur 10 Kategorien gibt, wird, auch wenn nur für eine Kategorie Charges ausgewählt werden, eine beträchtliche Anzahl Zeilen zurückgegeben. Daher ist der Index nicht vorteilhaft.

____________________________________________________________

____________________________________________________________

____________________________________________________________

____________________________________________________________

____________________________________________________________

____________________________________________________________

____________________________________________________________

____________________________________________________________

Page 410: Programmieren Einer Microsoft SQL Server 2000-Datenbank

62 Unterrichtseinheit 7: Erstellen und Verwalten von Indizes

Übung 2 Anzeigen der Indexstatistiken und Auswerten der Indexselektivität

In dieser Übung erstellen Sie verschiedene Indizes der Member-Tabelle, rufen Indexstatistiken ab und treffen basierend auf der Selektivität des Index eine Aussage darüber, ob ein Index für den Abfrageoptimierung von Nutzen ist.

Sie können Abschnitte der Skriptdatei IndexStats.sql im Ordner C:\Moc\2328A\Labfiles\L07 öffnen, sichten und ausführen, oder Sie können die angegebenen Transact-SQL-Anweisungen eingeben und ausführen.

� So erstellen Sie Indizes In diesem Verfahren führen Sie ein Skript aus, das prüft, ob Indizes und Statistiken vorhanden sind, diese dann löscht und geeignete neue Indizes erstellt. Anschließend zeigen Sie die auf den erstellten Indizes basierenden Statistiken an. 1. Öffnen Sie SQL Query Analyzer, geben Sie die nachstehende Anweisung

ein, und führen Sie sie aus, um bereits vorhandene Indizes für die Member-Tabelle zu löschen. USE credit EXEC index_cleanup member

2. Geben Sie die folgenden Anweisungen ein, und führen Sie sie aus, um drei Indizes für die Member-Tabelle zu erstellen: USE credit CREATE UNIQUE INDEX indx_member_no ON member (member_no) CREATE INDEX indx_corp_lname ON member(corp_no,lastname) CREATE INDEX indx_lastname ON member (lastname) GO

Page 411: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 7: Erstellen und Verwalten von Indizes 63

� So zeigen Sie Indexstatistiken an und bewerten die Selektivität von Indizes

In diesem Verfahren rufen Sie die Indexstatistiken für die neuen Indizes ab, zeichnen die statistischen Daten auf und bewerten die Selektivität der Indizes. 1. Geben Sie die nachstehende Anweisung ein, und führen Sie sie aus, um die

statistischen Daten zum Index der Spalte member_no der Member-Tabelle anzuzeigen:USE credit DBCC SHOW_STATISTICS (member,indx_member_no)

2. Zeichnen Sie die statistischen Daten in der folgenden Tabelle auf.

Informationen Ergebnis

Rows 10.000

Steps 3

Density .00009

All density .00009

Wie selektiv ist der Index für die member_no-Spalte? Sehr selektiv. Der „index_member_no“-Index wurde für die „member_no“-Spalte erstellt, die eindeutige Werte enthält. Wenn in einer Abfrage in der WHERE-Klausel eine Mitgliedsnummer unter Verwendung einer Gleichsetzung angegeben wird, wird nur eine Zeile zurückgegeben. ____________________________________________________________

____________________________________________________________

3. Geben Sie die nachstehende Anweisung ein, und führen Sie sie aus, um die statistischen Daten zu einem zusammengesetzten Index der Spalten corp_no und lastname der Member-Tabelle anzuzeigen: USE credit DBCC SHOW_STATISTICS (member,indx_corp_lname)

4. Zeichnen Sie die statistischen Daten in der folgenden Tabelle auf.

Informationen Ergebnis

Rows 10.000

Steps 197

Density .0003

All density (corp_no) .002

(corp_no, lastname) .0006

Wie selektiv ist dieser Index?

Er ist ebenfalls recht selektiv, jedoch nicht so selektiv wie die „member_no“-Spalte, da doppelte Werte vorhanden sind. ____________________________________________________________

____________________________________________________________

Page 412: Programmieren Einer Microsoft SQL Server 2000-Datenbank

64 Unterrichtseinheit 7: Erstellen und Verwalten von Indizes

5. Geben Sie die nachstehende Anweisung ein, und führen Sie sie aus, um die statistischen Daten zur lastname-Spalte der Member-Tabelle anzuzeigen: USE credit DBCC SHOW_STATISTICS (member,indx_lastname)

6. Zeichnen Sie die statistischen Daten in der folgenden Tabelle auf.

Informationen Ergebnis

Rows 10.000

Steps 26

Density .0

All density .03

Wie selektiv ist dieser Index?

Dieser Index ist nicht sehr selektiv. Das Ergebnis der Formel zum Berechnen der Dichte zeigt, dass dieser Index nur geringe Selektivität besitzt. Da Sie nicht durch Null dividieren können, ist das Ergebnis Null. „All density“ steht für die gesamte Dichte. ((26/0)/10000) = 0 ____________________________________________________________

____________________________________________________________

Page 413: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 7: Erstellen und Verwalten von Indizes 65

Lernzielkontrolle

� Erstellen von Indizes

� Arbeiten mit CREATE INDEX-Optionen

� Verwalten von Indizes

� Einführung in die Arbeit mit Statistiken

� Abfragen der „sysindexes“-Tabelle

� Einrichten von Indizes mit Hilfe des Indexoptimierungs-Assistenten

� Leistungsaspekte

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

1. Sie sind als Datenbankadministrator für eine umfangreiche Kundendaten-bank verantwortlich. In letzter Zeit hat sich in der Auftragsabwicklung die Antwortzeit des Systems bei der Eingabe von Kundenbestellungen verlang-samt. Ihrer Erfahrung nach sind die Orders- und Order Details-Tabellen jedoch korrekt indiziert. Welche anderen Faktoren könnten für die schlechte Systemleistung verantwortlich sein? Die Indexstatistiken werden möglicherweise nicht automatisch ver-waltet und sind daher mit der Zeit eventuell veraltet, weil Daten geändert werden. Gegebenenfalls muss die Option FILLFACTOR erneut angewendet werden, um für neue Bestellungen (Zeilen), die in die „Orders“-Tabelle und in die „Order Details“-Tabelle eingefügt werden, weiteren Tabellen- und Indexspeicherplatz zu reservieren.

2. Welche Vorteile ergeben sich, wenn SQL Server Statistiken automatisch erstellt und aktualisiert? Wenn der Abfrageoptimierer Statistiken automatisch erstellt und aktualisiert, reduziert sich der Verwaltungsaufwand, und die Abfrage-leistung wird verbessert.

ThemaVertiefen Sie die Lernziele dieser Unterrichtseinheit, indem Sie die Kernpunkte wiederholen.

EinstiegDie Fragen zur Lernziel-kontrolle beziehen sich auf einige der Schlüsselkon-zepte, die Inhalt dieser Unterrichtseinheit sind.

Page 414: Programmieren Einer Microsoft SQL Server 2000-Datenbank

66 Unterrichtseinheit 7: Erstellen und Verwalten von Indizes

3. Sie sind verantwortlich für die Verwaltung einer Datenbank, die die Ver-triebsabteilung für die Annahme von Kundenaufträgen verwendet. Die Leistung der Sales-Datenbank lässt sehr zu wünschen übrig. Ihr Vor-gesetzter bittet Sie, die Leistung innerhalb von zwei Tagen zu verbessern. Welches ist das geeignete Tool für die Lösung dieses Problems? Verwenden Sie den Indexoptimierungs-Assistenten. Erstellen Sie am ersten Tag eine Arbeitsauslastungsdatei, in der Sie die Benutzer-aktivitäten über einen ganzen Tag aufzeichnen. Führen Sie am zweiten Tag den Indexoptimierungs-Assistenten basierend auf der ermittelten Arbeitsauslastung aus, prüfen Sie die Indexanalyse, und übernehmen Sie die vom Indexoptimierungs-Assistenten vorgeschlagenen Indizes.

Page 415: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Inhalt

Übersicht 1

Einführung zu Sichten 2

Vorteile von Sichten 4

Definieren von Sichten 6

Ändern von Daten mit Hilfe von Sichten 17

Optimieren der Leistung mit Hilfe von Sichten 19

Empfohlene Methoden 26

Übungseinheit A: Implementieren von Sichten 28

Lernzielkontrolle 38

Unterrichtseinheit 8: Implementieren von Sichten

Page 416: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Die in diesen Unterlagen enthaltenen Angaben und Daten können ohne vorherige Ankündigung geändert werden. Die in diesen Unterlagen genannten Firmen, Produkte, Menschen, Charaktere und/oder Daten sind frei erfunden und sollen keine wirklichen Individuen, Gesellschaften, Produkte oder Veranstaltungen darstellen, soweit nichts anderes angegeben ist. Die Benutzer/innen sind verpflichtet, sich an alle anwendbaren Urheberrechtsgesetze zu halten. Ohne ausdrückliche schriftliche Erlaubnis der Microsoft Corporation darf kein Teil dieser Unterlagen für irgendwelche Zwecke vervielfältigt oder übertragen werden, unabhängig davon, auf welche Art und Weise oder mit welchen Mitteln, elektronisch oder mechanisch, dies geschieht. Wenn auf dieses Dokument nur auf elektronischem Wege zugegriffen werden kann, sind Sie hiermit berechtigt, eine (1) Kopie zum persönlichen Gebrauch auszudrucken.

Microsoft Corporation kann Inhaber von Patenten oder Patentanträgen, Marken, Urheberrechten oder anderen gewerblichen Schutzrechten sein, die den Inhalt dieses Dokuments betreffen. Die Bereitstellung dieses Dokuments gewährt keinerlei Lizenzrechte an diesen Patenten, Marken, Urheberrechten oder anderen gewerblichen Schutzrechten, es sei denn, dies wurde ausdrücklich durch einen schriftlichen Lizenzvertrag mit der Microsoft Corporation vereinbart.

2000 Microsoft Corporation. Alle Rechte vorbehalten.

Microsoft, ActiveX, BackOffice, MS-DOS, PowerPoint, Visual Basic, Visual C++, Visual Studio, Windows und Windows NT sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern.

Andere in diesem Dokument aufgeführte Produkt- und Firmennamen sind möglicherweise Marken der jeweiligen Eigentümer.

Project Lead: Rich Rose Instructional Designers: Rich Rose, Cheryl Hoople, Marilyn McGill Instructional Software Design Engineers: Karl Dehmer, Carl Raebler, Rick Byham Technical Lead: Karl Dehmer Subject Matter Experts: Karl Dehmer, Carl Raebler, Rick Byham Graphic Artist: Kirsten Larson (Independent Contractor) Editing Manager: Lynette Skinner Editor: Wendy Cleary Copy Editor: Edward McKillop (S&T Consulting) Production Manager: Miracle Davis Production Coordinator: Jenny Boe Production Support: Lori Walker (S&T Consulting) Test Manager: Sid Benavente Courseware Testing: TestingTesting123 Classroom Automation: Lorrin Smith-Bates Creative Director, Media/Sim Services: David Mahlmann Web Development Lead: Lisa Pease CD Build Specialist: Julie Challenger Online Support: David Myka (S&T Consulting) Localization Manager: Rick Terek Operations Coordinator: John Williams Manufacturing Support: Laura King; Kathy Hershey Lead Product Manager, Release Management: Bo Galford Lead Product Manager, Data Base: Margo Crandall Group Manager, Courseware Infrastructure: David Bramble Group Product Manager, Content Development: Dean Murray General Manager: Robert Stewart

Page 417: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 8: Implementieren von Sichten iii

Hinweise für den Kursleiter Diese Unterrichtseinheit vermittelt den Kursteilnehmern die erforderlichen In-formationen zum Erstellen und Verwenden von Sichten. Sichten ermöglichen das Speichern einer vordefinierten Abfrage als Objekt in der Datenbank, um es zu einem späteren Zeitpunkt zu verwenden. Sie bieten eine einfache Möglich-keit, vertrauliche Daten zu schützen oder die Komplexität einer Datenbank-struktur zu verbergen und Informationen bereitzustellen, ohne dass die Benutzer Transact-SQL-Anweisungen schreiben und ausführen müssen.

Die Unterrichtseinheit definiert Sichten und deren Vorteile. Im weiteren Ver-lauf der Unterrichtseinheit wird beschrieben, wie Sichten erstellt werden, und es werden Beispiele für Projektionen und Verknüpfungen bereitgestellt. Die Bei-spiele zeigen, wie berechnete Spalten und integrierte Funktionen in die Sicht-definitionen eingeschlossen werden. Anschließend behandelt die Unterrichts-einheit Einschränkungen beim Ändern von Daten durch Sichten. Im letzten Abschnitt wird erläutert, wie Sichten die Leistung verbessern können.

In der Übungseinheit erstellen und testen die Kursteilnehmer Sichten, ein-schließlich von Sichten mit verschlüsselten Definitionen. Die Kursteilnehmer werden zudem Quelltabellen mit Hilfe einer Sicht ändern und einen Blick auf Sichtdefinitionen werfen.

Am Ende dieser Unterrichtseinheit werden die Kursteilnehmer in der Lage sein, die folgenden Aufgaben auszuführen:

� Beschreiben des Sichtenkonzepts. � Auflisten der Vorteile von Sichten. � Definieren einer Sicht mit der CREATE VIEW-Anweisung. � Ändern von Daten mit Hilfe von Sichten. � Optimieren der Leistung mit Hilfe von Sichten.

Unterlagen und Vorbereitung In diesem Abschnitt werden die erforderlichen Unterlagen und vorbereitenden Aufgaben erläutert, die nötig sind, um diese Unterrichtseinheit zu unterrichten.

Erforderliche Unterlagen Um diese Unterrichtseinheit zu unterrichten, benötigen Sie folgende Unterlagen:

� Die Microsoft® PowerPoint®-Datei 2328A_08.ppt� Die Beispieldatei C:\Moc\2328A\Demo\D08_Ex.sql, die alle Beispiel-

skripts der Unterrichtseinheit enthält, soweit in der Unterrichtseinheit nichts anderes angegeben ist.

Vorbereitende Aufgaben Zur Vorbereitung dieser Unterrichtseinheit gehen Sie folgendermaßen vor:

� Lesen Sie alle Unterlagen für diese Unterrichtseinheit. � Arbeiten Sie die Übungseinheit durch.

Präsentation:45 Minuten

Übungseinheit:30 Minuten

Page 418: Programmieren Einer Microsoft SQL Server 2000-Datenbank

iv Unterrichtseinheit 8: Implementieren von Sichten

Strategie für die Unterrichtseinheit Verwenden Sie die folgende Strategie, um diese Unterrichtseinheit zu präsentieren:

� Einführung zu Sichten Beschreiben Sie das Sichtenkonzept. Betonen Sie, dass Sichten nichts anderes als gespeicherte Abfragen sind.

� Vorteile von Sichten Auflisten der Vorteile der Verwendung von Sichten.

� Definieren von Sichten Erläutern Sie, wie Benutzer Sichten erstellen, ändern und löschen können, wobei die Einschränkungen und Richtlinien, die von den Benutzern beachtet werden müssen, besprochen werden. Beschreiben Sie, wie die Sichtdefini-tion verschlüsselt werden kann. Listen Sie die Systemtabellen mit den Sicht-definitionsinformationen auf.

� Ändern von Daten mit Hilfe von Sichten Beschreiben Sie, wie Daten mit Hilfe von Sichten geändert werden, und listen Sie auf, welche Überlegungen und Einschränkungen die Benutzer beachten müssen.

� Optimieren der Leistung mit Hilfe von Sichten. Beschreiben Sie, wie Sichten zur Leistungsoptimierung beitragen, indem sie das Ergebnis komplexer Abfragen speichern und Daten partitionieren.

Page 419: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 8: Implementieren von Sichten v

AnpassungsinformationenDieser Abschnitt beschreibt die Anforderungen zum Einrichten der Übungs-einheiten für eine Unterrichtseinheit sowie die Konfigurationsänderungen, die während der Übungseinheiten an den Kursteilnehmercomputern vorgenommen werden. Diese Informationen sollen Ihnen beim Replizieren oder Anpassen der Microsoft Official Curriculum-Courseware (MOC) helfen.

Die Übungseinheit in dieser Unterrichtseinheit hängt auch von der Schulungsraumkonfiguration ab, die im Abschnitt „Anpassungsinformationen“ am Ende des Dokuments Handbuch für das Einrichten von Schulungs-computern für Kurs 2328A, Programmieren einer Microsoft SQL Server 2000-Datenbank, beschrieben wird.

Einrichten der Übungseinheit Im folgenden Abschnitt werden die Anforderungen zum Einrichten der Übungseinheit in dieser Unterrichtseinheit beschrieben.

Anforderungen zum Einrichten Die Übungseinheit in dieser Unterrichtseinheit setzt voraus, dass sich die credit-Datenbank in dem für diese Übungseinheit erforderlichen Zustand befindet. Um die Kursteilnehmercomputer so vorzubereiten, dass sie dieser Anforderung entsprechen, führen Sie eine der folgenden Aktionen durch:

� Bearbeiten der vorhergehenden Übungseinheit. � Ausführen der Batchdatei C:\Moc\2328A\Batches\Restore08.cmd.

Falls dieser Kurs angepasst wurde, müssen die Kursteilnehmer die Batchdatei C:\Moc\2328A\Batches\Restore08.cmd ausführen, um sicherzu-stellen, dass die Übungseinheit ordnungsgemäß durchgeführt werden kann.

Ergebnisse der Übungseinheit Auf den Kursteilnehmercomputern gibt es keine Konfigurationsänderungen, die die Replikation oder die Anpassung betreffen.

Wichtig

Achtung

Page 420: Programmieren Einer Microsoft SQL Server 2000-Datenbank

iv Unterrichtseinheit 8: Implementieren von Sichten

This page is intentionally left blank.

This page is intentionally left blank.

Page 421: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 8: Implementieren von Sichten 1

Übersicht

� Einführung zu Sichten

� Vorteile von Sichten

� Definieren von Sichten

� Ändern von Daten mit Hilfe von Sichten

� Optimieren der Leistung mit Hilfe von Sichten

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Diese Unterrichtseinheit definiert Sichten und deren Vorteile. Im weiteren Ver-lauf der Unterrichtseinheit wird beschrieben, wie Sichten erstellt werden, und es werden Beispiele für Projektionen und Verknüpfungen bereitgestellt. Die Bei-spiele zeigen, wie berechnete Spalten und integrierte Funktionen in die Sicht-definitionen eingeschlossen werden. Anschließend behandelt die Unterrichts-einheit Einschränkungen beim Ändern von Daten durch Sichten. Im letzten Abschnitt wird erläutert, wie Sichten die Leistung verbessern können.

Am Ende dieser Unterrichtseinheit werden Sie in der Lage sein, die folgenden Aufgaben auszuführen:

� Beschreiben des Sichtenkonzepts. � Auflisten der Vorteile von Sichten. � Definieren einer Sicht mit der CREATE VIEW-Anweisung. � Ändern von Daten mit Hilfe von Sichten. � Optimieren der Leistung mit Hilfe von Sichten.

ThemaGeben Sie eine Übersicht über die Themen und Lern-ziele dieser Unterrichts-einheit.

EinstiegIn dieser Unterrichtseinheit lernen Sie, wie Datensichten erstellt, verwendet und verwaltet werden.

Page 422: Programmieren Einer Microsoft SQL Server 2000-Datenbank

2 Unterrichtseinheit 8: Implementieren von Sichten

Einführung zu Sichten

EmployeeViewEmployeeViewEmployeeView

Lastname Lastname FirstnameFirstname

Davolio Fuller Leverling

Davolio Fuller Leverling

Nancy Andrew Janet

Nancy Andrew Janet

EmployeesEmployeesEmployees

EmployeeIDEmployeeID LastName LastName FirstnameFirstname TitleTitle

123

123

DavolioFullerLeverling

DavolioFullerLeverling

NancyAndrewJanet

NancyAndrewJanet

~~~~~~~~~

~~~~~~~~~

Sicht desSicht desBenutzersBenutzers

USE NorthwindGOCREATE VIEW dbo.EmployeeViewAS SELECT LastName, FirstnameFROM Employees

USE NorthwindGOCREATE VIEW dbo.EmployeeViewAS SELECT LastName, FirstnameFROM Employees

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Eine Sicht bietet die Möglichkeit, eine vordefinierte Abfrage als Objekt in der Datenbank zur späteren Verwendung zu speichern. Die abgefragten Tabellen einer Sicht werden als Basistabellen bezeichnet. Von wenigen Ausnahmen abgesehen, kann jede SELECT-Anweisung als Sicht benannt und gespeichert werden. Beispiele für häufig verwendete Sichten sind:

� Eine Teilmenge von Zeilen oder Spalten einer Basistabelle. � Eine Vereinigung von zwei oder mehr Basistabellen mit dem UNION-

Operator. � Eine Verknüpfung von zwei oder mehr Basistabellen mit dem JOIN-

Operator. � Eine statistische Zusammenfassung einer Basistabelle. � Eine Teilmenge einer anderen Sicht oder eine Kombination von Sichten und

Basistabellen.

ThemaStellen Sie das Konzept von Sichten vor, und geben Sie ein Beispiel.

EinstiegBei einer Sicht handelt es sich um eine alternative Methode zum Anzeigen der Daten aus einer oder mehreren Tabellen.

Methodischer Hinweis Bis jetzt wurden in diesem Kurs Ad-hoc-Abfragen ge-schrieben. Im Zusammen-hang mit Sichten wollen wir uns ansehen, wie Abfragen als Objekte (Sichten, gespeicherte Prozeduren und Trigger) in der Daten-bank gespeichert werden.

Page 423: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 8: Implementieren von Sichten 3

In diesem Beispiel wird die dbo.EmployeeView-Sicht in der Northwind-Datenbank erstellt. Die Sicht zeigt zwei Spalten der Employees-Tabelle an.

USE Northwind GOCREATE VIEW dbo.EmployeeView ASSELECT LastName, Firstname FROM Employees

SELECT * from EmployeeView

LastName FirstNameDavolio Nancy Fuller Andrew Leverling Janet ...(9 row(s) affected)

Beispiel

Abfrage

Ergebnis

Page 424: Programmieren Einer Microsoft SQL Server 2000-Datenbank

4 Unterrichtseinheit 8: Implementieren von Sichten

Vorteile von Sichten � Konzentrieren der Daten für Benutzer

� Konzentrieren auf nur wichtige oder geeignete Daten

� Begrenzen des Zugriffs auf vertrauliche Daten

� Verbergen der Datenbankkomplexität

� Verstecken der Komplexität des Datenbankentwurfs

� Vereinfachen komplexer Abfragen, einschließlich verteilter Abfragen für heterogene Daten

� Vereinfachen der Verwaltung von Benutzerberechtigungen

� Verbessern der Leistung

� Organisieren von Daten für den Export in andere Anwendungen

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Sichten bieten unter anderem die folgenden Vorteile: Sie konzentrieren Daten für Benutzer, verbergen die Komplexität von Daten, vereinfachen die Ver-waltung von Berechtigungen und organisieren Daten für den Export in andere Anwendungen.

Konzentrieren der Daten für Benutzer Sichten schaffen eine kontrollierte Umgebung, die den Zugriff auf bestimmte Daten ermöglicht, während sie andere Daten verbirgt. Es ist möglich, nicht benötigte, vertrauliche oder ungeeignete Daten aus einer Sicht auszuschließen. Benutzer können die Anzeige von Daten in einer Sicht ebenso wie in einer Tabelle bearbeiten. Darüber hinaus können sie - mit den entsprechenden Be-rechtigungen und einigen Einschränkungen - die von einer Sicht erzeugten Daten ändern.

Verbergen der Datenbankkomplexität Sichten verbergen die Komplexität des Datenbankentwurfs vor dem Benutzer. Dies bietet Entwicklern die Möglichkeit, den Entwurf zu ändern, ohne dass sich dies auf den Benutzerdialog mit der Datenbank auswirkt. Darüber hinaus kann eine benutzerfreundlichere Anzeige der Daten erstellt werden, indem Namen verwendet werden, die einfacher zu verstehen sind als die in Datenbanken häufig verwendeten unverständlichen Namen.

Komplexe Abfragen, einschließlich verteilter Abfragen für heterogene Daten, können ebenfalls durch Sichten verborgen werden. Der Benutzer fragt die Sicht ab, statt die Abfrage zu schreiben oder ein Skript auszuführen.

Vereinfachen der Verwaltung von Benutzerberechtigungen Statt Benutzern die Berechtigung zum Abfragen bestimmter Spalten in Basis-tabellen zu erteilen, können Datenbankbesitzer Benutzern die Berechtigung erteilen, Daten nur über Sichten abzufragen. Auf diese Weise werden auch Änderungen am Entwurf der zugrunde liegenden Basistabellen geschützt. Benutzer können die Sicht ohne Unterbrechung weiter abfragen.

ThemaErläutern Sie, warum Be-nutzer Sichten erstellen oder verwenden.

EinstiegSichten bieten mehrere Vorteile.

Methodischer Hinweis Weisen Sie darauf hin, dass die Informationsschema-sichten es SQL Server ermöglichen, Systemdaten auf eine konsistente Weise darzustellen, sogar wenn wesentliche Änderungen an den Systemtabellen vorgenommen wurden.

Page 425: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 8: Implementieren von Sichten 5

Verbessern der Leistung Mit Sichten können Sie das Ergebnis komplexer Abfragen speichern. Andere Abfragen können diese Ergebnisse weiter verwenden. Mit Sichten können Sie zudem Daten partitionieren. Sie können einzelne Partitionen auf separaten Computern platzieren.

Organisieren von Daten für den Export in andere Anwendungen Sie können eine Sicht auf der Basis einer komplexen Abfrage erstellen, die mehrere Tabellen miteinander verknüpft, und die Daten dann zur weiteren Analyse in eine andere Anwendung exportieren.

Page 426: Programmieren Einer Microsoft SQL Server 2000-Datenbank

6 Unterrichtseinheit 8: Implementieren von Sichten

���� Definieren von Sichten

� Erstellen von Sichten

� Beispiel: Sicht verknüpfter Tabellen

� Ändern und Löschen von Sichten

� Vermeiden von unterbrochenen Besitzketten

� Suchen von Informationen zur Sichtdefinition

� Verbergen von Sichtdefinitionen

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

In diesem Abschnitt wird das Erstellen, Ändern und Löschen von Sichten beschrieben. Außerdem wird erläutert, wie unterbrochene Besitzketten ver-mieden, Sichtdefinitionen verborgen und Informationen zu Sichten innerhalb einer Datenbank abgerufen werden können.

ThemaGeben Sie eine Einführung in den Abschnitt über das Arbeiten mit Sichten.

EinstiegIn diesem Abschnitt wird das Erstellen, Ändern und Löschen von Sichten beschrieben.

Page 427: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 8: Implementieren von Sichten 7

Erstellen von Sichten

� Erstellen einer Sicht

� Einschränkungen beim Definieren von Sichten� Einschließen der ORDER BY-Klausel nicht möglich� Einschließen des INTO-Schlüsselwortes nicht möglich

CREATE VIEW dbo.OrderSubtotalsView (OrderID, Subtotal)ASSELECT OD.OrderID,SUM(CONVERT(money,(OD.UnitPrice*Quantity*(1-Discount)/100))*100)FROM [Order Details] ODGROUP BY OD.OrderIDGO

CREATE VIEW dbo.OrderSubtotalsView (OrderID, Subtotal)ASSELECT OD.OrderID,SUM(CONVERT(money,(OD.UnitPrice*Quantity*(1-Discount)/100))*100)

FROM [Order Details] ODGROUP BY OD.OrderIDGO

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Sie können Sichten mit dem Sichterstellungs-Assistenten, mit SQL Server Enterprise Manager oder Transact-SQL erstellen. Sichten können nur in der aktuellen Datenbank erstellt werden.

Erstellen einer Sicht Beim Erstellen einer Sicht überprüft Microsoft® SQL Server™ 2000 die Exis-tenz der Objekte, auf die in der Sicht verwiesen wird. Der Sichtname muss den Regeln für Bezeichner entsprechen. Die Angabe eines Besitzernamens für die Sicht ist optional. Sie sollten eine konsistente Benennungskonvention ent-wickeln, um Sichten von Tabellen zu unterscheiden. Sie können zum Beispiel das Wort „View“ als Suffix für jedes Objekt verwenden, das Sie erstellen. Auf diese Weise können Sie ähnliche Objekte (Tabellen und Sichten) beim Ab-fragen der Sicht INFORMATION_SCHEMA.TABLES leicht unterscheiden.

CREATE VIEW owner.view_name [(column [,n ])] [WITH {ENCRYPTION | SCHEMABINDING | VIEW_METADATA} [,n ]] AS select_statement

[WITH CHECK OPTION]

Zum Ausführen der CREATE VIEW-Anweisung müssen Sie Mitglied der Rolle sysadmin (Systemadministratoren), db_owner (Datenbankbesitzer) oder db_ddladmin (Administrator für die Datendefinitionssprache) sein oder Ihnen muss die Berechtigung für CREATE VIEW erteilt worden sein. Außerdem müssen Sie die SELECT-Berechtigung für alle Tabellen oder Sichten haben, auf die in der Sicht verwiesen wird.

Um Situationen zu vermeiden, in denen der Besitzer einer Sicht und der Besitzer einer zugrunde liegenden Tabelle nicht identisch sind, wird empfohlen, dass der dbo-Benutzer sämtliche Objekte in einer Datenbank besitzt. Geben Sie beim Erstellen eines Objekts immer den dbo-Benutzer als Besitzernamen an; andernfalls wird das Objekt mit Ihrem Benutzernamen als Objektbesitzer erstellt.

ThemaGeben Sie eine Einführung in das Erstellen und Löschen von Sichten.

EinstiegNachdem Sichten definiert worden sind, wird nun erläutert, wie eine Sicht erstellt wird.

Methodischer Hinweis Empfehlen Sie den Kursteil-nehmern, eine konsistente Benennungskonvention zum Unterscheiden von Sichten und Tabellen zu entwickeln und dbo als Besitzername anzugeben.

Syntax

Methodischer Hinweis Es ist möglich, dass einem Benutzer die Berechtigung zum Erstellen einer Sicht erteilt wurde und er keine Berechtigung für die zu-grunde liegenden Tabellen hat. Die in diesem Fall erstellte Sicht würde jedoch kein Resultset zurückgeben.

Page 428: Programmieren Einer Microsoft SQL Server 2000-Datenbank

8 Unterrichtseinheit 8: Implementieren von Sichten

Sie geben den Inhalt einer Sicht mit Hilfe einer SELECT-Anweisung an. Von wenigen Einschränkungen abgesehen, können Sichten beliebig komplex sein. Spaltennamen müssen in den beiden folgenden Fällen angegeben werden:

� Spalten der Sicht basieren auf einem arithmetischen Ausdruck, einer integrierten Funktion oder einer Konstante.

� Spalten in zu verknüpfenden Tabellen haben identische Namen.

Beim Erstellen von Sichten muss die SELECT-Anweisung zum Definieren der Sicht unbedingt getestet werden, um sicherzustellen, dass SQL Server das erwartete Resultset zurückgibt. Erstellen Sie die Sicht erst, nachdem Sie die SELECT-Anweisung geschrieben und getestet sowie die Ergebnisse überprüft haben.

Einschränkungen beim Definieren von Sichten Beachten Sie beim Erstellen von Sichten die folgenden Einschränkungen:

� Die CREATE VIEW-Anweisung kann nicht die COMPUTE- oder COMPUTE BY-Klausel enthalten. Die CREATE VIEW-Anweisung kann nicht das Schlüsselwort INTO enthalten.

� Die CREATE VIEW-Anweisung kann die ORDER BY-Klausel nur ein-schließen, wenn das Schlüsselwort TOP verwendet wird.

� Sichten können nicht auf temporäre Tabellen verweisen. � Sichten können auf maximal 1.024 Spalten verweisen. � Die CREATE VIEW-Anweisung kann nicht mit anderen Transact-SQL-

Anweisungen in einem einzigen Batch zusammengefasst werden.

Mit der Sicht im folgenden Beispiel wird eine Spalte (Subtotal) erstellt, in der aus den Spalten UnitPrice, Quantity und Discount eine Zwischensumme für einen Auftrag berechnet wird.

CREATE VIEW dbo.OrderSubtotalsView (OrderID, Subtotal) ASSELECT OD.OrderID, SUM(CONVERT (money,(OD.UnitPrice*Quantity*(1- Discount)/100))*100) FROM [Order Details] OD GROUP BY OD.OrderID GO

In diesem Beispiel wird die Sicht abgefragt, um die Ergebnisse anzuzeigen.

SELECT * FROM OrderSubtotalsView

OrderID Subtotal

10271 48.0000 10977 2233.0000 10440 4924.1400 ...(830 row(s) affected)

Methodischer Hinweis Sie können Spaltennamen auf zwei Arten angeben: in der SELECT-Anweisung unter Verwendung des Spaltenalias oder in der CREATE VIEW-Anweisung.

Wichtig

Beispiel 1

Beispiel 2

Ergebnis

Page 429: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 8: Implementieren von Sichten 9

Beispiel: Sicht verknüpfter Tabellen

OrderIDOrderIDOrderID

1066310827104271045110515

1066310827104271045110515

CustomerIDCustomerIDCustomerIDBONAP BONAP PICCO QUICKQUICK

BONAP BONAP PICCO QUICKQUICK

~~~ ~~~ ~~~ ~~~ ~~~

~~~ ~~~ ~~~ ~~~ ~~~

RequiredDateRequiredDateRequiredDate1997-09-241998-01-261997-02-241997-03-051997-05-07

1997-09-241998-01-261997-02-241997-03-051997-05-07

ShippedDateShippedDateShippedDate1997-10-031998-02-061997-03-031997-03-121997-05-23

1997-10-031998-02-061997-03-031997-03-121997-05-23

Orders Customers

ShipStatusViewUSE NorthwindGOCREATE VIEW dbo.ShipStatusViewASSELECT OrderID, RequiredDate, ShippedDate,

ContactNameFROM Customers c INNER JOIN Orders o

ON c.CustomerID = o.CustomerIDWHERE RequiredDate < ShippedDate

USE NorthwindGOCREATE VIEW dbo.ShipStatusViewASSELECT OrderID, RequiredDate, ShippedDate,

ContactNameFROM Customers c INNER JOIN Orders o

ON c.CustomerID = o.CustomerIDWHERE RequiredDate < ShippedDate

CustomerIDCustomerIDCustomerIDBONAPPICCOQUICK

BONAPPICCOQUICK

CompanyNameCompanyNameCompanyNameBon app'Piccolo und mehrQUICK-Stop

Bon app'Piccolo und mehrQUICK-Stop

ContactNameContactNameContactNameLaurence LebihanGeorg PippsHorst Kloss

Laurence LebihanGeorg PippsHorst Kloss

OrderIDOrderIDOrderID102641027110280

102641027110280

1996-08-211996-08-291996-09-11

1996-08-211996-08-291996-09-11

ShippedDateShippedDateShippedDate1996-08-231996-08-301996-09-12

1996-08-231996-08-301996-09-12

ContactNameContactNameContactNameLaurence LebihanGeorg PippsHorst Kloss

Laurence LebihanGeorg PippsHorst Kloss

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Sie werden häufig Sichten erstellen, um sich Informationen aus zwei oder mehr verknüpften Tabellen an einem zentralen Ort ansehen zu können.

In diesem Beispiel verknüpft ShipStatusView die Customers- und Orders-Tabellen.

USE Northwind GOCREATE VIEW dbo.ShipStatusView ASSELECT OrderID, ShippedDate, ContactName FROM Customers c INNER JOIN Orders o ON c.CustomerID = o.CustomerID WHERE RequiredDate < ShippedDate

SELECT * FROM ShipStatusView

OrderID ShippedDate ContactName

10264 1996-08-23 Maria Larsson 10271 1996-08-30 Art Braunschweiger 10280 1996-09-12 Christina Berglund ...(37 row(s) affected)

ThemaGeben Sie ein Beispiel für eine Sicht von zwei oder mehr verknüpften Tabellen.

EinstiegSie können mehrere Typen von Sichten erstellen. Ein Typ ist eine Teilmenge von Spalten, wie in einer Folie weiter oben gezeigt wurde. Ein anderer, gebräuch-licherer Typ ist eine Sicht von zwei oder mehr ver-knüpften Tabellen.

Beispiel 1

Ergebnis

Page 430: Programmieren Einer Microsoft SQL Server 2000-Datenbank

10 Unterrichtseinheit 8: Implementieren von Sichten

Ändern und Löschen von Sichten

� Ändern von Sichten

� Beibehalten der zugewiesenen Berechtigungen

� Ermöglicht einer neuen SELECT-Anweisung und neuen Optionen, die existierende Definition zu ersetzen

� Löschen von Sichten

USE NorthwindGOALTER VIEW dbo.EmployeeViewAS SELECT LastName, FirstName, ExtensionFROM Employees

USE NorthwindGOALTER VIEW dbo.EmployeeViewASSELECT LastName, FirstName, ExtensionFROM Employees

DROP VIEW dbo.ShipStatusViewDROP VIEW dbo.ShipStatusView

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Sichten werden oft als Reaktion auf Anforderungen von Benutzern für zusätz-liche Informationen oder auf Änderungen in der zugrunde liegenden Tabellen-definition geändert.

Sie können eine Sicht ändern, indem Sie sie löschen und neu erstellen oder indem Sie die ALTER VIEW-Anweisung ausführen.

Ändern von Sichten Die ALTER VIEW-Anweisung ändert die Definition einer Sicht, einschließlich indizierter Sichten, und zwar ohne Auswirkungen auf abhängige gespeicherte Prozeduren oder Trigger. Damit haben Sie die Möglichkeit, die Berechtigungen für die Sicht beizubehalten. Für diese Anweisung gelten die gleichen Ein-schränkungen wie für die CREATE VIEW-Anweisung. Wenn Sie eine Sicht löschen und anschließend neu erstellen, müssen Sie ihr die Berechtigungen erneut zuweisen.

ALTER VIEW owner.view_name[(column [,...n ])][WITH {ENCRYPTION | SCHEMABINDING | VIEW_METADATA} [,...n]]AS select_statement [WITH CHECK OPTION]

Wenn Sie beim Erstellen der Sicht die Optionen WITH CHECK OPTION, WITH ENCRYPTION, WITH SCHEMABINDING oder WITH VIEW_METADATA verwenden, müssen Sie diese in die ALTER VIEW-Anweisung einbeziehen, falls Sie die von der Option bereitgestellte Funktiona-lität beibehalten möchten.

ThemaGeben Sie eine Einführung in das Ändern einer Sicht.

EinstiegEine Sicht kann geändert werden.

Syntax

Anmerkung

Page 431: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 8: Implementieren von Sichten 11

Im folgenden Beispiel wird EmployeeView geändert, um die Extension-Spalte hinzuzufügen.

USE Northwind GOALTER VIEW dbo.EmployeeView ASSELECT LastName, FirstName, Extension FROM Employees GOSELECT * from dbo.EmployeeView

LastName FirstName Extension

Davolio Nancy 5467 Fuller Andrew 3457 Leverling Janet 3355 ...(9 row(s) affected)

Wenn Sie eine Sicht mit einer SELECT *-Anweisung definieren und dann die Struktur der zugrunde liegenden Tabellen durch Hinzufügen von Spalten ändern, werden die neuen Spalten in der Sicht nicht angezeigt. Wenn in einer CREATE VIEW-Anweisung alle Spalten ausgewählt werden, wird die Spaltenliste nur beim ersten Erstellen der Sicht ausgewertet. Um die neuen Spalten der Sicht anzuzeigen, müssen Sie die Sicht ändern.

Löschen von Sichten Wenn Sie eine Sicht nicht mehr benötigen, können Sie deren Definition aus der Datenbank entfernen, indem Sie die DROP VIEW-Anweisung ausführen. Beim Löschen einer Sicht werden ihre Definition und alle ihr zugewiesenen Berech-tigungen entfernt. Wenn Benutzer Sichten abfragen, die auf die gelöschte Sicht verweisen, wird eine Fehlermeldung ausgegeben. Wird jedoch eine Tabelle ge-löscht, die auf eine Sicht verweist, so wird die Sicht nicht automatisch gelöscht. Diese muss explizit gelöscht werden.

Die Berechtigung zum Löschen einer Sicht wird standardmäßig dem Sichtbesitzer erteilt; sie ist nicht übertragbar. Dies ist die Standardein-stellung. Der Systemadministrator oder der Datenbankbesitzer kann jedoch durch Angabe des Besitzernamens in der DROP VIEW-Anweisung jedes beliebige Objekt löschen.

Beispiel

Abfrage

Ergebnis

AnmerkungMethodischer Hinweis Beim Erstellen der Sicht wird die Spaltenliste in der syscolumns-Tabelle gespeichert.

Anmerkung

Page 432: Programmieren Einer Microsoft SQL Server 2000-Datenbank

12 Unterrichtseinheit 8: Implementieren von Sichten

Vermeiden von unterbrochenen Besitzketten

GRANT SELECT ON view2 TO pierreGRANT SELECT ON view2 TO pierre

SELECT * FROM maria.view2SELECT * FROM maria.view2

� Abhängige Objekte mit verschiedenen Besitzern

� Beispiel:

Maria führt aus:

Pierre führt aus:

maria.view2

lucia.view1

lucia.table1

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

SQL Server ermöglicht es dem Besitzer des Originalobjekts, die Kontrolle über Personen zu behalten, die auf dieses Objekt zugreifen dürfen.

Abhängige Objekte mit verschiedenen Besitzern Sichtdefinitionen hängen von den zugrunde liegenden Objekten (Sichten oder Tabellen) ab. Diese Abhängigkeiten können als die Besitzkette verstanden werden. Wenn der Besitzer einer Sicht auch die zugrunde liegenden Objekte besitzt, muss er die Berechtigung nur für die Sicht erteilen. Bei Verwendung des Objekts werden Berechtigungen nur für die Sicht überprüft.

Um unterbrochene Besitzketten zu vermeiden, sollte der dbo-Benutzer alle Sichten besitzen. Bei Verwendung des Objekts werden die Berechtigungen für jedes abhängige Objekt mit einem anderen Besitzer überprüft.

Maria erstellt view2. Mit der folgenden Anweisung erteilt sie Pierre die Berech-tigung, diese Sicht abzufragen.

GRANT select ON view2 TO pierre

maria.view2 hängt jedoch von einem Objekt (view1) ab, das sich im Besitz einer anderen Benutzerin (Lucia) befindet. Die Berechtigungen werden für jedes abhängige Objekt mit einem anderen Besitzer überprüft.

Pierre fragt die Sicht mit der folgenden Anweisung ab:

SELECT * FROM maria.view2

Da maria.view2 von lucia.view1 abhängt, überprüft SQL Server die Berechti-gungen für maria.view2 und lucia.view1. Wenn Lucia Pierre die Berechtigung für view1 zuvor erteilt hat, kann Pierre auf diese Sicht zugreifen. Hat Lucia Pierre die Berechtigung nicht erteilt, wird der Zugriff verweigert und damit Lucia ermöglicht, die Kontrolle über Personen zu behalten, die auf die von ihr erstellten Objekte zugreifen dürfen.

ThemaStellen Sie das Konzept von Besitzketten vor.

EinstiegUm unterbrochene Besitz-ketten zu vermeiden, sollte der dbo-Benutzer alle Sichten besitzen.

Beispiel

Syntax

Syntax

Page 433: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 8: Implementieren von Sichten 13

Suchen von Informationen zur Sichtdefinition

� Suchen von Sichtdefinitionen

� Nicht verfügbar, wenn die Sicht mit der Option WITH ENCRYPTION erstellt wurde

� Suchen von Sichtabhängigkeiten

� Auflisten der Objekte, von denen die Sicht abhängt

� Auflisten der Objekte, die von der Sicht anhängen

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Möglicherweise möchten Sie die Definition einer Sicht sehen, um die Defini-tion zu ändern, oder Sie möchten verstehen, wie die Daten der Sicht aus den Basistabellen abgeleitet werden.

Suchen von Sichtdefinitionen Sie können Informationen zur Sichtdefinition mit SQL Server Enterprise Manager oder durch Abfragen der folgenden Sichten und Systemtabellen suchen.

Informationsschemasicht oder Systemtabelle Anzeige dieser Informationen

INFORMATION_SCHEMA.TABLES oder sysobjects Sichtnamen

INFORMATION_SCHEMA.VIEW_TABLE_USAGE oder sysdepends Basisobjektnamen

INFORMATION_SCHEMA.VIEWS oder syscomments Sichtdefinition

INFORMATION_SCHEMA.VIEW_COLUMN_USAGE oder syscolumns In einer Sicht definierte Spalten.

INFORMATION_SCHEMA.VIEW_TABLE_USAGE und INFORMATION_SCHEMA.VIEW_COLUMN_USAGE zeigen Infor-mationen nur für Ihren Benutzernamen an.

ThemaBeschreiben Sie, wie Infor-mationen zu Sichten ange-zeigt werden.

EinstiegWährend des Erstellens, Änderns oder Löschens von Tabellen können Sie Informationen zu den Sichten Ihrer Datenbank anzeigen.

Anmerkung

Page 434: Programmieren Einer Microsoft SQL Server 2000-Datenbank

14 Unterrichtseinheit 8: Implementieren von Sichten

Um den zum Erstellen einer Sicht verwendeten Text anzuzeigen, verwenden Sie SQL Server Enterprise Manager, fragen INFORMATION_SCHEMA.VIEWS ab oder führen die gespeicherte Systemprozedur sp_helptext mit dem Sichtnamen als Parameter aus.

sp_helptext objname

Suchen von Sichtabhängigkeiten Zum Abrufen eines Berichts der Tabellen oder Sichten, von denen eine Sicht abhängt, und der Objekte, die von einer bestimmten Sicht abhängen, verwenden Sie SQL Server Enterprise Manager oder führen die gespeicherte System-prozedur sp_depends aus.

Sie sollten die Abhängigkeiten anzeigen, bevor Sie ein Objekt löschen. Bevor Sie eine Tabelle ändern oder löschen, ermitteln Sie mit Hilfe der gespeicherten Systemprozedur sp_depends, ob Objekte auf die Tabelle verweisen.

sp_depends objname

Syntax

Methodischer Hinweis Führen Sie vor, wie Abhän-gigkeitsinformationen mit Hilfe von SQL Server Enterprise Manager ange-zeigt werden.

Syntax

Page 435: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 8: Implementieren von Sichten 15

Verbergen von Sichtdefinitionen

� Verwenden der Option WITH ENCRYPTION

� Keine Einträge der „syscomments“-Tabelle löschen

USE NorthwindGOCREATE VIEW dbo.[Order Subtotals]

WITH ENCRYPTIONASSELECT OrderID,Sum(CONVERT(money,(UnitPrice*Quantity*(1-Discount)/100))*100)AS Subtotal

FROM [Order Details]GROUP BY OrderIDGO

USE NorthwindGOCREATE VIEW dbo.[Order Subtotals]

WITH ENCRYPTIONASSELECT OrderID,Sum(CONVERT(money,(UnitPrice*Quantity*(1-Discount)/100))*100)AS Subtotal

FROM [Order Details]GROUP BY OrderIDGO

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Da Benutzer die Definition einer Sicht mit SQL Server Enterprise Manager oder durch Abfragen von INFORMATION_SCHEMA.VIEWS oder der syscomments-Systemtabelle anzeigen können, kann es sinnvoll sein, bestimmte Sichtdefinitionen zu verbergen.

Verwenden der Option WITH ENCRYPTION Sie können die Einträge der syscomments-Tabelle verschlüsseln, die den Text der CREATE VIEW-Anweisung enthalten, indem Sie in der Sichtdefinition die Option WITH ENCRYPTION angeben.

Stellen Sie vor dem Verschlüsseln einer Sicht sicher, dass die Sichtdefinition (Skript) in einer Datei gespeichert wird. Um den Text einer Sicht zu entschlüs-seln, müssen Sie die Sicht löschen und anschließend neu erstellen oder die Sicht ändern und die Originalsyntax verwenden.

In diesem Beispiel wird dbo.[Order Subtotals] mit Hilfe der Option WITH ENCRYPTION erstellt, sodass die Sichtdefinition verborgen wird.

USE Northwind GOCREATE VIEW dbo.[Order Subtotals] WITH ENCRYPTION ASSELECT OrderID, Sum(CONVERT(money,(UnitPrice*Quantity*(1-Discount)/100))*100) AS Subtotal FROM [Order Details] GROUP BY OrderID GO

ThemaErläutern Sie, wie Sicht-definitionen verschlüsselt werden.

EinstiegSie können die Definition von Sichten verschlüsseln, um die Details der von der Sicht abgefragten Basis-tabellen zu verbergen.

Beispiel

Page 436: Programmieren Einer Microsoft SQL Server 2000-Datenbank

16 Unterrichtseinheit 8: Implementieren von Sichten

Keine Einträge der „syscomments“-Tabelle löschen Wenn die Sichtdefinition für Benutzer aus Sicherheitsgründen nicht verfügbar sein soll, verschlüsseln Sie die Sicht. Löschen Sie niemals Einträge aus der syscomments-Tabelle. Dies würde Sie daran hindern, die Sicht zu verwenden, und es würde SQL Server daran hindern, die Sicht neu zu erstellen, wenn Sie eine Datenbank auf eine neuere SQL Server-Version aktualisieren.

Page 437: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 8: Implementieren von Sichten 17

Ändern von Daten mit Hilfe von Sichten

� Können sich auf maximal eine zugrunde liegende Tabelle auswirken

� Können in bestimmten Spalten nicht vorgenommen werden

� Können Fehler verursachen, wenn sich Änderungen auf Spalten auswirken, auf die in der Sicht nicht verwiesen wird

� Werden überprüft, wenn die Option WITH CHECK OPTION in der Sichtdefinition angegeben wurde

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Sichten verwalten keine separate Kopie von Daten. Stattdessen zeigen sie das Resultset einer Abfrage für eine oder mehrere Basistabellen an. Deshalb ändern Sie bei jeder Änderung von Daten in einer Sicht in Wirklichkeit die Basis-tabelle.

Von einigen Einschränkungen abgesehen, können Sie Tabellendaten über eine Sicht frei einfügen, aktualisieren oder löschen. Im Allgemeinen muss die Sicht für eine einzelne Tabelle definiert werden und darf keine Aggregatfunktionen oder GROUP BY-Klauseln in der SELECT-Anweisung enthalten.

Speziell gelten für Änderungen, die unter Verwendung von Sichten vorgenom-men werden, folgende Aspekte:

� Können sich auf maximal eine zugrunde liegende Tabelle auswirken. Sie können Sichten ändern, die auf zwei oder mehr Tabellen basieren, doch jede Aktualisierung oder Änderung kann sich nur auf eine Tabelle aus-wirken.

� Können in bestimmten Spalten nicht vorgenommen werden. SQL Server erlaubt nicht das Ändern einer Spalte, die das Ergebnis einer Berechnung ist. Dies sind z. B. Spalten, die berechnete Werte, eingebaute Funktionen oder Zeilenaggregatfunktionen enthalten.

� Können Fehler verursachen, wenn sich Änderungen auf Spalten auswirken, auf die in der Sicht nicht verwiesen wird. So erhalten Sie beispielsweise eine Fehlermeldung, wenn Sie eine Zeile in eine Sicht einfügen, die für eine Tabelle definiert ist, welche Spalten enthält, auf die in der Sicht nicht verwiesen wird und die weder NULL-Werte zulassen noch Standardwerte aufweisen.

ThemaStellen Sie die Aspekte vor, die die Kursteilnehmer berücksichtigen müssen, wenn sie Daten mit Hilfe von Sichten ändern.

EinstiegDatenänderungen, die Sie unter Verwendung einer Sicht vornehmen, ändern die zugrunde liegenden Tabellen.

Page 438: Programmieren Einer Microsoft SQL Server 2000-Datenbank

18 Unterrichtseinheit 8: Implementieren von Sichten

� Werden überprüft, wenn die Option WITH CHECK OPTION in der Sicht-definition angegeben wurde. Die Option WITH CHECK OPTION zwingt alle für die Sicht ausgeführten Datenänderungsanweisungen, bestimmte Kriterien einzuhalten. Diese Kriterien werden in der SELECT-Anweisung festgelegt, die die Sicht definiert. Wenn die geänderten Werte außerhalb des Bereichs der Sichtdefinition liegen, weist SQL Server die Änderungen zurück.

Page 439: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 8: Implementieren von Sichten 19

���� Optimieren der Leistung mit Hilfe von Sichten

� Leistungsaspekte

� Verwenden von indizierten Sichten

� Verwenden von Sichten zum Partitionieren von Daten

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

In diesem Abschnitt werden Leistungsaspekte bei der Verwendung von Sichten beschrieben. Weiter wird erläutert, wie Sichten zur Leistungsoptimierung bei-tragen, indem sie das Ergebnis komplexer Abfragen speichern und Daten partitionieren.

ThemaErläutern Sie, wie die Leistung durch Verwenden von Sichten optimiert wird.

EinstiegIn diesem Abschnitt wird erläutert, wie die Leistung durch Verwenden von Sichten optimiert wird.

Page 440: Programmieren Einer Microsoft SQL Server 2000-Datenbank

20 Unterrichtseinheit 8: Implementieren von Sichten

Leistungsaspekte

USE NorthwindGOCREATE VIEW dbo.TopSalesViewASSELECT *FROM dbo.TotalPurchaseViewWHERE Subtotal > 50000GO

USE NorthwindGOCREATE VIEW dbo.TopSalesViewASSELECT *FROM dbo.TotalPurchaseViewWHERE Subtotal > 50000GO

TotalPurchaseViewTotalPurchaseTotalPurchaseViewView

11 ~~ ~~ ~~ ~~

22 ~~ ~~ ~~ ~~

33 ~~ ~~ ~~ ~~

44 ~~ ~~ ~~ ~~

55 ~~ ~~ ~~ ~~

66 ~~ ~~ ~~ ~~

CustomersCustomersCustomers11 ~~ ~~ ~~ nn

22 ~~ ~~ ~~ nn

33 ~~ ~~ ~~ yy

44 ~~ ~~ ~~ yy

55 ~~ ~~ ~~ nn

66 ~~ ~~ ~~ yy

OrdersOrdersOrders11 ~~ ~~ ~~ nn

22 ~~ ~~ ~~ nn

33 ~~ ~~ ~~ yy

44 ~~ ~~ ~~ yy

55 ~~ ~~ ~~ nn

66 ~~ ~~ ~~ yy

Order DetailsOrder DetailsOrder Details11 ~~ ~~ ~~ ~~

22 ~~ ~~ ~~ ~~

33 ~~ ~~ ~~ ~~

44 ~~ ~~ ~~ ~~

55 ~~ ~~ ~~ ~~

66 ~~ ~~ ~~ ~~

SELECT *FROM dbo.TopSalesWHERE CompanyName = 'Ernst Handel'

SELECT *FROM dbo.TopSalesWHERE CompanyName = 'Ernst Handel'

TopSalesViewTopSalesViewTopSalesView

~~ ~~ ~~

~~ ~~ ~~

~~ ~~ ~~

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Wenn Sichten, die mehrere Tabellen verknüpfen und komplexe Ausdrücke auswerten, in einer anderen Sicht geschachtelt werden, ist die eigentliche Quelle von Leistungsproblemen möglicherweise schwer zu ermitteln. Aus diesem Grund empfiehlt es sich, separate Sichtdefinitionen zu erstellen, statt Sichten zu schachteln.

Im folgenden Beispiel fragt TopSalesView eine Teilmenge von Zeilen aus TotalPurchaseView ab.

USE Northwind GOCREATE VIEW dbo.TopSalesView ASSELECT * FROM dbo.TotalPurchaseView WHERE Subtotal > 50000 GO

Die Sichtdefinition von dbo.TopSalesView verbirgt die Komplexität der zugrunde liegenden Abfrage zum Erstellen von TotalPurchaseView, die drei Basistabellen miteinander verknüpft.

ThemaErläutern Sie, wie eine Sicht erstellt wird, die eine andere Sicht enthält.

EinstiegWenn Sie bereits erledigte Arbeiten weiterverwenden möchten, können Sie eine Sicht von einer anderen Sicht erstellen. Dabei sollten Sie jedoch mögliche Leistungsprobleme berücksichtigen.

Beispiel

Methodischer Hinweis Stellen Sie folgende Frage: Wie tief können Sichten ineinander geschachtelt werden?

Antwort: Die einzige Grenze sind die verfügbaren Ressourcen. Schachteln Sie jedoch maximal drei Ebenen, um zu vermeiden, dass mögliche Leistungs-probleme auftreten.

Page 441: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 8: Implementieren von Sichten 21

USE Northwind GOCREATE VIEW dbo.TotalPurchaseView ASSELECT CompanyName, Sum(CONVERT(money, (UnitPrice*Quantity*(1-Discount)/100))*100) AS Subtotal FROM Customers c INNER JOIN Orders o ON c.CustomerID=o.CustomerID INNER JOIN [Order Details] od ON o.OrderID = od.OrderID GROUP BY CompanyName GO

Wenn bei Benutzern Leistungsprobleme auftreten, während sie die folgende Abfrage zum Auflisten der verfügbaren französischen Bücher ausführen, ist die Problemquelle nicht ohne weiteres sichtbar.

SELECT * FROM dbo.TopSalesView WHERE CompanyName = 'Ernst Handel'

CompanyName Subtotal

Ernst Handel 104874.98

(1 row(s) affected)

Abfrage

Ergebnis

Page 442: Programmieren Einer Microsoft SQL Server 2000-Datenbank

22 Unterrichtseinheit 8: Implementieren von Sichten

Verwenden von indizierten Sichten

� Indizierte Sichten speichern das Resultset in der Datenbank

� Erstellen von indizierten Sichten

� Richtlinien für das Erstellen von indizierten Sichten

Verwenden wenn:

� Leistungsverbesserungen wiegen mehr als Verwaltungskosten

� Zugrunde liegende Daten werden selten aktualisiert

� Abfragen führen einen erheblichen Anteil an Verknüpfungen und Aggregationen aus

� Einschränkungen beim Erstellen von indizierten Sichten

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Sie können Indizes für Sichten erstellen. Eine indizierte Sicht speichert das Ergebnis einer Sicht in der Datenbank. Aufgrund der kurzen Abrufzeit können Sie mit indizierten Sichten die Abfrageleistung verbessern.

Erstellen von indizierten Sichten Eine indizierte Sicht wird erstellt, indem Sie einen eindeutigen gruppierten (UNIQUE CLUSTERED)-Index für eine Sicht implementieren. Das Ergebnis der Sicht wird in den Seiten auf Blattebene des gruppierten Indexes gespeichert. Nachdem Sie den UNIQUE CLUSTERED-Index erstellt haben, können Sie weitere Indizes für diese Sicht erstellen.

Eine indizierte Sicht spiegelt automatisch Änderungen wieder, die an den Daten in den Basistabellen vorgenommen werden. So wie sich Daten ändern, wird der UNIQUE CLUSTERED-Index aktualisiert.

Richtlinien für das Erstellen von indizierten Sichten Der Abfrageoptimierer ermittelt automatisch, ob eine Abfrage von einer indi-zierten Sicht profitiert. Die Ermittlung ist selbst dann möglich, wenn die Ab-frage nicht auf die indizierte Sicht verweist. Lassen Sie grundsätzlich zu, dass der Abfrageoptimierer bestimmen kann, wann indizierte Sichten verwendet werden sollen.

Mit dem Indexoptimierungs-Assistenten können Sie die beste Mischung aus Indizes und indizierten Sichten zur Optimierung der Abfrageleistung erheblich besser bestimmen.

ThemaBeschreiben Sie indizierte Sichten.

EinstiegSie können Indizes für Sichten erstellen.

Page 443: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 8: Implementieren von Sichten 23

Erstellen Sie indizierte Sichten unter folgenden Voraussetzungen:

� Die Leistungsverbesserungen aufgrund der Geschwindigkeitssteigerung beim Abrufen von Ergebnissen wiegen mehr als die erhöhten Verwaltungs-kosten.

� Die zugrunde liegenden Daten werden selten aktualisiert. � Abfragen führen einen erheblichen Anteil an Verknüpfungen und Aggrega-

tionen aus, in denen viele Zeilen verarbeitet werden oder die häufig von vielen Benutzern ausgeführt werden.

Einschränkungen beim Erstellen von indizierten Sichten Beachten Sie beim Erstellen von indizierten Sichten die folgenden Richtlinien:

� Der erste Index, den Sie für eine Sicht erstellen, muss ein eindeutiger gruppierter Index sein.

� Sie müssen die Sicht mit der Option SCHEMABINDING erstellen. � Die Sicht kann auf Basistabellen verweisen, aber nicht auf andere Sichten. � Sie müssen bei Verweisen auf Tabellen und benutzerdefinierte Funktionen

zweiteilige Namen verwenden. � Nachfolgende Verbindungen müssen über dieselben Optionseinstellungen

verfügen, um die indizierte Sicht zu verwenden.

Sie sollten die IsIndexable-Eigenschaft der OBJECTPROPERTY-Funktion verwenden, um sicherzustellen, dass eine Sicht indiziert werden kann.

Anmerkung

Page 444: Programmieren Einer Microsoft SQL Server 2000-Datenbank

24 Unterrichtseinheit 8: Implementieren von Sichten

Verwenden von Sichten zum Partitionieren von Daten

� Sie können Sichten verwenden, um Daten auf mehrere Datenbanken oder SQL Server-Instanzen zu verteilen

� Verwenden von Sichten zur Datenpartitionierung durch SQL Server

� So verbessern partitionierte Sichten die Leistung

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Sie können Sichten verwenden, um Daten auf mehrere Datenbanken oder auf mehrere SQL Server-Instanzen zu verteilen und dadurch die Leistung zu ver-bessern.

Verwenden von Sichten zur Datenpartitionierung durch SQL Server Sie können den UNION-Mengenoperator in einer Sicht verwenden, um die Ergebnisse mehrerer Abfragen von separaten Tabellen in einem Resultset zusammenzufassen. Dieses Resultset wird dem Benutzer als eine einzige Tabelle angezeigt, die als partitionierte Sicht bezeichnet wird. Sie können partitionierte Sichten aktualisieren, auch wenn sie auf mehrere Tabellen verweisen.

Partitionierte Sichten können auf Daten aus mehreren heterogenen Quellen, wie z. B. aus Remoteservern, und nicht nur auf Tabellen in derselben Datenbank basieren. Auf diese Weise können Sie die Datenbankverarbeitung auf eine Gruppe von Servern verteilen. Die Servergruppe ist in der Lage, die Verarbei-tungsanforderungen von umfangreichen E-Commerce-Anwendungen oder Unternehmensrechenzentren zu erfüllen.

ThemaGeben Sie eine Einführung in partitionierte Sichten.

EinstiegSie können Sichten ver-wenden, um Daten auf mehrere Datenbanken oder auf mehrere SQL Server-Instanzen zu verteilen.

Page 445: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 8: Implementieren von Sichten 25

So verbessern partitionierte Sichten die Leistung Wenn sich die Tabellen in einer partitionierten Sicht auf verschiedenen Servern oder auf einem Computer mit mehreren Prozessoren befinden, können alle an der Abfrage beteiligten Tabellen parallel gescannt werden, was die Abfrage-leistung verbessert. Darüber hinaus können Verwaltungsaufgaben, wie z. B. das Neuerstellen von Indizes oder das Sichern einer Tabelle, schneller ausgeführt werden.

Sie können keinen Index für eine partitionierte Sicht erstellen. Die Sichtdefinition, die zum Erstellen einer indizierten Sicht erforderlich ist, erlaubt nur zweiteilige Namen. Eine partitionierte Sicht setzt dagegen die Verwendung von drei- oder vierteiligen Namen voraus, wie z. B. Servername.databasename.ownername.objectname.

Anmerkung

Page 446: Programmieren Einer Microsoft SQL Server 2000-Datenbank

26 Unterrichtseinheit 8: Implementieren von Sichten

Empfohlene Methoden

Der „dbo“-Benutzer sollte alle Sichten besitzenDer „dbo“-Benutzer sollte alle Sichten besitzen

Überprüfen der Objektabhängigkeiten vor demLöschen von ObjektenÜberprüfen der Objektabhängigkeiten vor demLöschen von Objekten

Überlegen Sie genau, ob Sichten auf der Basis von Sichtenerstellt werden sollenÜberlegen Sie genau, ob Sichten auf der Basis von Sichtenerstellt werden sollen

Löschen Sie niemals Einträge aus der „syscomments“-TabelleLöschen Sie niemals Einträge aus der „syscomments“-Tabelle

Verwenden einer Standard-BenennungskonventionVerwenden einer Standard-Benennungskonvention

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Die folgenden empfohlenen Methoden sollen Ihnen beim Verwenden und Ver-walten von Sichten in Datenbanken behilflich sein:

� Sie sollten eine konsistente Benennungskonvention entwickeln, um Sichten von Tabellen zu unterscheiden.

� Geben Sie beim Erstellen von Sichten dbo als Besitzer an. Das Konto dbosollte alle Objekte besitzen, auf die in der Sichtdefinition verwiesen wird. Damit vermeiden Sie, beim Abfragen der Sicht den Besitzernamen angeben zu müssen, weil der Datenbankbesitzer der Standardbesitzer ist. Der Daten-bankbesitzer hat auch die Berechtigung für alle zugrunde liegenden Objekte in der Datenbank, wodurch mögliche unterbrochene Besitzketten vermieden werden.

� Überprüfen Sie die Objektabhängigkeiten, bevor Sie Objekte aus der Daten-bank löschen. Führen Sie die gespeicherte Systemprozedur sp_depends aus, oder zeigen Sie die Abhängigkeiten in SQL Server Enterprise Manager an, um sicherzustellen, dass keine Abhängigkeiten für ein zu löschendes Objekt bestehen.

� Löschen Sie niemals Einträge in der syscomments-Systemtabelle. Wenn die Definition für andere Benutzer in einer Anwendung unsichtbar sein soll, beziehen Sie die Option WITH ENCRYPTION in die CREATE VIEW- bzw. die ALTER VIEW-Anweisung ein. Speichern Sie Ihre Skriptdefini-tion, bevor Sie das Skript verschlüsseln.

� Überlegen Sie es sich genau, ob Sichten auf der Basis von Sichten erstellt werden sollen. Dies könnte Komplexitäten verbergen und so zu Leistungs-problemen führen.

ThemaErläutern Sie die empfoh-lenen Methoden zur Ver-wendung von Sichten.

EinstiegDie folgenden Methoden zur Verwendung von Sichten werden empfohlen.

Page 447: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 8: Implementieren von Sichten 27

Zusätzliche Informationen zu den folgenden Themen erhalten Sie in der SQL Server-Onlinedokumentation.

Thema Suchbegriffe

CREATE VIEW "create view"

ALTER VIEW "alter view"

DROP VIEW "drop view"

Unterbrochene Besitzketten Besitzketten

SQL-Skripts generieren "Dokumentieren und Erstellen von Skripts einer Datenbank"

Page 448: Programmieren Einer Microsoft SQL Server 2000-Datenbank

28 Unterrichtseinheit 8: Implementieren von Sichten

Übungseinheit A: Implementieren von Sichten

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

LernzieleAm Ende dieser Übungseinheit werden Sie in der Lage sein, die folgenden Aufgaben auszuführen:

� Erstellen einer Sicht mit Hilfe eines Assistenten. � Ändern einer Sicht, um die Sichtdefinition zu verschlüsseln. � Ändern einer Sicht mit Hilfe der Option WITH CHECK OPTION. � Verwenden von Informationsschemas, um Informationen über Sichten zu

erhalten.

VoraussetzungenUm diese Übungseinheit zu bearbeiten, benötigen Sie Folgendes:

� Die Skriptdateien für diese Übungseinheit, die sich in C:\Moc\2328A\Labfiles\L08 befinden.

� Antwortdateien für diese Übungseinheit, die sich in C:\Moc\2328A\Labfiles\L08\Answers befinden.

Einrichten der ÜbungseinheitUm diese Übungseinheit zu bearbeiten, ist eine der folgenden Aktionen erforderlich:

� Bearbeiten der vorherigen Übungseinheit. � Ausführen der Batchdatei C:\Moc\2328A\Batches\Restore08.cmd.

Mit dieser Befehlsdatei wird die ClassNorthwind-Datenbank wieder in den Zustand zurückversetzt, der für diese Übungseinheit erforderlich ist.

ThemaGeben Sie eine Einführung in die Übungseinheit.

EinstiegIn dieser Übungseinheit erstellen, testen und ändern Sie Sichten.

Erläutern Sie die Lernziele der Übungseinheit.

Page 449: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 8: Implementieren von Sichten 29

Weitere Informationen Sollten Sie beim Ausführen von Dateien Hilfe benötigen, suchen Sie in der Hilfe von SQL Query Analyzer nach „Ausführen einer Abfrage“.

Daneben sind die folgenden Informationsquellen verfügbar:

� Das Northwind-Datenbankschema. � Die Microsoft SQL Server-Onlinedokumentation.

SzenarioDer Aufbau des Schulungsraumes soll die Organisation des weltweit agieren-den Handelsunternehmens Northwind Traders widerspiegeln. Das Unternehmen hat den fiktiven Domänennamen nwtraders.msft. Der primäre DNS-Server für nwtraders.msft ist der Kursleitercomputer, dessen IP-Adresse (Internetproto-koll) 192.168.x.200 lautet (wobei x die zugewiesene Schulungsraumnummer ist). Der Name des Kursleitercomputers ist London.

Die folgende Tabelle stellt den Benutzernamen, den Computernamen und die IP-Adresse für jeden Kursteilnehmercomputer in der fiktiven Domäne nwtraders.msft bereit. Suchen Sie den Ihrem Computer zugewiesenen Benutzernamen und notieren Sie ihn.

Benutzername Computername IP-Adresse

SQLAdmin1 Vancouver 192.168.x.1SQLAdmin2 Denver 192.168.x.2SQLAdmin3 Perth 192.168.x.3SQLAdmin4 Brisbane 192.168.x.4SQLAdmin5 Lisbon 192.168.x.5SQLAdmin6 Bonn 192.168.x.6SQLAdmin7 Lima 192.168.x.7SQLAdmin8 Santiago 192.168.x.8SQLAdmin9 Bangalore 192.168.x.9SQLAdmin10 Singapore 192.168.x.10SQLAdmin11 Casablanca 192.168.x.11SQLAdmin12 Tunis 192.168.x.12SQLAdmin13 Acapulco 192.168.x.13SQLAdmin14 Miami 192.168.x.14SQLAdmin15 Auckland 192.168.x.15SQLAdmin16 Suva 192.168.x.16SQLAdmin17 Stockholm 192.168.x.17SQLAdmin18 Moscow 192.168.x.18SQLAdmin19 Caracas 192.168.x.19SQLAdmin20 Montevideo 192.168.x.20SQLAdmin21 Manila 192.168.x.21SQLAdmin22 Tokyo 192.168.x.22SQLAdmin23 Khartoum 192.168.x.23SQLAdmin24 Nairobi 192.168.x.24

Veranschlagte Zeit für die Übungseinheit: 30 Minuten

Page 450: Programmieren Einer Microsoft SQL Server 2000-Datenbank

30 Unterrichtseinheit 8: Implementieren von Sichten

Übung 1 Erstellen und Testen von Sichten

In dieser Übung erstellen Sie Sichten, mit denen die täglichen Anforderungen an die ClassNorthwind-Datenbank verwaltet werden können. Hierzu verwen-den Sie den Sichterstellungs-Assistenten und führen ein Skript aus, das mehrere Sichten erstellt. Zum Schluss fragen Sie die Sichten ab, um zu überprüfen, ob die erwarteten Ergebnisse erzielt wurden.

� So verwenden Sie den Sichterstellungs-Assistenten In diesem Verfahren verwenden Sie den Sichterstellungs-Assistenten, um schnell eine Sicht zu erstellen. 1. Melden Sie sich mit Hilfe der Informationen in der folgenden Tabelle an der

Schulungsraumdomäne nwtraders an.

Option Eingabe

Benutzername SQLAdminx (wobei x die Ihrem Computernamen zugewiesene Nummer ist, wie in der Schulungsraumdomäne nwtraders.msftfestgelegt)

Kennwort password

2. Öffnen Sie SQL Server Enterprise Manager. 3. Klicken Sie in der Konsolenstruktur auf den Server. 4. Klicken Sie im Menü Extras auf Assistenten.5. Erweitern Sie Datenbank, und doppelklicken Sie auf Sichterstellungs-

Assistent.6. Erstellen Sie mit Hilfe der Informationen in der nachstehenden Tabelle eine

Sicht, die alle Produkte eines bestimmten Lieferanten auflistet.

Option Eingabe

Datenbank auswählen ClassNorthwind

Tabellen auswählen Products

Spalten auswählen ProductID, ProductName, SupplierID, CategoryID, QuantityPerUnit, UnitPrice, Discontinued

Beschränkung definieren WHERE SupplierID = 14

Sicht benennen FormaggiProductsView

7. Fragen Sie die Sicht ab, um sicherzustellen, dass das erwartete Resultset erzielt wurde.

Page 451: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 8: Implementieren von Sichten 31

� So erstellen Sie Sichten mit einem Skript Bei diesem Verfahren führen Sie ein Skript zum Erstellen von Sichten aus. 1. Öffnen Sie SQL Query Analyzer und melden Sie sich gegebenenfalls mit

Microsoft Windows®-Authentifizierung am (lokalen) Server an. Sie sind berechtigt, sich an SQL Server anzumelden und SQL Server zu verwalten, da Sie als SQLAdminx angemeldet und damit Mitglied der lokalen Administratorgruppe von Microsoft Windows 2000 sind. Alle Mitglieder dieser Gruppe werden automatisch der sysadmin-Rolle von SQL Server zugeordnet.

2. Öffnen Sie Labfiles\L08\CreaView.sql, sehen Sie sich das Skript an und führen Sie es aus, um die folgenden Sichten zu erstellen.

Sichtname Sichtbeschreibung

Customer and Suppliers by City

Alle Kunden und Lieferanten (UNION).

Current Product List Alle geführten Produkte.

Orders Qry Alle Kundenaufträge und Auftragsdaten.

Products Above Average Price

Alle Produkte, deren Preis über dem durchschnitt-lichen Produkteinheitenpreis liegt.

Products by Category Alle Produkte sind nach Kategorie aufgeführt.

Invoices Alle Rechnungsdaten.

Order Details Extended Alle Auftragsdaten mit erweiterten Preisinfor-mationen.

Sales by Category Alle Verkäufe im Jahr 1997, aufgeschlüsselt nach Kategorien.

3. Öffnen Sie ein neues Abfragefenster, und führen Sie die gespeicherte Sys-temprozedur sp_depends aus. Listen Sie die Tabellen , von denen die Order Details Extended-Sicht abhängt, sowie die Objekte auf, die von Order Details Extended abhängen. Tabellen: „Order details“ und „Products“. Sicht: „Sales by Category“. ____________________________________________________________

____________________________________________________________

4. Wechseln Sie zu SQL Server Enterprise Manager, um die Abhängigkeiten von der Orders-Tabelle zu ermitteln.

5. Erweitern Sie in der Konsolenstruktur die ClassNorthwind-Datenbank, und klicken Sie dann auf Tabellen.

Page 452: Programmieren Einer Microsoft SQL Server 2000-Datenbank

32 Unterrichtseinheit 8: Implementieren von Sichten

6. Klicken Sie im Detailbereich mit der rechten Maustaste auf die Orders-Tabelle, klicken Sie im Kontextmenü auf Alle Tasks, und klicken Sie dann auf Abhängigkeiten anzeigen.Welche Objekte sind von der Orders-Tabelle abhängig? Sichten: „Invoices“, „Orders Qry“, „Product Sales for 1997“, „Quarterly Orders“, „Sales by Category“, „Summary of sales by quarter“, „Summary of sales by year“ und „Sales Totals by Amount“. Gespeicherte Prozeduren: „Employee sales by country“. ____________________________________________________________

____________________________________________________________

Page 453: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 8: Implementieren von Sichten 33

Übung 2 Verschlüsseln einer Sichtdefinition

In dieser Übung ändern Sie eine Sicht, um deren Definition zu verschlüsseln, damit sie unsichtbar ist.

� So ändern und verschlüsseln Sie die „Sales by Category“-Sicht Bei diesem Verfahren zeigen Sie mit Hilfe von SQL Server Enterprise Manager das Skript an, mit dem die Sales by Category-Sicht erstellt wurde. Anschlie-ßend ändern Sie die Sicht, um das Skript zu verschlüsseln. L08\Answers\EncryptView.sql ist das vollständige Skript für dieses Verfahren. 1. Öffnen Sie in der SQL Server-Onlinedokumentation das Thema „Generie-

ren eines Skripts (Enterprise Manager)“. 2. Verwenden Sie die darin enthaltene Prozedur zum Generieren eines Skripts

für die Sales by Category-Sicht. 3. Speichern Sie das Skript unter SaleByCatView.sql.

Wenn Sie beim Generieren des Skripts die Eigenschaften der Sicht anzeigen oder die Vorschau wählen, können Sie die Sichtdefinition kopieren und zur Änderung in ein Abfragefenster einfügen.

4. Überarbeiten Sie das Skript in einem Abfragefenster, um die Sales by Category-Sicht so zu ändern, dass sie mit der Option WITH ENCRYPTION erstellt wird.

5. Führen Sie das überarbeitete Skript zum Ändern von Sales by Categoryaus.

6. Speichern Sie das Skript unter SaleByCatView.sql.

Anmerkung

Page 454: Programmieren Einer Microsoft SQL Server 2000-Datenbank

34 Unterrichtseinheit 8: Implementieren von Sichten

� So testen Sie, ob die Anweisungen verschlüsselt wurden Bei diesem Verfahren verwenden Sie die gespeicherte Systemprozedur sp_helptext und SQL Server Enterprise Manager, um die Auswirkung der ver-wendeten Verschlüsselungsoption anzuzeigen. 1. Führen Sie die gespeicherte Systemprozedur sp_helptext zur Anzeige des

Skripts aus, mit dem Sales by Category erstellt wurde. Das Ergebnisfenster zeigt folgende Meldung an: Der Objektkommentar wurde verschlüsselt.

2. Klicken Sie im Detailbereich von SQL Server Enterprise Manager mit der rechten Maustaste auf Sales by Category, und klicken Sie dann auf Eigen-schaften.Wird die CREATE VIEW-Syntax angezeigt, mit der Sales by Categoryerstellt wurde? Nein. Die Syntax ist verschlüsselt. ____________________________________________________________

3. Wie würden Sie die Sales by Category-Sicht entschlüsseln? Durch Ändern der Sicht und Einbeziehen der Originalsyntax, ohne die Option WITH ENCRYPTION. Hierbei wird vorausgesetzt, dass Sie das Skript mit der Originalsyntax zuvor gespeichert haben. ____________________________________________________________

Page 455: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 8: Implementieren von Sichten 35

Übung 3 Ändern von Daten unter Verwendung von Sichten

In dieser Übung ändern Sie FormaggiProductsView, um WITH CHECK OPTION einzubeziehen, damit nur solche Datenänderungen vorgenommen werden können, die die Sichtdefinition einhalten.

� So ändern Sie „FormaggiProductsView“ zum Aktivieren von WITH CHECK OPTION

In diesem Verfahren ändern Sie FormaggiProductsView, um WITH CHECK OPTION zu aktivieren. Answer_Update1.sql ist das vollständige Skript für dieses Verfahren. 1. Generieren Sie ein Skript für die FormaggiProductsView-Sicht. 2. Ändern Sie das Skript, um WITH CHECK OPTION zu aktivieren. 3. Führen Sie das Skript aus, und speichern Sie die Datei mit den Änderungen.

� So aktualisieren Sie die „title“-Tabelle mit Hilfe der „FormaggiProductsView“-Sicht

In diesem Verfahren aktualisieren Sie die Products-Tabelle mit Daten, die außerhalb der FormaggiProductsView-Sicht liegen. Anschließend zeigen Sie die Ergebnisse an. 1. Schreiben Sie eine UPDATE-Anweisung, um in FormaggiProductsView

die Produkte mit der Product ID 31 des Lieferanten 12 und nicht mehr des Lieferanten 14 aufzulisten. UPDATE dbo.FormaggiProductsView SET SupplierID = 12 WHERE ProductID = 31

2. Führen Sie die UPDATE-Anweisung aus. Wie lautet das Ergebnis? Server: Nachr.-Nr. 550: Fehler beim Einfügen oder Aktualisieren, da die Zielsicht WITH CHECK OPTION angibt oder sich auf eine Sicht erstreckt, die WITH CHECK OPTION angibt, und mindestens eine Ergebniszeile nicht der CHECK OPTION-Einschränkung entsprach. ____________________________________________________________

____________________________________________________________

Page 456: Programmieren Einer Microsoft SQL Server 2000-Datenbank

36 Unterrichtseinheit 8: Implementieren von Sichten

Übung 4 Ermitteln von Sichtdefinitionen

In dieser Übung fragen Sie die Informationsschemasichten ab, um Informa-tionen zu den Sichten zu erhalten, die Sie in der ClassNorthwind-Datenbank erstellt haben. L08\Answers\Schema.sql ist das vollständige Skript für diese Übung.

� So zeigen Sie Informationen zu Sichten an In diesem Verfahren fragen Sie die Informationsschemasichten ab, um Details zu Sichten der ClassNorthwind-Datenbank zu erhalten. 1. Stellen Sie sicher, dass Sie die ClassNorthwind-Datenbank verwenden. 2. Fragen Sie INFORMATION_SCHEMA.VIEWS ab, um alle Sichten und

deren Definitionen anzuzeigen. SELECT *FROM INFORMATION_SCHEMA.VIEWS

Welche Informationen wurden FormaggiProductsView und ProductsAbove Average Price angezeigt? „FormaggiProductsView“ zeigt CASCADE in der „check_option“-Spalte an. Die Definition der „Sales by Category“-Sicht ist in der „view_definition“-Spalte verschlüsselt. ____________________________________________________________

____________________________________________________________

3. Welche Informationsschemasicht zeigt eine Liste von Tabellen- und Sicht-namen an? INFORMATION_SCHEMA.TABLES ____________________________________________________________

____________________________________________________________

4. Fragen Sie INFORMATION_SCHEMA.VIEW_COLUMN_USAGE ab, um eine Liste der Spalten anzuzeigen, auf die in der Invoices-Sicht ver-wiesen wird. SELECT *FROM INFORMATION_SCHEMA.VIEW_COLUMN_USAGE WHERE view_name = 'Invoices'

Page 457: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 8: Implementieren von Sichten 37

5. Fragen Sie INFORMATION_SCHEMA.VIEW_TABLE_USAGE ab, um eine Liste der Tabellen anzuzeigen, auf die in der Sales by Category-Sicht verwiesen wird. SELECT *FROM INFORMATION_SCHEMA.VIEW_TABLE_USAGE WHERE view_name = 'Sales by Category '

Welche Tabellen wurden aufgelistet? Tabellen: „Categories“, „Orders“ und „Products“. Sichten: „Order Details Extended“. ____________________________________________________________

____________________________________________________________

Warum wurden die Tabellen, auf die in Sales by Category verwiesen wird, angezeigt, obwohl diese Sicht verschlüsselt ist? Die Option WITH ENCRYPTION verschlüsselt nur die Sichtdefinition in der „syscomments“-Systemtabelle. Tabellen oder Sichten, auf die in einer Sicht verwiesen wird, werden in der „sysobjects“-Systemtabelle aufgelistet. ____________________________________________________________

____________________________________________________________

Welche Systemtabellen, Systemfunktionen oder gespeicherten Systempro-zeduren hätten Sie ebenfalls zum Anzeigen von Informationen zu Sichten verwenden können? „Sysobjects“, „sysdepends“, „syscomments“, „syscolumns“, „OBJECTPROPERTY“, „OBJECT_ID“, „OBJECT_NAME“, „sp_helptext“, „sp_help“ und „sp_depends“. ____________________________________________________________

____________________________________________________________

Page 458: Programmieren Einer Microsoft SQL Server 2000-Datenbank

38 Unterrichtseinheit 8: Implementieren von Sichten

Lernzielkontrolle

� Einführung zu Sichten

� Vorteile von Sichten

� Definieren von Sichten

� Ändern von Daten mit Hilfe von Sichten

� Optimieren der Leistung mit Hilfe von Sichten

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

1. Welche Vorteile bieten Sichten? Benutzer konzentrieren sich nur auf die benötigten Daten; Benutzer können Daten einfacher bearbeiten; die Komplexität von Datenbanken und Abfragen wird vor den Benutzern verborgen, sodass verständ-lichere Namen angezeigt werden können. Sichten stellen einen Sicher-heitsmechanismus bereit durch die Möglichkeit, Benutzern den Zugriff nur auf Daten in Sichten zu erlauben. Das Erstellen von Indizes für Sichten und das Partitionieren von Daten mit Hilfe von Sichten kann die Leistung optimieren.

2. Sie haben eine Abfrage entwickelt, die die Tabellen Customer, Orders und Order Details miteinander verknüpft, um die Details zu allen Kundenauf-trägen, wie z. B. Bestellmenge und Lieferdatum, aufzulisten. Wenn ein Kunde einen vorhandenen Auftrag ändert, müssen die Mitarbeiter in der Lage sein, die Tabellen Orders und Order Details zu aktualisieren. Wie würden Sie diese Aufgabe erledigen, ohne eine Berechtigung für die zugrunde liegenden Tabellen zu erteilen? Erstellen Sie für die Abfrage eine Sicht namens „OrderDetailsView“. Erteilen Sie die Aktualisierungsberechtigung für die Spalten „RequiredDate“ und „Quantity“ in der Sicht. Damit wird sichergestellt, dass die Mitarbeiter diese Spalten nur in den Tabellen „Orders“ und „Order Details“ aktualisieren können.

ThemaVertiefen Sie die Lernziele dieser Unterrichtseinheit, indem Sie die Kernpunkte wiederholen.

EinstiegDie Fragen zur Lernziel-kontrolle beziehen sich auf einige der Schlüsselkon-zepte, die Inhalt dieser Unterrichtseinheit sind.

Page 459: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 8: Implementieren von Sichten 39

3. Worin liegt der Vorteil, wenn Sie in einer Sichtdefinition die Option WITH CHECK OPTION verwenden? Diese Option zwingt die für die Sicht ausgeführten Änderungsanwei-sungen, die Kriterien einzuhalten, die in der SELECT-Anweisung zur Definition der Sicht festgelegt sind.

4. Welche Aspekte müssen unter anderem bei der Verwendung von Sichten berücksichtigt werden? Objekte, auf die in einer Sicht verwiesen wird, werden beim Erstellen einer Sicht überprüft; Sichten können so geändert werden, dass die ihnen zugewiesenen Berechtigungen beibehalten werden. Das Löschen oder Ändern einer zugrunde liegenden Tabelle wirkt sich auf die Sicht aus; wenn der Besitzer einer Sicht nicht der Benutzer „dbo“ ist, muss der Benutzername als Teil des Sichtnamens angegeben werden. Zur Vermeidung von unterbrochenen Besitzketten sollten alle Objekte, von denen eine Sicht abhängt, demselben Besitzer gehören. Verborgene Komplexität kann das Ermitteln der Quelle von Leistungsproblemen erschweren.

Page 460: Programmieren Einer Microsoft SQL Server 2000-Datenbank

2 Unterrichtseinheit 8: Implementieren von Sichten

This page is intentionally left blank.

Page 461: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Inhalt

Übersicht 1

Einführung in gespeicherte Prozeduren 2

Erstellen, Ausführen, Ändern und Löschen gespeicherter Prozeduren 10

Übungseinheit A: Erstellen gespeicherter Prozeduren 21

Verwenden von Parametern in gespeicherten Prozeduren 26

Ausführen erweiterter gespeicherter Prozeduren 37

Behandeln von Fehlermeldungen 39

Leistungsaspekte 45

Empfohlene Methoden 47

Übungseinheit B: Erstellen gespeicherter Prozeduren mit Parametern 48

Lernzielkontrolle 59

Unterrichtseinheit 9: Implementierengespeicherter Prozeduren

Page 462: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Die in diesen Unterlagen enthaltenen Angaben und Daten können ohne vorherige Ankündigung geändert werden. Die in diesen Unterlagen genannten Firmen, Produkte, Menschen, Charaktere und/oder Daten sind frei erfunden und sollen keine wirklichen Individuen, Gesellschaften, Produkte oder Veranstaltungen darstellen, soweit nichts anderes angegeben ist. Die Benutzer/innen sind verpflichtet, sich an alle anwendbaren Urheberrechtsgesetze zu halten. Ohne ausdrückliche schriftliche Erlaubnis der Microsoft Corporation darf kein Teil dieser Unterlagen für irgendwelche Zwecke vervielfältigt oder übertragen werden, unabhängig davon, auf welche Art und Weise oder mit welchen Mitteln, elektronisch oder mechanisch, dies geschieht. Wenn auf dieses Dokument nur auf elektronischem Wege zugegriffen werden kann, sind Sie hiermit berechtigt, eine (1) Kopie zum persönlichen Gebrauch auszudrucken.

Microsoft Corporation kann Inhaber von Patenten oder Patentanträgen, Marken, Urheberrechten oder anderen gewerblichen Schutzrechten sein, die den Inhalt dieses Dokuments betreffen. Die Bereitstellung dieses Dokuments gewährt keinerlei Lizenzrechte an diesen Patenten, Marken, Urheberrechten oder anderen gewerblichen Schutzrechten, es sei denn, dies wurde ausdrücklich durch einen schriftlichen Lizenzvertrag mit der Microsoft Corporation vereinbart.

2000 Microsoft Corporation. Alle Rechte vorbehalten.

Microsoft, ActiveX, BackOffice, MS-DOS, PowerPoint, Visual Basic, Visual C++, Visual Studio, Windows und Windows NT sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern.

Andere in diesem Dokument aufgeführte Produkt- und Firmennamen sind möglicherweise Marken der jeweiligen Eigentümer.

Project Lead: Rich Rose Instructional Designers: Rich Rose, Cheryl Hoople, Marilyn McGill Instructional Software Design Engineers: Karl Dehmer, Carl Raebler, Rick Byham Technical Lead: Karl Dehmer Subject Matter Experts: Karl Dehmer, Carl Raebler, Rick Byham Graphic Artist: Kirsten Larson (Independent Contractor) Editing Manager: Lynette Skinner Editor: Wendy Cleary Copy Editor: Edward McKillop (S&T Consulting) Production Manager: Miracle Davis Production Coordinator: Jenny Boe Production Support: Lori Walker (S&T Consulting) Test Manager: Sid Benavente Courseware Testing: TestingTesting123 Classroom Automation: Lorrin Smith-Bates Creative Director, Media/Sim Services: David Mahlmann Web Development Lead: Lisa Pease CD Build Specialist: Julie Challenger Online Support: David Myka (S&T Consulting) Localization Manager: Rick Terek Operations Coordinator: John Williams Manufacturing Support: Laura King; Kathy Hershey Lead Product Manager, Release Management: Bo Galford Lead Product Manager, Data Base: Margo Crandall Group Manager, Courseware Infrastructure: David Bramble Group Product Manager, Content Development: Dean Murray General Manager: Robert Stewart

Page 463: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 9: Implementieren gespeicherter Prozeduren iii

Hinweise für den Kursleiter Diese Unterrichtseinheit beschreibt die Verwendung gespeicherter Prozeduren, um den Entwurf und die Leistung von Anwendungen zu verbessern, indem Geschäftsregeln gekapselt werden. Es werden Verfahren zum Verarbeiten häufig verwendeter Abfragen und Datenänderungen erläutert.

Zu Beginn der Unterrichtseinheit wird erläutert, was unter gespeicherten Proze-duren zu verstehen ist, welche Vorteile mit ihrer Verwendung verbunden sind und wie sie verarbeitet werden.

Im nächsten Abschnitt wird beschrieben, wie gespeicherte Prozeduren erstellt, ausgeführt und geändert werden. Im darauffolgenden Abschnitt wird das Ver-wenden gespeicherter Prozeduren mit Eingabe- und Ausgabeparametern erklärt. Der Abschnitt behandelt zudem Optionen für das erneute Kompilieren.

In den letzten Abschnitten werden das Ausführen erweiterter gespeicherter Prozeduren, das Behandeln von Fehlermeldungen sowie Leistungsaspekte beschrieben, die beim Implementieren von gespeicherten Prozeduren berück-sichtigt werden sollten. Während der ganzen Unterrichtseinheit werden Bei-spiele für gespeicherte Prozeduren und entsprechende Vorführungen bereit-gestellt.

In der ersten Übungseinheit erstellen die Kursteilnehmer gespeicherte Proze-duren auf der Basis bereitgestellter Modelle und verwenden Microsoft®SQL Server™ Enterprise Manager und SQL Query Analyzer, um Informationen zu gespeicherten Prozeduren anzuzeigen. In der zweiten Übungseinheit ver-wenden die Kursteilnehmer einen Assistenten, um eine gespeicherte Prozedur zu erstellen, und generieren ein Skript für eine gespeicherte Prozedur. Darüber hinaus erstellen die Kursteilnehmer gespeicherte Prozeduren, die Informationen mit Hilfe von Eingabeparametern annehmen und Ausgabeparameter zurück-geben.

Am Ende dieser Unterrichtseinheit werden die Kursteilnehmer in der Lage sein, die folgenden Aufgaben auszuführen:

� Beschreiben, wie eine gespeicherte Prozedur verarbeitet wird. � Erstellen, Ausführen, Ändern und Löschen einer gespeicherten Prozedur. � Erstellen von gespeicherten Prozeduren, die Parameter annehmen. � Ausführen erweiterter gespeicherter Prozeduren. � Erstellen benutzerdefinierter Fehlermeldungen.

Präsentation:90 Minuten

Übungseinheiten:60 Minuten

Page 464: Programmieren Einer Microsoft SQL Server 2000-Datenbank

iv Unterrichtseinheit 9: Implementieren gespeicherter Prozeduren

Unterlagen und Vorbereitung In diesem Abschnitt werden die Unterlagen und vorbereitenden Aufgaben erläutert, die nötig sind, um diese Unterrichtseinheit zu unterrichten.

Erforderliche Unterlagen Um diese Unterrichtseinheit zu unterrichten, benötigen Sie folgende Unterlagen:

� Die Microsoft PowerPoint®-Datei 2328A_09.ppt� Die Beispieldatei C:\Moc\2328A\Demo\D09_Ex.sql, die alle Beispiel-

skripts der Unterrichtseinheit enthält, soweit in der Unterrichtseinheit nichts anderes angegeben ist.

Vorbereitende Aufgaben Zur Vorbereitung dieser Unterrichtseinheit gehen Sie folgendermaßen vor:

� Lesen Sie alle Unterlagen für diese Unterrichtseinheit. � Arbeiten Sie die Übungseinheiten durch. � Bearbeiten Sie alle Vorführungen. � Machen Sie sich mit der Präsentation vertraut. � Gehen Sie sämtliche relevanten Whitepaper durch, die sich auf der Kurs-

leiter-CD befinden.

VorführungIn diesem Abschnitt werden Vorgehensweisen bei der Vorführung beschrieben, die nicht in den Randnotizen enthalten und nicht für die Unterlagen der Kurs-teilnehmer geeignet sind.

Aktualisieren der Kundentelefonnummer � So bereiten Sie die Vorführung vor 1. Öffnen Sie C:\Moc\2328A\Demo\D09_UpdateCustomerPhone.sql, sehen

Sie sich den Inhalt der Datei an, und führen Sie die Datei dann aus. 2. Öffnen Sie C:\Moc\2328A\Demo\D09_TestUpdate.sql, und sehen Sie sich

den Inhalt der Datei an. Markieren Sie jede Anweisung, die auf den Kom-mentar folgt, der den Zweck des Tests erläutert, und führen Sie die Anwei-sungen aus, damit Sie mit den Ergebnissen vertraut sind.

Page 465: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 9: Implementieren gespeicherter Prozeduren v

� So führen Sie die Vorführung aus 1. Wechseln Sie zu SQL Query Analyzer, und öffnen Sie die Datei

C:\Moc\2328A\Demo\D09_UpdateCustomerPhone.sql.2. Damit auch die Kursteilnehmer, die weiter hinten sitzen, das Skript gut

sehen können, klicken Sie im Menü Extras auf Optionen.3. Wählen Sie auf der Registerkarte Schriftarten im Listenfeld Größe den

Wert 20 aus, und klicken Sie dann auf OK.

Die wichtigsten Teile des Skripts sind im Arbeitsbuch für Kursteilnehmer aufgeführt.

4. Führen Sie einen Bildlauf bis hinter die EXEC-Anweisung aus. 5. Weisen Sie auf die benutzerdefinierten Fehlermeldungen hin, die mit der

gespeicherten Systemprozedur sp_addmessage erstellt werden. 6. Wenn Sie den Abschnitt des Skripts besprechen, durch den ermittelt wird,

ob die Kundentelefonnummer in der Datenbank vorhanden ist, fragen Sie die Kursteilnehmer, warum diese Anweisungen in das Skript eingeschlossen wurden. Antwort: Wenn Sie eine UPDATE-Anweisung ausführen, die eine Kunden-telefonnummer angibt, die nicht vorhanden ist, wird als Ergebnis „Befehl(e) erfolgreich abgeschlossen.“ angezeigt.

7. Weisen Sie darauf hin, dass die eigentliche Transaktion, die die Kunden-telefonnummer aktualisiert, kurz ist und erst beginnt, nachdem die Fehler-überprüfung und die Geschäftslogik abgeschlossen ist. Bei diesem Beispiel handelt es sich um ein optimistisches Modell, das einer kleineren Trans-aktion den Vorzug vor einer alles umfassenden Transaktion gibt. Das von Ihnen ausgewählte Modell hängt von der Anwendungsumgebung ab sowie davon, ob sich diese negativ auf die Datenintegrität auswirkt.

8. Nachdem Sie das Skript besprochen haben, führen Sie es aus, um die ge-speicherte Prozedur UpdateCustomerPhone zur Northwind-Datenbank hinzuzufügen.

9. Öffnen Sie C:\Moc\2328A\Demo\D09_TestUpdate.sql, und markieren Sie jede Anweisung, die auf den Kommentar folgt, der die zu testende Fehler-bedingung erklärt, und führen Sie die Anweisung aus.

Anmerkung

Page 466: Programmieren Einer Microsoft SQL Server 2000-Datenbank

vi Unterrichtseinheit 9: Implementieren gespeicherter Prozeduren

Strategie für die Unterrichtseinheit Verwenden Sie die folgende Strategie, um diese Unterrichtseinheit zu präsentieren:

� Einführung in gespeicherte Prozeduren Stellen Sie die Elemente einer gespeicherten Prozedur vor, und geben Sie eine Übersicht über die verschiedenen Arten gespeicherter Prozeduren - gespeicherte Systemprozeduren, lokale gespeicherte Prozeduren, temporär gespeicherte Prozeduren, remote gespeicherte Prozeduren oder erweiterte gespeicherte Prozeduren. Der Schwerpunkt dieser Unterrichtseinheit liegt auf dem Erstellen gespeicherter Prozeduren, die in einer lokalen Datenbank eines Benutzers definiert werden. Erklären Sie, wie gespeicherte Prozeduren verarbeitet werden, und weisen Sie auf die Vorteile hin, die das Erstellen gespeicherter Prozeduren in Anwendungen für die Kursteilnehmer mit sich bringt.

� Erstellen, Ausführen, Ändern und Löschen gespeicherter Prozeduren Beschreiben Sie, wie gespeicherte Prozeduren erstellt, ausgeführt, geändert und gelöscht werden. Erläutern Sie die Verwendung der WITH ENCRYPTION-Option, und führen Sie die Programmierrichtlinien für das Erstellen gespeicherter Prozeduren auf.

� Verwenden von Parametern in gespeicherten Prozeduren Dieser Abschnitt sollte innerhalb der Unterrichtseinheit am stärksten betont werden, da gespeicherte Prozeduren durch Parameter ein Höchstmaß an Funktionalität und Flexibilität erhalten. Erläutern Sie Eingabe- und Ausgabeparameter. Vergleichen Sie gespeicherte Prozeduren, die Parameter durch Verweis oder nach der Position angeben. Betonen Sie, dass das Übergeben durch Verweis die bevorzugte Methode ist, da sie besser nachvollziehbar ist. Gehen Sie zum Schluss kurz auf die Möglichkeit ein, eine gespeicherte Prozedur explizit erneut zu kompilieren. Weisen Sie die Kursteilnehmer darauf hin, dass die Verwendung dieses Features nicht zur Regel werden sollte.

� Ausführen erweiterter gespeicherter Prozeduren Geben Sie eine kurze Wiederholung zu erweiterten gespeicherten Proze-duren. Heben Sie hervor, dass die Kursteilnehmer eine erweiterte ge-speicherte Prozedur aus jeder Datenbank heraus aufrufen können, wenn sie eine gespeicherte Prozedur mit dem Präfix sp_ erstellen, durch die die erweiterte gespeicherte Prozedur aufgerufen wird. Falls ausreichend Zeit zur Verfügung steht, können Sie den Kursteilnehmern zeigen, wie sie sehr leicht eine gespeicherte Prozedur erstellen können, die die erweiterte gespeicherte Prozedur xp_cmdshell aufruft.

Page 467: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 9: Implementieren gespeicherter Prozeduren vii

� Behandeln von Fehlermeldungen Betonen Sie die Bedeutung der Fehlerbehandlung, wenn Sie die RETURN-Anweisung, die @@error-Systemfunktion, die gespeicherte System-prozedur sp_addmessage und die RAISERROR-Anweisung erläutern. Zeigen Sie, wie ein Element aus der Northwind-Datenbank entfernt werden kann, um Strategien zum Behandeln von Fehlermeldungen zu veranschau-lichen. Bevor Sie diese Vorführung durchführen können, müssen Sie die Informationen zum Einrichten der Vorführung lesen.

� Leistungsaspekte Erläutern Sie einige der Leistungsaspekte, die beim Verwenden gespeicherter Prozeduren berücksichtigt werden müssen.

AnpassungsinformationenDieser Abschnitt beschreibt die Anforderungen zum Einrichten der Übungs-einheiten für eine Unterrichtseinheit sowie die Konfigurationsänderungen, die während der Übungseinheiten an den Kursteilnehmercomputern vorgenommen werden. Diese Informationen sollen Ihnen beim Replizieren oder Anpassen der Microsoft Official Curriculum-Courseware (MOC) helfen.

Die Übungseinheiten in dieser Unterrichtseinheit hängen von der Schulungsraumkonfiguration ab, die im Abschnitt „Anpassungsinformationen“ am Ende des Dokuments Handbuch für das Einrichten von Schulungs-computern für Kurs 2328A, Programmieren einer Microsoft SQL Server 2000-Datenbank, angegeben ist.

Einrichten der Übungseinheiten Der folgende Abschnitt beschreibt die Anforderungen zum Einrichten der Übungseinheiten für diese Unterrichtseinheit.

Anforderung zum Einrichten der Übungseinheit A Für die Übungseinheit in dieser Unterrichtseinheit muss die ClassNorthwind-Datenbank den Zustand aufweisen, der für diese Übungseinheit erforderlich ist. Damit die Kursteilnehmercomputer diese Anforderungen erfüllen, müssen Sie eine der folgenden Aktionen ausführen:

� Bearbeiten der vorherigen Übungseinheit. � Ausführen der Batchdatei C:\Moc\2328A\Batches\Restore09A.cmd.

Wichtig

Page 468: Programmieren Einer Microsoft SQL Server 2000-Datenbank

viii Unterrichtseinheit 9: Implementieren gespeicherter Prozeduren

Anforderung zum Einrichten der Übungseinheit B Für die Übungseinheit in dieser Unterrichtseinheit muss die ClassNorthwind-Datenbank den Zustand aufweisen, der für diese Übungseinheit erforderlich ist. Damit die Kursteilnehmercomputer diese Anforderungen erfüllen, müssen Sie eine der folgenden Aktionen ausführen:

� Bearbeiten der vorherigen Übungseinheit. � Ausführen der Batchdatei C:\Moc\2328A\Batches\Restore09B.cmd.

Wenn dieser Kurs angepasst wurde, müssen die Kursteilnehmer die Batchdatei C:\Moc\2328A\Batches\Restore09A.cmd ausführen, um sicher-zustellen, dass die erste Übungseinheit ordnungsgemäß funktioniert. Wenn dieser Kurs angepasst wurde, müssen die Kursteilnehmer die Batchdatei C:\Moc\2328A\Batches\Restore09B.cmd ausführen, um sicherzustellen, dass die zweite Übungseinheit ordnungsgemäß funktioniert.

Ergebnisse der Übungseinheiten Auf den Kursteilnehmercomputern gibt es keine Konfigurationsänderungen, die die Replikation oder die Anpassung betreffen.

Achtung

Page 469: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 9: Implementieren gespeicherter Prozeduren 1

Übersicht

� Einführung in gespeicherte Prozeduren

� Erstellen, Ausführen, Ändern und Löschen gespeicherter Prozeduren

� Verwenden von Parametern in gespeicherten Prozeduren

� Ausführen erweiterter gespeicherter Prozeduren

� Behandeln von Fehlermeldungen

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

LernzieleAm Ende dieser Unterrichtseinheit werden Sie in der Lage sein, die folgenden Aufgaben auszuführen:

� Beschreiben, wie eine gespeicherte Prozedur verarbeitet wird. � Erstellen, Ausführen, Ändern und Löschen einer gespeicherten Prozedur. � Erstellen von gespeicherten Prozeduren, die Parameter annehmen. � Ausführen erweiterter gespeicherter Prozeduren. � Erstellen benutzerdefinierter Fehlermeldungen.

ThemaGeben Sie eine Übersicht über die Themen und Lern-ziele dieser Unterrichts-einheit.

EinstiegIn dieser Unterrichtseinheit erhalten Sie Informationen zu gespeicherten Proze-duren und erfahren, in welchen Situationen sich die Verwendung gespeicherter Prozeduren anbietet.

Page 470: Programmieren Einer Microsoft SQL Server 2000-Datenbank

2 Unterrichtseinheit 9: Implementieren gespeicherter Prozeduren

���� Einführung in gespeicherte Prozeduren

� Definieren gespeicherter Prozeduren

� Erstmaliges Verarbeiten gespeicherter Prozeduren

� Nachfolgendes Verarbeiten gespeicherter Prozeduren

� Vorteile gespeicherter Prozeduren

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Dieser Abschnitt bietet eine Einführung in die verschiedenen Typen ge-speicherter Prozeduren von Microsoft® SQL Server™ 2000. Es wird beschrie-ben, wie gespeicherte Prozeduren erstmalig und bei nachfolgender Ausführung verarbeitet werden, und es werden einige der Vorteile aufgeführt, die sich aus dem Verwenden gespeicherter Prozeduren ergeben.

ThemaStellen Sie die Themen dieses Abschnitts vor.

EinstiegIn diesem Abschnitt werden diese Themen behandelt...

Page 471: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 9: Implementieren gespeicherter Prozeduren 3

Definieren gespeicherter Prozeduren

� Benannte Auflistung von Transact-SQL-Anweisungen

� Kapseln wiederkehrender Tasks

� Fünf Typen (System, Lokal, Temporär, Remote undErweitert)

� Annehmen von Eingabeparametern und Rückgabewerten

� Zurückgeben eines Statuswertes, der Erfolg oder Fehlschlagen anzeigt

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Bei einer gespeicherten Prozedur handelt es sich um eine auf dem Server ge-speicherte benannte Auflistung von Transact-SQL-Anweisungen. Mit ge-speicherten Prozeduren können wiederkehrende Tasks gekapselt werden. Ge-speicherte Prozeduren unterstützen von Benutzern deklarierte Variablen, die bedingte Ausführung sowie weitere leistungsfähige Programmierfeatures.

SQL Server unterstützt fünf Typen von gespeicherten Prozeduren:

Gespeicherte Systemprozeduren (zu erkennen am Präfix sp_) sind in der master-Datenbank gespeichert und stellen eine effiziente Methode bereit, um Daten aus Systemtabellen abzurufen. Mit Hilfe dieser Prozeduren können Systemadministratoren Systemtabellen im Rah-men von Datenbankverwaltungsaufgaben aktualisieren, auch wenn sie nicht über die Berechtigung zum direkten Aktualisieren der zugrunde liegenden Tabellen verfügen. Gespeicherte Systemprozeduren können in jeder beliebigen Datenbank ausgeführt werden.

Lokale gespeicherte Prozeduren werden in einzelnen Benutzerdatenbanken erstellt.

Bei temporär gespeicherten Prozeduren kann es sich um lokale Prozeduren handeln, deren Namen mit einem einfachen Nummernzeichen (#) beginnen, oder um globale Prozeduren, deren Namen mit einem doppelten Nummernzeichen beginnen (##). Lokale temporär gespeicher-te Prozeduren sind nur innerhalb einer einzigen Benutzersitzung verfügbar; glo-bale temporär gespeicherte Prozeduren stehen für alle Benutzersitzungen zur Verfügung.

Remote gespeicherte Prozeduren sind ein älteres Feature von SQL Server. Diese Funktionalität wird nun durch verteilte Abfragen unterstützt.

ThemaDefinieren Sie gespeicherte Prozeduren.

EinstiegBei einer gespeicherten Prozedur handelt es sich um eine auf dem Server gespeicherte vorkompilierte Auflistung von Transact-SQL-Anweisungen.

Gespeicherte Systemprozeduren (sp_)

Lokale gespeicherte Prozeduren

Temporär gespeicherte Prozeduren

Remote gespeicherte Prozeduren

Page 472: Programmieren Einer Microsoft SQL Server 2000-Datenbank

4 Unterrichtseinheit 9: Implementieren gespeicherter Prozeduren

Erweiterte gespeicherte Prozeduren werden in Form von DLLs (Dynamic Link Libraries) implementiert, die außer-halb der SQL Server-Umgebung ausgeführt werden. Erweiterte gespeicherte Prozeduren sind durch das Präfix xp_ gekennzeichnet. Sie werden ähnlich wie gespeicherte Prozeduren ausgeführt.

Gespeicherte Prozeduren in SQL Server ähneln Prozeduren in anderen Pro-grammiersprachen darin, dass Sie folgende Funktionalität bieten:

� Sie können Anweisungen enthalten, die Operationen in der Datenbank aus-führen. Dies schließt auch die Möglichkeit ein, andere gespeicherte Proze-duren aufzurufen.

� Sie nehmen Eingabeparameter an. � Sie können einen Statuswert an eine aufrufende gespeicherte Prozedur oder

einen Batch zurückgeben, der Erfolg oder Fehlschlagen (sowie den Grund für das Fehlschlagen) anzeigt.

� Sie können mehrere Werte in Form von Ausgabeparametern an die auf-rufende gespeicherte Prozedur oder den Batch zurückgeben.

Weitere Informationen Einige gespeicherte Systemprozeduren rufen erweiterte gespeicherte Prozeduren auf.

Erweiterte gespeicherte Prozeduren (xp_)

Page 473: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 9: Implementieren gespeicherter Prozeduren 5

Erstmaliges Verarbeiten gespeicherter Prozeduren

Einträge in die „sysobjects“-und „syscomments“-Tabelle

Einträge in die „sysobjects“-und „syscomments“-Tabelle

Prozedurcache enthältkompilierten Plan

Prozedurcache enthältkompilierten PlanKompilierungKompilierung

OptimierungOptimierung

ErstellungErstellungErstellung

Ausführung(erstmalig oder

erneutesKompilieren)

AusführungAusführung((erstmalig odererstmalig oder

erneuteserneutesKompilieren)Kompilieren)

AnalyseAnalyse

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Beim Verarbeiten einer gespeicherten Prozedur wird diese zunächst erstellt und dann zum ersten Mal ausgeführt. Dadurch wird ihr Ausführungsplan in den Pro-zedurcache geschrieben. Der Prozedurcache ist ein Arbeitsspeicherbereich, der die Ausführungspläne für alle aktuell ausgeführten Transact-SQL-Anweisungen enthält. Die Größe des Prozedurcaches ändert sich dynamisch entsprechend dem Grad an Aktivität. Der Prozedurcache befindet sich im Arbeitsspeicher-pool, der Haupt-Arbeitsspeichereinheit für SQL Server. Er enthält den größten Teil der Datenstrukturen, die Arbeitsspeicher in SQL Server verwenden.

Erstellung Beim Erstellen einer gespeicherten Prozedur werden die enthaltenen Anweisun-gen in Bezug auf syntaktische Korrektheit analysiert. SQL Server speichert dann den Namen der gespeicherten Prozedur in der sysobjects-Systemtabelle und den Text der gespeicherten Prozedur in der syscomments-Systemtabelle der aktuellen Datenbank. Wenn ein Syntaxfehler festgestellt wird, wird ein Fehler zurückgegeben, und die gespeicherte Prozedur wird nicht erstellt.

Verzögerte Namensauflösung Die verzögerte Namensauflösung ermöglicht es, dass gespeicherte Prozeduren bei ihrer Erstellung auf nicht vorhandene Objekte verweisen. Dieser Vorgang erhöht die Flexibilität, da gespeicherte Prozeduren und die Objekte, auf die sie verweisen, nicht in einer bestimmten Reihenfolge erstellt werden müssen. Die Objekte müssen erst dann vorhanden sein, wenn die gespeicherte Prozedur aus-geführt wird. Die verzögerte Namensauflösung wird ausgeführt, wenn die ge-speicherte Prozedur ausgeführt wird.

ThemaBeschreiben Sie die Schrit-te, die beim Verarbeiten einer gespeicherten Proze-dur durchgeführt werden.

EinstiegBeim Verarbeiten einer ge-speicherten Prozedur wird diese zunächst erstellt und dann zum ersten Mal aus-geführt. Dadurch wird ihr Ausführungsplan in den Cache geschrieben.

Methodischer Hinweis Weisen Sie auf den Vor-gang der verzögerten Namensauflösung hin.

Page 474: Programmieren Einer Microsoft SQL Server 2000-Datenbank

6 Unterrichtseinheit 9: Implementieren gespeicherter Prozeduren

Ausführung (erstmalig oder erneutes Kompilieren) Beim erstmaligen Ausführen einer gespeicherten Prozedur oder wenn die gespeicherte Prozedur erneut kompiliert werden muss, führt der Abfragepro-zessor einen als Auflösung bezeichneten Vorgang aus, in dessen Verlauf die gespeicherte Prozedur gelesen wird.

Bestimmte Änderungen in einer Datenbank können dazu führen, dass ein Aus-führungsplan ineffizient wird oder nicht mehr gültig ist. SQL Server erkennt diese Änderungen und führt in den folgenden Fällen automatisch eine erneute Kompilierung des Ausführungsplanes durch:

� Bei strukturellen Änderungen an einer Tabelle oder Sicht, auf die die Ab-frage verweist (ALTER TABLE und ALTER VIEW).

� Bei explizit durch eine Anweisung, wie z. B. UPDATE STATISTICS, gene-rierten neuen Verteilungsstatistiken oder beim automatischen Generieren neuer Verteilungsstatistiken.

� Wenn ein vom Ausführungsplan verwendeter Index gelöscht wird. � Bei wichtigen Änderungen an Schlüsseln (durch die INSERT- oder

DELETE-Anweisung) für eine Tabelle, auf die die Abfrage verweist.

OptimierungWenn eine gespeicherte Prozedur die Auflösungsphase erfolgreich durchläuft, analysiert der Abfrageoptimierer von SQL Server die Transact-SQL-Anweisun-gen in der gespeicherten Prozedur und erstellt einen Plan, der das schnellste Verfahren zum Zugreifen auf die Daten enthält. Beim Ermitteln des schnellsten Verfahrens berücksichtigt der Abfrageoptimierer die folgenden Aspekte:

� Der Umfang der Daten in den Tabellen.� Das Vorhandensein und den Typ der Tabellenindizes sowie die Verteilung

von Daten in den indizierten Spalten.� Die in den Bedingungen von WHERE-Klauseln verwendeten Vergleichs-

operatoren und Vergleichswerte.� Das Vorhandensein von Verknüpfungen sowie der Klauseln UNION,

GROUP BY oder ORDER BY.

KompilierungBei der Kompilierung werden gespeicherte Prozeduren analysiert und ein im Prozedurcache enthaltener Ausführungsplan erstellt. Der Prozedurcache enthält die wichtigsten Ausführungspläne für gespeicherte Prozeduren. Folgende Fak-toren können unter anderem die Bedeutung eines Planes vergrößern:

� Die zum erneuten Kompilieren benötigte Zeit (hohe Kompilierungskosten) � Häufige Verwendung

Page 475: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 9: Implementieren gespeicherter Prozeduren 7

Nachfolgendes Verarbeiten gespeicherter Prozeduren

Ausführungsplan erhalten

Nicht verwendeter Plan wird entfernt

Abfrageplan Ausführungskontext

SELECT *FROM dbo.memberWHERE member_no = ?

Verbindung 1

8082

Verbindung 2

Verbindung 3

24

1003

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Das nachfolgende Verarbeiten gespeicherter Prozeduren benötigt weniger Zeit als das erstmalige Verarbeiten, da SQL Server den optimierten Ausführungs-plan im Prozedurcache verwendet.

Wenn die folgenden Bedingungen zutreffen, verwendet SQL Server den im Arbeitsspeicher gehaltenen Plan, um die Abfrage nachfolgend auszuführen:

� Die aktuelle Umgebung stimmt mit der Umgebung überein, in der der Plan kompiliert wurde. Die Umgebung wird durch Server-, Datenbank- und Verbindungseinstellun-gen bestimmt.

� Objekte, auf die die gespeicherte Prozedur verweist, erfordern keine Namensauflösung. Die Namensauflösung ist dann für Objekte erforderlich, wenn Objekte, die sich im Besitz verschiedener Benutzer befinden, dieselben Namen auf-weisen. Wenn zum Beispiel sowohl die sales-Rolle als auch die development-Rolle eine Tabelle mit der Bezeichnung Product besitzt, muss SQL Server ermitteln, welche Tabelle bei einem Verweis auf eine Product-Tabelle verarbeitet werden muss.

Ausführungspläne von SQL Server weisen zwei Hauptkomponenten auf:

� Abfrageplan: Bei dem größten Teil des Abfrageplanes handelt es sich um eine eintrittsinvariante, schreibgeschützte Datenstruktur, die von einer be-liebigen Anzahl von Benutzern verwendet werden kann.

� Ausführungskontext: Jeder Benutzer, der die Abfrage momentan ausführt, verfügt über eine solche wiederverwendbare Datenstruktur mit Daten, die speziell für die jeweilige Ausführung gelten (z. B. Parameterwerte). Wenn ein Benutzer eine Abfrage ausführt und eine der Strukturen derzeit nicht verwendet wird, wird sie mit dem Kontext für den neuen Benutzer neu initialisiert.

ThemaBeschreiben Sie das nach-folgende Verarbeiten ge-speicherter Prozeduren.

EinstiegDas nachfolgende Verar-beiten gespeicherter Proze-duren benötigt weniger Zeit als das erstmalige Ver-arbeiten, da SQL Server den Ausführungsplan im Prozedurcache verwendet.

Verwenden Sie sp_configure für Server-einstellungen, sp_dboptionfür Datenbankeinstellungen und SET-Optionen für Ver-bindungseinstellungen.

Page 476: Programmieren Einer Microsoft SQL Server 2000-Datenbank

8 Unterrichtseinheit 9: Implementieren gespeicherter Prozeduren

Im Cache befindet sich in der Regel immer jeweils ein kompilierter Plan für jede eindeutige Kombination aus gespeicherter Prozedur und Umgebung. Der Cache kann mehrere Pläne für dieselbe gespeicherte Prozedur enthalten, wenn sich jeder Plan auf eine andere Umgebung bezieht.

Die folgenden Faktoren führen zu unterschiedlichen Umgebungen, die sich auf die Kompilierungsmöglichkeiten auswirken:

� Parallele im Gegensatz zu seriellen kompilierten Plänen � Impliziter Objektbesitz � Unterschiedliche SET-Optionen

Weitere Informationen zu parallelen Ausführungsplänen finden Sie unter dem Thema „Grad der Parallelität“ in der SQL Server-Onlinedoku-mentation.

Entwickler sollten eine Umgebung für ihre Anwendungen auswählen und diese verwenden. Für Objekte, bei denen die implizite Auflösung des Besitzes zu mehrdeutigen Ergebnissen führt, sollte die explizite Auflösung durch Angeben des Objektbesitzers verwendet werden. Es sollten konsistente SET-Optionen verwendet werden, die am Anfang der Verbindung festgelegt und anschließend nicht mehr geändert werden.

Nachdem ein Ausführungsplan generiert wurde, bleibt er im Prozedurcache gespeichert. SQL Server entfernt alte, nicht mehr verwendete Pläne nur dann aus dem Cache, wenn Speicherplatz benötigt wird.

Anmerkung

Page 477: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 9: Implementieren gespeicherter Prozeduren 9

Vorteile gespeicherter Prozeduren

� Gemeinsames Nutzen der Anwendungslogik

� Abschirmen der Details des Datenbankschemas

� Bereitstellen von Sicherheitsmechanismen

� Verbessern der Leistung

� Reduzieren des Netzwerkverkehrs

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Gespeicherte Prozeduren bieten zahlreiche Vorteile. Dazu gehören die folgenden:

� Gemeinsames Nutzen der Anwendungslogik mit anderen Anwendungen und dadurch Gewährleisten der Datenkonsistenz bei Zugriffen und Änderungen. Geschäftsfunktionen können mit Hilfe gespeicherter Prozeduren zusammen-gefasst werden. Sie haben die Möglichkeit, in gespeicherten Prozeduren zu-sammengefasste Geschäftsregeln oder Richtlinien an einem einzigen Ort zu ändern. Auf allen Clients können dieselben gespeicherten Prozeduren ver-wendet werden, wodurch Datenkonsistenz bei Zugriffen und Änderungen gewährleistet ist.

� Benutzer erhalten keinen Einblick in die Details der Datenbanktabellen. Wenn alle von Benutzern durchzuführenden Geschäftsfunktionen durch einen Satz von gespeicherten Prozeduren unterstützt werden, ist nie ein direkter Benutzerzugriff auf die Tabellen erforderlich.

� Bereitstellen von Sicherheitsmechanismen. Benutzern können auch dann Berechtigungen zum Ausführen einer gespeicherten Prozedur erteilt werden, wenn sie nicht berechtigt sind, auf die Tabellen oder Sichten zuzugreifen, auf die in der gespeicherten Prozedur verwiesen wird.

� Verbessern der Leistung. Mit gespeicherten Prozeduren werden mehrere Tasks als eine Reihe von Transact-SQL-Anweisungen implementiert. Durch das Anwenden von Bedingungslogik auf die Ergebnisse der ersten Transact-SQL-Anweisungen können die Transact-SQL-Anweisungen ermittelt wer-den, die nachfolgend ausgeführt werden sollen. Diese Transact-SQL-An-weisungen und die Bedingungslogik werden als Teil eines einzelnen Aus-führungsplanes auf dem Server gespeichert.

� Reduzieren des Netzwerkverkehrs. Anstatt mehrere Hundert Transact-SQL-Anweisungen über das Netzwerk zu senden, können Benutzer eine kom-plexe Operation ausführen, indem sie nur eine einzelne Anweisung senden. Auf diese Weise wird die Anzahl der zwischen Server und Client übermit-telten Anforderungen reduziert.

ThemaErläutern Sie die Vorteile gespeicherter Prozeduren.

EinstiegDurch die Verwendung von gespeicherten Prozeduren kann die Auslastung der zur Ausführung benötigten Res-sourcen erheblich reduziert und die Ausführungszeit verkürzt werden.

Der Netzwerkverkehr wird reduziert, da für das Senden von Anforderungen weniger Pakete benötigt werden.

Page 478: Programmieren Einer Microsoft SQL Server 2000-Datenbank

10 Unterrichtseinheit 9: Implementieren gespeicherter Prozeduren

���� Erstellen, Ausführen, Ändern und Löschen gespeicherter Prozeduren

� Erstellen gespeicherter Prozeduren

� Richtlinien für das Erstellen gespeicherter Prozeduren

� Ausführen von gespeicherten Prozeduren

� Ändern und Löschen gespeicherter Prozeduren

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

In diesem Abschnitt wird beschrieben, wie gespeicherte Prozeduren erstellt, ausgeführt, geändert und gelöscht werden.

ThemaGeben Sie eine Einführung in das Erstellen, Ausführen, Ändern und Löschen ge-speicherter Prozeduren.

EinstiegNachdem in den vorher-gehenden Abschnitten die Definition und Verarbeitung gespeicherter Prozeduren behandelt wurde, wird nun erläutert, wie gespeicherte Prozeduren erstellt, aus-geführt, geändert und gelöscht werden.

Page 479: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 9: Implementieren gespeicherter Prozeduren 11

Erstellen gespeicherter Prozeduren

� Erstellen in der aktuellen Datenbank mit derCREATE PROCEDURE-Anweisung

� Können auf bis zu 32 Ebenen geschachtelt werden� Verwenden von „sp_help“, um Informationen anzuzeigen

USE NorthwindGOCREATE PROC dbo.OverdueOrdersAS

SELECT * FROM dbo.OrdersWHERE RequiredDate < GETDATE() AND ShippedDate IS Null

GO

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Eine gespeicherte Prozedur kann nur in der aktuellen Datenbank erstellt werden. Die einzige Ausnahme hiervon stellen temporär gespeicherte Proze-duren dar, die immer in der tempdb-Datenbank erstellt werden. Das Erstellen einer gespeicherten Prozedur ähnelt dem Erstellen einer Sicht. Schreiben und testen Sie zunächst die Transact-SQL-Anweisungen, die in der gespeicherten Prozedur eingeschlossen sein sollen. Wenn die Ergebnisse Ihren Erwartungen entsprechen, können Sie anschließend die gespeicherte Prozedur erstellen.

Verwenden von CREATE PROCEDURE Gespeicherte Prozeduren werden mit Hilfe der CREATE PROCEDURE-An-weisung erstellt. Berücksichtigen Sie beim Erstellen gespeicherter Prozeduren die folgenden Aspekte:

� Gespeicherte Prozeduren können auf Tabellen, Sichten, benutzerdefinierte Funktionen und auf andere gespeicherte Prozeduren sowie auf temporäre Tabellen verweisen.

� Wenn eine gespeicherte Prozedur eine lokale temporäre Tabelle erstellt, steht diese Tabelle nur für die gespeicherte Prozedur zur Verfügung und wird nach Beendigung der Prozedurausführung wieder gelöscht.

� Eine CREATE PROCEDURE-Anweisung kann nicht mit anderen Transact-SQL-Anweisungen in einem einzigen Batch kombiniert werden.

� Mit Ausnahme der folgenden Anweisungen zur Objekterstellung kann die CREATE PROCEDURE-Definition Transact-SQL-Anweisungen eines beliebigen Typs und in unbeschränkter Anzahl enthalten: CREATE DEFAULT, CREATE PROCEDURE, CREATE RULE, CREATE TRIGGER und CREATE VIEW. Innerhalb einer gespeicherten Prozedur können weitere Datenbankobjekte erstellt werden; diese sollten mit dem Namen des Objektbesitzers gekennzeichnet werden.

ThemaGeben Sie eine Einfüh-rung in die CREATE PROCEDURE-Syntax.

EinstiegMit Hilfe der CREATE PROCEDURE-Anweisung können Sie gespeicherte Prozeduren in der aktuellen Datenbank erstellen.

Die Syntax lässt das An-geben des Datenbank-namens als Präfix des Objektnamens nicht zu.

Page 480: Programmieren Einer Microsoft SQL Server 2000-Datenbank

12 Unterrichtseinheit 9: Implementieren gespeicherter Prozeduren

� Um die CREATE PROCEDURE-Anweisung auszuführen, müssen Sie ein Mitglied der Systemadministratorrolle (sysadmin), der Datenbankbesitzer-rolle (db_owner) oder der DDL-Administratorrolle (Data Definition Language), db_ddladmin, sein oder über die CREATE PROCEDURE-Be-rechtigung verfügen.

� In Abhängigkeit vom verfügbaren Arbeitsspeicher beträgt die Größe einer gespeicherten Prozedur maximal 128 MB.

CREATE PROC [ EDURE ] procedure_name [ ; number ] [ { @parameter data_type } [ VARYING ] [ = default ] [ OUTPUT ] ] [ ,...n ][ WITH { RECOMPILE | ENCRYPTION | RECOMPILE , ENCRYPTION } ] [ FOR REPLICATION ] AS sql_statement [ ...n ]

Mit den folgenden Anweisungen wird eine gespeicherte Prozedur erstellt, die alle überfälligen Bestellungen aus der Northwind-Datenbank auflistet.

USE Northwind GOCREATE PROC dbo.OverdueOrders AS SELECT * FROM dbo.Orders WHERE RequiredDate < GETDATE() AND ShippedDate IS Null GO

Schachteln gespeicherter Prozeduren Gespeicherte Prozeduren können geschachtelt werden (eine Prozedur ruft eine andere auf). Für das Schachteln gelten die folgenden Merkmale:

� Gespeicherte Prozeduren können auf bis zu 32 Ebenen geschachtelt werden. Der Versuch, die Anzahl der maximal 32 Schachtelungsebenen zu über-schreiten, führt dazu, dass die gesamte Kette der aufrufenden gespeicherten Prozeduren fehlschlägt.

� Die aktuelle Schachtelungsebene ist in der @@nestlevel-Systemfunktion gespeichert.

� Wenn eine gespeicherte Prozedur eine zweite gespeicherte Prozedur aufruft, kann die zweite gespeicherte Prozedur auf alle Objekte zugreifen, die durch die erste gespeicherte Prozedur erstellt wurden, einschließlich der tempo-rären Tabellen.

� Geschachtelte gespeicherte Prozeduren können rekursiv sein. So kann z. B. die gespeicherte Prozedur X die gespeicherte Prozedur Y aufrufen. Während die gespeicherte Prozedur Y ausgeführt wird, kann sie wiederum die ge-speicherte Prozedur X aufrufen.

Teilsyntax

Beispiel

Page 481: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 9: Implementieren gespeicherter Prozeduren 13

Anzeigen von Informationen zu gespeicherten Prozeduren Wie bei anderen Datenbankobjekten kann mit Hilfe folgender gespeicherter Systemprozeduren nach zusätzlichen Informationen zu allen Typen von gespeicherten Prozeduren gesucht werden: sp_help, sp_helptext und sp_depends. Wenn Sie eine Liste der in der Datenbank enthaltenen gespei-cherten Prozeduren und Besitzernamen ausgeben möchten, können Sie die gespeicherte Systemprozedur sp_stored_procedures verwenden. Darüber hinaus können Sie die Systemtabellen sysobjects, syscomments und sysdepends abfragen, um Informationen zu erhalten.

Page 482: Programmieren Einer Microsoft SQL Server 2000-Datenbank

14 Unterrichtseinheit 9: Implementieren gespeicherter Prozeduren

Richtlinien für das Erstellen gespeicherter Prozeduren

� Benutzer „dbo“ sollte Besitzer aller gespeicherten Prozeduren sein

� Eine gespeicherte Prozedur für einen Task

� Erstellen, Testen und Problembehandlung

� Vermeiden Sie das Präfix „sp_“ in Namen von gespeicherten Prozeduren

� Verwenden Sie dieselben Verbindungseinstellungen für alle gespeicherten Prozeduren

� Minimieren Sie die Verwendung von temporären gespeicherten Prozeduren

� Löschen Sie Einträge nie direkt aus der „syscomments“-Systemtabelle

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Berücksichtigen Sie beim Erstellen gespeicherter Prozeduren die folgenden Richtlinien:

� Um Situationen zu vermeiden, in denen der Besitzer einer gespeicherten Prozedur nicht mit dem Besitzer der zugrunde liegenden Tabellen überein-stimmt, empfiehlt es sich, den Benutzer dbo als Besitzer aller Objekte in einer Datenbank anzugeben. Da ein Benutzer Mitglied mehrerer Rollen sein kann, sollten Sie beim Erstellen des Objekts immer den Benutzer dbo als Besitzernamen angeben. Andernfalls wird beim Erstellen des Objekts Ihr Benutzername als Besitzer festgelegt:

• Sie müssen über die entsprechenden Berechtigungen für alle Tabellen oder Sichten verfügen, auf die innerhalb der gespeicherten Prozedur verwiesen wird.

• Vermeiden Sie Situationen, in denen der Besitzer einer gespeicherten Prozedur und der Besitzer der zugrunde liegenden Tabellen voneinander abweichen.

Wenn Sie eine benutzerdefinierte gespeicherte Systemproze-dur erstellen, müssen Sie als Mitglied der Systemadministratorrolle (sysadmin) angemeldet sein und die master-Datenbank verwenden.

� Entwerfen Sie jede gespeicherte Prozedur so, dass sie einen einzigen Task ausführt.

� Erstellen und testen Sie die gespeicherte Prozedur auf dem Server, und be-heben Sie hier eventuell auftretende Probleme. Testen Sie sie anschließend vom Client aus.

� Um gespeicherte Systemprozeduren problemlos unterscheiden zu können, vermeiden Sie das Präfix sp_, wenn Sie Namen für lokale gespeicherte Pro-zeduren festlegen.

ThemaBeschreiben Sie die Richt-linien für das Erstellen ge-speicherter Prozeduren.

EinstiegBerücksichtigen Sie beim Erstellen gespeicherter Pro-zeduren folgende Richt-linien.

Anmerkung

Methodischer Hinweis Empfehlen Sie den Kursteil-nehmern, die Leistung einer gespeicherten Prozedur zu-nächst mit Hilfe von osql zu testen, da auf diese Weise nur geringfügiger Aufwand für die Anwendung verur-sacht wird.

Page 483: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 9: Implementieren gespeicherter Prozeduren 15

� Verwenden Sie für alle gespeicherten Prozeduren dieselben Verbindungs-einstellungen. SQL Server speichert die Einstellungen sowohl für SET QUOTED_IDENTIFIER als auch für SET ANSI_NULLS, wenn eine gespeicherte Prozedur erstellt oder geändert wird. Diese Originaleinstellun-gen werden verwendet, wenn die gespeicherte Prozedur ausgeführt wird. Aus diesem Grund werden alle Clientsitzungseinstellungen für diese SET-Optionen während der Ausführung einer gespeicherten Prozedur ignoriert. Andere SET-Optionen, wie z. B. SET ARITHABORT, SET ANSI_WARNINGS und SET ANSI_PADDINGS, werden beim Erstellen oder Ändern einer gespeicherten Prozedur nicht gespeichert. Um zu ermitteln, ob die ANSI SET-Optionen beim Erstellen einer gespei-cherten Prozedur aktiviert waren, fragen Sie die OBJECTPROPERTY-Systemfunktion ab. SET-Optionen sollten während der Ausführung von gespeicherten Prozeduren nicht geändert werden.

� Minimieren Sie die Verwendung von temporären gespeicherten Prozeduren, um Konflikte in den Systemtabellen von tempdb zu vermeiden, da sich diese negativ auf die Leistung auswirken können.

� Verwenden Sie sp_executesql anstelle der EXECUTE-Anweisung, um eine Zeichenfolge in einer gespeicherten Prozedur dynamisch auszuführen. Die Verwendung von sp_executesql ist effizienter, da diese Prozedur Ausfüh-rungspläne generiert, die von SQL Server höchstwahrscheinlich wiederver-wendet werden können. SQL Server kompiliert die Transact-SQL-Anwei-sung oder -Anweisungen in der Zeichenfolge zu einem Ausführungsplan, der vom Ausführungsplan der gespeicherten Prozedur getrennt ist. Sie kön-nen sp_executesql für das mehrfache Ausführen einer Transact-SQL-An-weisung verwenden, wenn sich von Ausführung zu Ausführung lediglich die Parameterwerte ändern, die für die Transact-SQL-Anweisung bereit-gestellt werden.

� Löschen Sie nie Einträge direkt aus der syscomments-Systemtabelle. Wenn Sie verhindern möchten, dass Benutzer den Text der gespeicherten Proze-duren lesen können, müssen Sie diese unter Verwendung der Option WITH ENCRYPTION erstellen. Wird die Option WITH ENCRYPTION nicht verwendet, können die Benutzer SQL Server Enterprise Manager verwen-den oder die gespeicherte Systemprozedur sp_helptext ausführen, um den Text der in der syscomments-Systemtabelle enthaltenen gespeicherten Pro-zeduren anzuzeigen.

Page 484: Programmieren Einer Microsoft SQL Server 2000-Datenbank

16 Unterrichtseinheit 9: Implementieren gespeicherter Prozeduren

Ausführen von gespeicherten Prozeduren

� Selbstständiges Ausführen einer gespeicherten Prozedur

� Ausführen einer gespeicherten Prozedur innerhalb einer INSERT-Anweisung

EXEC OverdueOrders

INSERT INTO CustomersEXEC EmployeeCustomer

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Eine gespeicherte Prozedur kann allein oder als Teil einer INSERT-Anweisung ausgeführt werden. Sie müssen für die gespeicherte Prozedur über die EXECUTE-Berechtigung verfügen.

Selbstständiges Ausführen einer gespeicherten Prozedur Eine gespeicherte Prozedur kann durch Ausgeben einer EXECUTE-Anweisung zusammen mit dem Namen der gespeicherten Prozedur und den entsprechenden Parametern ausgeführt werden.

[ EXEC [ UTE ] ] { [ @return_status = ] { procedure_name [ ;number ] | @procedure_name_var } } [ [ @parameter = ] { value | @variable [ OUTPUT ] | [ DEFAULT ] } ] [ ,...n ][ WITH RECOMPILE ]

Mit der folgenden Anweisung wird eine gespeicherte Prozedur ausgeführt, die alle überfälligen Bestellungen aus der Northwind-Datenbank auflistet.

EXEC OverdueOrders

Ausführen einer gespeicherten Prozedur innerhalb einer INSERT-AnweisungMit der INSERT-Anweisung kann eine lokale Tabelle mit einem Resultset auf-gefüllt werden, das von einer lokalen oder einer remote gespeicherten Prozedur zurückgegeben wird. SQL Server lädt die Tabelle mit den Daten, die von den SELECT-Anweisungen in der gespeicherten Prozedur zurückgegeben werden. Die Tabelle muss bereits vorhanden sein, und die Datentypen müssen über-einstimmen.

ThemaBeschreiben Sie, wie eine gespeicherte Prozedur aus-geführt wird.

EinstiegEine gespeicherte Prozedur kann selbstständig oder als Teil einer INSERT-Anwei-sung ausgeführt werden.

Methodischer Hinweis Empfehlen Sie den Kursteil-nehmern die Verwendung der EXECUTE-Anweisung für einzelne gespeicherte Prozeduren, da auf diese Weise Fehler beim Aus-führen von gespeicherten Prozeduren in Batches ver-mieden werden können.

Syntax

Beispiel 1

Gespeicherte Prozeduren, die innerhalb einer INSERT-Anweisung ausgeführt wer-den, müssen ein relatio-nales Resultset zurück-geben. Beispielsweise kann keine COMPUTE BY-An-weisung verwendet werden.

Page 485: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 9: Implementieren gespeicherter Prozeduren 17

Mit der folgenden Anweisung wird die gespeicherte Prozedur EmployeeCustomer erstellt, die Mitarbeiter in die Customers-Tabelle der Northwind-Datenbank einfügt.

USE Northwind GOCREATE PROC dbo.EmployeeCustomer ASSELECT UPPER(SUBSTRING(LastName, 1, 4)+SUBSTRING(FirstName, 1,1)), 'Northwind Traders', RTRIM(FirstName)+' '+LastName, 'Employee', Address, City, Region, PostalCode, Country, ('(206) 555-1234'+' x'+Extension), NULL FROM Employees WHERE HireDate < GETDATE () GO

Die folgenden Anweisungen führen die gespeicherte Prozedur EmployeeCustomer aus.

INSERT INTO Customers EXEC EmployeeCustomer

Die vor dem heutigen Datum eingestellten Mitarbeiter werden zur Customers-Tabelle hinzugefügt.

(9 row(s) affected)

Beispiel 2

Ergebnis

Page 486: Programmieren Einer Microsoft SQL Server 2000-Datenbank

18 Unterrichtseinheit 9: Implementieren gespeicherter Prozeduren

Ändern und Löschen gespeicherter Prozeduren � Ändern gespeicherter Prozeduren

� Einschließen aller Optionen in ALTER PROCEDURE� Geschachtelte gespeicherte Prozeduren sind nicht betroffen

USE NorthwindGOALTER PROC dbo.OverdueOrdersASSELECT CONVERT(char(8), RequiredDate, 1) RequiredDate,

CONVERT(char(8), OrderDate, 1) OrderDate,OrderID, CustomerID, EmployeeIDFROM Orders

WHERE RequiredDate < GETDATE() AND ShippedDate IS NullORDER BY RequiredDateGO

USE NorthwindGOALTER PROC dbo.OverdueOrdersASSELECT CONVERT(char(8), RequiredDate, 1) RequiredDate,

CONVERT(char(8), OrderDate, 1) OrderDate,OrderID, CustomerID, EmployeeIDFROM Orders

WHERE RequiredDate < GETDATE() AND ShippedDate IS NullORDER BY RequiredDateGO

� Löschen gespeicherter Prozeduren� Ausführen der gespeicherten Prozedur sp_depends, um zu ermitteln,

ob Objekte von der gespeicherten Prozedur abhängig sind

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Die Änderung gespeicherter Prozeduren erfolgt häufig als Reaktion auf Benutzeranfragen oder aufgrund von Änderungen der zugrunde liegenden Tabellendefinitionen.

Ändern gespeicherter Prozeduren Wenn Sie eine vorhandene gespeicherte Prozedur ändern und die Berech-tigungszuweisungen beibehalten möchten, verwenden Sie die ALTER PROCEDURE-Anweisung. Wenn eine gespeicherte Prozedur mit ALTER PROCEDURE geändert wird, wird die vorherige Definition der gespeicherten Prozedur von SQL Server ersetzt.

Es wird ausdrücklich davon abgeraten, gespeicherte Systemproze-duren direkt zu ändern. Erstellen Sie stattdessen eine benutzerdefinierte ge-speicherte Systemprozedur, indem Sie die Anweisungen einer vorhandenen gespeicherten Systemprozedur kopieren und dann Ihren Wünschen ent-sprechend ändern.

Berücksichtigen Sie beim Verwenden der ALTER PROCEDURE-Anweisung die folgenden Aspekte:

� Wenn Sie eine gespeicherte Prozedur ändern möchten, die mit Optionen wie z. B. der WITH ENCRYPTION-Option erstellt wurde, müssen Sie die Option in die ALTER PROCEDURE-Anweisung einschließen, um die von der Option bereitgestellte Funktionalität beizubehalten.

� Mit ALTER PROCEDURE wird nur eine einzelne Prozedur geändert. Wenn die Prozedur weitere gespeicherte Prozeduren aufruft, sind die geschachtelten gespeicherten Prozeduren nicht betroffen.

� Die Berechtigung zum Ausführen dieser Anweisung ist standardmäßig den Erstellern der ursprünglichen gespeicherten Prozedur sowie den Mitgliedern der Serverrolle sysadmin und den Mitgliedern der festen Datenbankrollen db_owner und db_ddladmin vorbehalten. Sie können die Berechtigung zum Ausführen von ALTER PROCEDURE nicht erteilen.

ThemaGeben Sie eine Einführung in die ALTER PROCEDURE-Anweisung.

EinstiegDie Änderung gespeicherter Prozeduren erfolgt häufig als Reaktion auf Benutzer-anfragen oder aufgrund von Änderungen der zugrunde liegenden Tabellendefini-tionen.

Achtung

Page 487: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 9: Implementieren gespeicherter Prozeduren 19

ALTER PROC [ EDURE ] procedure_name [ ; number ] [ { @parameter data_type } [ VARYING ] [ = default ] [ OUTPUT ] ] [ ,...n ][ WITH { RECOMPILE | ENCRYPTION | RECOMPILE , ENCRYPTION } ][FOR REPLICATION] AS

sql_statement [ ...n ]

Im folgenden Beispiel wird die gespeicherte Prozedur OverdueOrders geän-dert, um anstelle von allen Spalten nur bestimmte Spaltennamen aus der Orders-Tabelle auszuwählen und das Resultset zu sortieren.

USE Northwind GOALTER PROC dbo.OverdueOrders ASSELECT CONVERT(char(8), RequiredDate, 1) RequiredDate, CONVERT(char(8), OrderDate, 1) OrderDate, OrderID, CustomerID, EmployeeID FROM Orders WHERE RequiredDate < GETDATE() AND ShippedDate IS Null ORDER BY RequiredDate GO

Die folgende Anweisung führt die gespeicherte Prozedur OverdueOrders aus.

EXEC OverdueOrders

Wenn die gespeicherte Prozedur OverdueOrders ausgeführt wird, wird ein Resultset basierend auf dem Datum des heutigen Tages zurückgegeben, das ungefähr dem folgenden gleicht.

RequiredDate OrderDate OrderID CustomerID EmployeeID

05/06/98 04/08/98 11008 ERNSH 7 05/11/98 04/13/98 11019 RANCH 6 05/19/98 04/21/98 11039 LINOD 1 05/21/98 04/22/98 11040 GREAL 4 05/25/98 04/23/98 11045 BOTTM 6 . . . (21 row(s) affected)

Syntax

Beispiel

Ergebnis

Page 488: Programmieren Einer Microsoft SQL Server 2000-Datenbank

20 Unterrichtseinheit 9: Implementieren gespeicherter Prozeduren

Löschen gespeicherter Prozeduren Verwenden Sie die DROP PROCEDURE-Anweisung, um benutzerdefinierte gespeicherte Prozeduren aus der aktuellen Datenbank zu entfernen.

Führen Sie vor dem Löschen einer gespeicherten Prozedur die gespeicherte Pro-zedur sp_depends aus, um zu ermitteln, ob Objekte von der Prozedur abhängig sind.

DROP PROCEDURE { procedure } [ ,...n ]

In diesem Beispiel wird die gespeicherte Prozedur OverdueOrders gelöscht.

USE Northwind GODROP PROC dbo.OverdueOrders GO

Syntax

Beispiel

Page 489: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 9: Implementieren gespeicherter Prozeduren 21

Übungseinheit A: Erstellen gespeicherter Prozeduren

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

LernzieleAm Ende dieser Übungseinheit werden Sie in der Lage sein, die folgenden Aufgaben auszuführen:

� Erstellen einer gespeicherten Prozedur mit Hilfe von SQL Query Analyzer. � Anzeigen von Informationen zu den von Ihnen erstellten gespeicherten

Prozeduren.

VoraussetzungenUm diese Übungseinheit zu bearbeiten, benötigen Sie Folgendes:

� Die Skriptdateien für diese Übungseinheit, die sich in C:\Moc\2328A\Labfiles\L09 befinden.

� Die Antwortdateien für diese Übungseinheit, die sich in C:\Moc\2328A\Labfiles\L09\Answers befinden.

Einrichten der ÜbungseinheitUm diese Übungseinheit zu bearbeiten, ist eine der folgenden Aktionen erforderlich:

� Bearbeiten der vorherigen Übungseinheit. � Ausführen der Batchdatei C:\Moc\2328A\Batches\Restore09A.cmd.

Mit dieser Befehlsdatei wird die ClassNorthwind-Datenbank wieder in den Zustand zurückversetzt, der für diese Übungseinheit erforderlich ist.

ThemaGeben Sie eine Einführung in die Übungseinheit.

EinstiegIn dieser Übungseinheit er-stellen Sie gespeicherte Prozeduren und zeigen Informationen zu den Prozeduren an.

Erläutern Sie die Lernziele der Übungseinheit.

Page 490: Programmieren Einer Microsoft SQL Server 2000-Datenbank

22 Unterrichtseinheit 9: Implementieren gespeicherter Prozeduren

Weitere Informationen Sollten Sie beim Ausführen von Dateien Hilfe benötigen, suchen Sie in der Hilfe von SQL Query Analyzer nach „Ausführen einer Abfrage“.

Daneben sind die folgenden Informationsquellen verfügbar:

� Das Northwind-Datenbankschema. � Die Microsoft SQL Server-Onlinedokumentation.

SzenarioDer Aufbau des Schulungsraumes soll die Organisation des weltweit agieren-den Handelsunternehmens Northwind Traders widerspiegeln. Das Unternehmen hat den fiktiven Domänennamen nwtraders.msft. Der primäre DNS-Server für nwtraders.msft ist der Kursleitercomputer, dessen IP-Adresse (Internetproto-koll) 192.168.x.200 lautet (wobei x die zugewiesene Schulungsraumnummer ist). Der Name des Kursleitercomputers ist London.

Die folgende Tabelle stellt den Benutzernamen, den Computernamen und die IP-Adresse für jeden Kursteilnehmercomputer in der fiktiven Domäne nwtraders.msft bereit. Suchen Sie den Ihrem Computer zugewiesenen Benutzernamen und notieren Sie ihn.

Benutzername Computername IP-Adresse

SQLAdmin1 Vancouver 192.168.x.1SQLAdmin2 Denver 192.168.x.2SQLAdmin3 Perth 192.168.x.3SQLAdmin4 Brisbane 192.168.x.4SQLAdmin5 Lisbon 192.168.x.5SQLAdmin6 Bonn 192.168.x.6SQLAdmin7 Lima 192.168.x.7SQLAdmin8 Santiago 192.168.x.8SQLAdmin9 Bangalore 192.168.x.9SQLAdmin10 Singapore 192.168.x.10SQLAdmin11 Casablanca 192.168.x.11SQLAdmin12 Tunis 192.168.x.12SQLAdmin13 Acapulco 192.168.x.13SQLAdmin14 Miami 192.168.x.14SQLAdmin15 Auckland 192.168.x.15SQLAdmin16 Suva 192.168.x.16SQLAdmin17 Stockholm 192.168.x.17SQLAdmin18 Moscow 192.168.x.18SQLAdmin19 Caracas 192.168.x.19SQLAdmin20 Montevideo 192.168.x.20SQLAdmin21 Manila 192.168.x.21SQLAdmin22 Tokyo 192.168.x.22SQLAdmin23 Khartoum 192.168.x.23SQLAdmin24 Nairobi 192.168.x.24

Veranschlagte Zeit für die Übungseinheit: 15 Minuten

Page 491: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 9: Implementieren gespeicherter Prozeduren 23

Übung 1 Schreiben und Ausführen einer gespeicherten Prozedur

In dieser Übung erstellen Sie eine gespeicherte Prozedur, die die fünf teuersten Artikel nach dem Preis geordnet auflistet.

� So erstellen Sie eine gespeicherte Prozedur mit Hilfe von SQL Query Analyzer

In diesem Verfahren erstellen Sie eine gespeicherte Prozedur, die die fünf teuersten Artikel auflistet. C:\Moc\2328A\Labfiles\L09\Answers\FiveMostExpensiveProducts.sqlenthält ein vollständiges Skript für dieses Verfahren. 1. Melden Sie sich mit Hilfe der Informationen in der folgenden Tabelle an der

Schulungsraumdomäne nwtraders an.

Option Eingabe

Benutzername SQLAdminx (wobei x die Ihrem Computernamen zugewiesene Nummer ist, wie in der Schulungsraumdomäne nwtraders.msftfestgelegt)

Kennwort password

2. Öffnen Sie SQL Query Analyzer, und melden Sie sich gegebenenfalls mit Microsoft Windows®-Authentifizierung am (lokalen) Server an. Sie verfügen über die Berechtigung, sich bei SQL Server anzumelden und SQL Server zu verwalten, da Sie als SQLAdminx angemeldet sind und SQLAdminx ein Mitglied der lokalen Windows 2000-Gruppe Administratoren ist. Alle Mitglieder dieser Gruppe werden automatisch der sysadmin-Rolle von SQL Server zugeordnet.

3. Überprüfen Sie, ob Sie die ClassNorthwind-Datenbank verwenden. 4. Schreiben Sie eine Abfrage, die auf der Products-Tabelle ausgeführt wird

und die nur den Artikelnamen und den Stückpreis auflistet. Begrenzen Sie die zurückgegebenen Zeilen auf die fünf teuersten Artikel, und ordnen Sie das Resultset nach dem Stückpreis.

5. Testen Sie die Abfrage, um sicherzustellen, dass sie das erwartete Resultset zurückgibt.

6. Ändern Sie die Abfrage, um die gespeicherte Prozedur FiveMostExpensiveProducts zu erstellen.

7. Speichern Sie das Skript unter C:\Moc\2328A\Labfiles\L09\FiveMostExpensiveProducts.sql.

8. Führen Sie die gespeicherte Prozedur aus, um zu überprüfen, ob sie wie erwartet funktioniert. Welches sind die fünf teuersten Artikel? Côte de Blaye, Thüringer Rostbratwurst, Mishi Kobe Niku, Sir Rodney's Marmalade und Carnarvon Tigers. ____________________________________________________________

____________________________________________________________

Page 492: Programmieren Einer Microsoft SQL Server 2000-Datenbank

24 Unterrichtseinheit 9: Implementieren gespeicherter Prozeduren

Übung 2 Anzeigen von Informationen zu gespeicherten Prozeduren

In dieser Übung führen Sie gespeicherte Systemprozeduren aus und verwenden SQL Server Enterprise Manager und SQL Query Analyzer, um Informationen zu den von Ihnen erstellten gespeicherten Prozeduren anzuzeigen.

� So zeigen Sie Definitionen gespeicherter Prozeduren an In diesem Verfahren verwenden Sie SQL Server Enterprise Manager und SQL Query Analyzer, um Definitionen gespeicherter Prozeduren anzuzeigen. 1. Öffnen Sie SQL Server Enterprise Manager. 2. Erweitern Sie Microsoft SQL Servers, erweitern Sie SQL Server-Gruppe,

erweitern Sie Ihren Server, erweitern Sie Datenbanken, erweitern Sie ClassNorthwind, und klicken Sie dann auf Gespeicherte Prozeduren.

3. Klicken Sie im Detailbereich mit der rechten Maustaste auf FiveMostExpensiveProducts, und klicken Sie dann auf Eigenschaften.

4. Sehen Sie sich die Definition der gespeicherten Prozedur an. 5. Öffnen Sie SQL Query Analyzer. 6. Überprüfen Sie, ob Sie die ClassNorthwind-Datenbank verwenden. 7. Führen Sie im Abfragefenster die folgende gespeicherte Systemprozedur

aus.sp_helptext FiveMostExpensiveProducts

8. Sehen Sie sich die Definition der gespeicherten Prozedur an.

� So zeigen Sie Metadateninformationen zu gespeicherten Prozeduren an In diesem Verfahren verwenden Sie die Funktionen OBJECT_ID und OBJECTPROPERTY, um Metadaten zu gespeicherten Prozeduren anzuzeigen. 1. Ermitteln Sie mit Hilfe von SQL Query Analyzer die Objekt-ID der

gespeicherten Prozedur FiveMostExpensiveProducts, indem Sie die folgende Anweisung ausführen: SELECT OBJECT_ID('FiveMostExpensiveProducts')

Notieren Sie die Objekt-ID. ____________________________________________________________

2. Führen Sie die folgende Anweisung aus, um zu ermitteln, ob die Verbindungseinstellung für die Option ANSI_NULLS beim Erstellen der gespeicherten Prozedur FiveMostExpensiveProducts aktiviert war: Ersetzen Sie x durch die Objekt-ID der gespeicherten Prozedur. SELECT OBJECTPROPERTY(x, 'ExecIsAnsiNullsOn')

Wie lautet das Ergebnis? 1 (True). ____________________________________________________________

____________________________________________________________

Page 493: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 9: Implementieren gespeicherter Prozeduren 25

3. Führen Sie die folgende Anweisung aus, um zu ermitteln, ob die Ver-bindungseinstellung für ANSI quoted identifier beim Erstellen der gespeicherten Prozedur FiveMostExpensiveProducts aktiviert war: Ersetzen Sie x durch die Objekt-ID der gespeicherten Prozedur. SELECT OBJECTPROPERTY(x, 'ExecIsQuotedIdentOn')

Wie lautet das Ergebnis? 0 (False). ____________________________________________________________

____________________________________________________________

Page 494: Programmieren Einer Microsoft SQL Server 2000-Datenbank

26 Unterrichtseinheit 9: Implementieren gespeicherter Prozeduren

���� Verwenden von Parametern in gespeicherten Prozeduren

� Verwenden von Eingabeparametern

� Ausführen gespeicherter Prozeduren mit Hilfe von Eingabeparametern

� Zurückgeben von Werten mit Hilfe von Ausgabeparametern

� Explizites erneutes Kompilieren gespeicherter Prozeduren

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Parameter erweitern die Funktionalität von gespeicherten Prozeduren. Mit Para-metern können Sie Informationen an gespeicherte Prozeduren übergeben oder von ihnen übernehmen. Sie bieten Ihnen die Möglichkeit, eine Datenbank mehrfach mit Hilfe derselben gespeicherten Prozedur zu durchsuchen.

Beispielsweise können Sie einen Parameter zu einer gespeicherten Prozedur hinzufügen, mit der die Employee-Tabelle nach Mitarbeitern durchsucht wird, deren Einstellungsdatum mit dem von Ihnen angegebenen Datum überein-stimmt. Die gespeicherte Prozedur kann nun jedes Mal mit einem anderen Einstellungsdatum ausgeführt werden.

SQL Server unterstützt zwei Parametertypen: Eingabeparameter und Ausgabe-parameter.

ThemaGeben Sie eine Übersicht über die Themen dieses Abschnitts.

EinstiegIn diesem Abschnitt werden diese Themen behandelt...

Page 495: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 9: Implementieren gespeicherter Prozeduren 27

Verwenden von Eingabeparametern

� Zunächst Überprüfen aller eingehenden Parameterwerte

� Festlegen geeigneter Standardwerte und Einschließen von Überprüfungen auf das Vorhandensein von NULL-Werten

CREATE PROCEDURE dbo.[Year to Year Sales]@BeginningDate DateTime, @EndingDate DateTime

ASIF @BeginningDate IS NULL OR @EndingDate IS NULLBEGIN

RAISERROR('NULL-Werte sind nicht erlaubt', 14, 1)RETURN

ENDSELECT O.ShippedDate,

O.OrderID, OS.Subtotal, DATENAME(yy,ShippedDate) AS Year

FROM ORDERS O INNER JOIN [Order Subtotals] OSON O.OrderID = OS.OrderID

WHERE O.ShippedDate BETWEEN @BeginningDate AND @EndingDateGO

CREATE PROCEDURE dbo.[Year to Year Sales]@BeginningDate DateTime, @EndingDate DateTime

ASIF @BeginningDate IS NULL OR @EndingDate IS NULLBEGIN

RAISERROR('NULL-Werte sind nicht erlaubt', 14, 1)RETURN

ENDSELECT O.ShippedDate,

O.OrderID, OS.Subtotal, DATENAME(yy,ShippedDate) AS Year

FROM ORDERS O INNER JOIN [Order Subtotals] OSON O.OrderID = OS.OrderID

WHERE O.ShippedDate BETWEEN @BeginningDate AND @EndingDateGO

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Eingabeparameter ermöglichen es Ihnen, Informationen an eine gespeicherte Prozedur zu übergeben. Wenn Sie eine gespeicherte Prozedur definieren möchten, die Eingabeparameter annimmt, müssen Sie in der CREATE PROCEDURE-Anweisung eine oder mehrere Variablen als Parameter deklarieren.

@parameter data_type [= default]

Berücksichtigen Sie beim Angeben von Parametern die folgenden Aspekte und Richtlinien:

� Alle eingehenden Parameterwerte sollten am Anfang einer gespeicherten Prozedur überprüft werden, um fehlende und ungültige Werte möglichst frühzeitig aufzuspüren.

� Legen Sie geeignete Standardwerte für einen Parameter fest. Nach der Definition eines Standardwertes können Benutzer die gespeicherte Prozedur ausführen, ohne einen Wert für diesen Parameter angeben zu müssen.

Bei Parameterstandardwerten muss es sich um Konstanten oder um NULL-Werte handeln. Wenn Sie NULL als Standardwert für einen Parameter festlegen, müssen Sie „=NULL“ verwenden. Die Verwendung von „IS NULL“ ist nicht möglich, da die Syntax die NULL-Codierung nach ANSI nicht unterstützt.

� Die maximale Anzahl der Parameter in einer gespeicherten Prozedur beträgt 1.024.

ThemaGeben Sie eine Einführung in Eingabeparameter.

EinstiegEingabeparameter ermög-lichen es Ihnen, Informa-tionen an eine gespeicherte Prozedur zu übergeben.

Teilsyntax

Anmerkung

Page 496: Programmieren Einer Microsoft SQL Server 2000-Datenbank

28 Unterrichtseinheit 9: Implementieren gespeicherter Prozeduren

� Die maximale Anzahl lokaler Variablen in einer gespeicherten Prozedur ist nur durch den verfügbaren Arbeitsspeicher begrenzt.

� Parameter werden lokal in einer gespeicherten Prozedur verwendet. Die gleichen Parameternamen können auch in anderen gespeicherten Prozeduren verwendet werden.

Die Parameterdaten werden in der syscolumns-Systemtabelle gespeichert.

Im folgenden Beispiel wird die gespeicherte Prozedur Year to Year Saleserstellt, die alle Umsätze zwischen den angegebenen Daten zurückgibt.

CREATE PROCEDURE dbo.[Year to Year Sales] @BeginningDate DateTime, @EndingDate DateTime ASIF @BeginningDate IS NULL OR @EndingDate IS NULL BEGIN RAISERROR('NULL-Werte sind nicht erlaubt', 14, 1) RETURN ENDSELECT O.ShippedDate, O.OrderID, OS.Subtotal, DATENAME(yy,ShippedDate) AS Year FROM ORDERS O INNER JOIN [Order Subtotals] OS ON O.OrderID = OS.OrderID WHERE O.ShippedDate BETWEEN @BeginningDate AND @EndingDate GO

Beispiel

Page 497: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 9: Implementieren gespeicherter Prozeduren 29

Ausführen gespeicherter Prozeduren mit Hilfe von Eingabeparametern

� Übergeben von Werten durch Parameternamen

� Übergeben von Werten durch Position

EXEC AddCustomer 'ALFKI2', 'Alfreds Futterkiste', 'Maria Anders', 'Sales Representative', 'Obere Str. 57', 'Berlin', NULL, '12209', 'Germany', '030-0074321'

EXEC AddCustomer 'ALFKI2', 'Alfreds Futterkiste', 'Maria Anders', 'Sales Representative', 'Obere Str. 57', 'Berlin', NULL, '12209', 'Germany', '030-0074321'

EXEC AddCustomer @CustomerID = 'ALFKI',@ContactName = 'Maria Anders',@CompanyName = 'Alfreds Futterkiste',@ContactTitle = 'Sales Representative',@Address = 'Obere Str. 57',@City = 'Berlin',@PostalCode = '12209',@Country = 'Germany',@Phone = '030-0074321'

EXEC AddCustomer @CustomerID = 'ALFKI',@ContactName = 'Maria Anders',@CompanyName = 'Alfreds Futterkiste',@ContactTitle = 'Sales Representative',@Address = 'Obere Str. 57',@City = 'Berlin',@PostalCode = '12209',@Country = 'Germany',@Phone = '030-0074321'

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Wenn Sie einen Parameterwert festlegen möchten, können Sie den Wert entweder durch den Parameternamen oder durch die Position an die ge-speicherte Prozedur übergeben. Beim Angeben von Werten sollten die unterschiedlichen Formate nicht kombiniert werden.

Übergeben von Werten durch Parameternamen Das Angeben eines Parameters in einer EXECUTE-Anweisung im Format @parameter = value wird als Übergeben durch Parameternamen bezeichnet. Beim Übergeben von Werten durch Parameternamen können die Parameter-werte in einer beliebigen Reihenfolge angegeben werden. Darüber hinaus können Sie Parameter auslassen, die NULL-Werte zulassen oder für die ein Standardwert festgelegt wurde.

Der Standardwert eines Parameters, falls ein solcher Wert für den Parameter in der gespeicherten Prozedur definiert ist, wird in den folgenden Situationen ver-wendet:

� Beim Ausführen der gespeicherten Prozedur wurde kein Wert für den Para-meter angegeben.

� Das DEFAULT-Schlüsselwort ist als Wert für den Parameter angegeben.

[ EXEC [ UTE ] ] { [ @return_status = ] { procedure_name [ ;number ] | @procedure_name_var } } [ [ @parameter = ] { value | @variable [ OUTPUT ] | [ DEFAULT ] } ] [ ,...n ] [ WITH RECOMPILE ]

ThemaZeigen Sie, wie gespei-cherte Prozeduren ausge-führt werden, indem die EXECUTE-Anweisung mit Parametern verwendet wird.

EinstiegDie Übergabe von Para-meterwerten an eine gespei-cherte Prozedur kann durch Verweis oder durch die Position erfolgen.

Methodischer Hinweis Empfehlen Sie aus Gründen der Lesbarkeit das Über-geben von Werten durch den Parameternamen.

Syntax

Page 498: Programmieren Einer Microsoft SQL Server 2000-Datenbank

30 Unterrichtseinheit 9: Implementieren gespeicherter Prozeduren

Im folgenden Teilbeispiel wird die gespeicherte Prozedur AddCustomererstellt, die einen neuen Kunden zur Northwind-Datenbank hinzufügt. Be-achten Sie, dass für alle Variablen mit Ausnahme von CustomerID und CompanyName angegeben wird, dass sie NULL-Werte zulassen müssen.

USE Northwind GOCREATE PROCEDURE dbo.AddCustomer @CustomerID nchar (5), @CompanyName nvarchar (40), @ContactName nvarchar (30) = NULL, @ContactTitle nvarchar (30) = NULL, @Address nvarchar (60) = NULL, @City nvarchar (15) = NULL, @Region nvarchar (15) = NULL, @PostalCode nvarchar (10) = NULL, @Country nvarchar (15) = NULL, @Phone nvarchar (24) = NULL, @Fax nvarchar (24) = NULL AS ...

Im folgenden Beispiel werden Werte durch den Parameternamen an die ge-speicherte Prozedur AddCustomer übergeben. Beachten Sie, dass sich die Reihenfolge der Werte von der Reihenfolge in der CREATE PROCEDURE-Anweisung unterscheidet.

Beachten Sie weiterhin, dass die Werte für die Parameter @Region und @Faxnicht angegeben werden. Wenn die Spalten Region und Fax in der Tabelle NULL-Werte zulassen, wird die gespeicherte Prozedur AddCustomer erfolg-reich ausgeführt. Wenn die Spalten Region und Fax jedoch keine NULL-Werte zulassen, müssen Sie einen Wert an den jeweiligen Parameter übergeben, und zwar unabhängig davon, ob die Definition des Parameters das Zulassen von NULL-Werten vorsieht.

EXEC AddCustomer @CustomerID = 'ALFKI', @ContactName = 'Maria Anders', @CompanyName = 'Alfreds Futterkiste', @ContactTitle = 'Sales Representative', @Address = 'Obere Str. 57', @City = 'Berlin', @PostalCode = '12209', @Country = 'Germany', @Phone = '030-0074321' ...

Teilbeispiel 1

Teilbeispiel 2

Page 499: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 9: Implementieren gespeicherter Prozeduren 31

Übergeben von Werten durch Position Werden nur Werte übergeben (ohne Verweis auf die Parameter, an die sie über-geben werden), wird dies als Übergeben durch Position bezeichnet. Wenn Sie nur einen Wert angeben, müssen die Parameterwerte in der Reihenfolge aufge-führt werden, in der sie in der CREATE PROCEDURE-Anweisung definiert wurden.

Bei der Übergabe von Werten durch Position können Sie Parameter auslassen, für die Standardwerte vorhanden sind. Sie dürfen die Reihenfolge der Parameter jedoch nicht unterbrechen. Wenn eine gespeicherte Prozedur beispielsweise über fünf Parameter verfügt, können Sie den vierten und fünften Parameter aus-lassen. Es ist jedoch nicht möglich, den vierten Parameter auszulassen und den fünften anzugeben.

Im folgenden Beispiel werden Werte durch die Position an die gespeicherte Prozedur AddCustomer übergeben. Beachten Sie, dass für die Parameter @Region und @Fax keine Werte vorhanden sind. Es wird jedoch nur der @Region-Parameter mit dem Wert NULL bereitgestellt. Der @Fax-Parameter wird ausgelassen, da es sich um den letzten Parameter handelt.

EXEC AddCustomer 'ALFKI2', 'Alfreds Futterkiste', 'Maria Anders', 'Sales Representative', 'Obere Str. 57', 'Berlin', NULL, '12209', 'Germany', '030-0074321'

Teilbeispiel 3

Page 500: Programmieren Einer Microsoft SQL Server 2000-Datenbank

32 Unterrichtseinheit 9: Implementieren gespeicherter Prozeduren

Zurückgeben von Werten mit Hilfe von Ausgabeparametern

CREATE PROCEDURE dbo.MathTutor@m1 smallint,@m2 smallint,@result smallint OUTPUT

ASSET @result = @m1* @m2

GO

DECLARE @answer smallintEXECUTE MathTutor 5,6, @answer OUTPUTSELECT 'Das Ergebnis ist: ', @answer

Das Ergebnis ist: 30

CREATE PROCEDURE dbo.MathTutor@m1 smallint,@m2 smallint,@result smallint OUTPUT

ASSET @result = @m1* @m2

GO

DECLARE @answer smallintEXECUTE MathTutor 5,6, @answer OUTPUTSELECT 'Das Ergebnis ist: ', @answer

Das Ergebnis ist: 30Ergebnisse dergespeichertenProzedur

Ergebnisse derErgebnisse dergespeichertengespeichertenProzedurProzedur

Ausführen dergespeichertenProzedur

Ausführen derAusführen dergespeichertengespeichertenProzedurProzedur

Erstellen dergespeichertenProzedur

Erstellen derErstellen dergespeichertengespeichertenProzedurProzedur

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Mit Hilfe von Ausgabeparametern (mit dem OUTPUT-Schlüsselwort gekenn-zeichnete Variablen) können gespeicherte Prozeduren Informationen an die aufrufende gespeicherte Prozedur oder an den Client zurückgeben. Durch das Verwenden von Ausgabeparametern können alle Änderungen an dem Para-meter, die sich aus der Ausführung der gespeicherten Prozedur ergeben, auch nach Abschluss der Ausführung der gespeicherten Prozedur beibehalten werden.

Um einen Ausgabeparameter zu verwenden, müssen Sie das OUTPUT-Schlüsselwort sowohl in der CREATE PROCEDURE-Anweisung als auch in der EXECUTE-Anweisung angeben. Wird das OUTPUT-Schlüsselwort beim Ausführen der gespeicherten Prozedur nicht angegeben, wird die gespeicherte Prozedur zwar weiterhin ausgeführt, es wird jedoch kein Wert zurückgegeben. Ausgabeparameter besitzen folgende Merkmale:

� Die aufrufende Anweisung muss einen Variablennamen für den Empfang des Rückgabewertes enthalten. Es können keine Konstanten übergeben werden.

� Die Variable kann nachfolgend in weiteren Transact-SQL-Anweisungen des Batches oder der aufrufenden gespeicherten Prozedur verwendet werden.

� Der Parameter kann einen beliebigen Datentyp mit Ausnahme von text oder image aufweisen.

� Es kann sich um Cursorvariablen handeln.

ThemaZeigen Sie, wie mit Hilfe des OUTPUT-Schlüsselwortes ein Wert erzeugt werden kann.

EinstiegEine gespeicherte Prozedur kann mehrere Werte zurück-geben. Jeder Wert muss sowohl in der gespeicherten Prozedur als auch in den aufrufenden Anweisungen mit Hilfe des OUTPUT-Schlüsselwortes als Variable definiert werden.

Methodischer Hinweis Geben Sie eine detaillierte Erläuterung des Beispiels auf der Folie, und zeigen Sie, wie die gespeicherte Prozedur MathTutor erstellt und verwendet wird.

Page 501: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 9: Implementieren gespeicherter Prozeduren 33

In diesem Beispiel wird die gespeicherte Prozedur MathTutor erstellt, die das Produkt aus zwei Zahlen berechnet. Im Beispiel wird die SET-Anweisung ver-wendet. Sie können jedoch auch die SELECT-Anweisung verwenden, um eine Zeichenfolge dynamisch zu verketten. Für eine SET-Anweisung müssen Sie eine Variable deklarieren, damit die Zeichenfolge „Das Ergebnis ist:“ ausge-geben wird.

CREATE PROCEDURE dbo.MathTutor @m1 smallint, @m2 smallint, @result smallint OUTPUT AS SET @result = @m1* @m2 GO

Dieser Batch ruft die gespeicherte Prozedur MathTutor auf und übergibt die Werte 5 und 6. Diese Werte werden zu Variablen, die in die SET-Anweisung eingegeben werden.

DECLARE @answer smallint EXECUTE MathTutor 5,6, @answer OUTPUT SELECT 'Das Ergebnis ist: ', @answer

Der @result-Parameter wird durch das OUTPUT-Schlüsselwort gekennzeich-net. SQL Server gibt den Inhalt der @result-Variable aus, wenn Sie die ge-speicherte Prozedur MathTutor ausführen. Die Ergebnisvariable ist als Pro-dukt der beiden Werte 5 und 6 definiert.

Das Ergebnis ist: 30

Beispiel 1

Ergebnis

Page 502: Programmieren Einer Microsoft SQL Server 2000-Datenbank

34 Unterrichtseinheit 9: Implementieren gespeicherter Prozeduren

Explizites erneutes Kompilieren gespeicherter Prozeduren

� Erneutes Kompilieren in folgenden Situationen

� Die gespeicherte Prozedur gibt stark voneinander abweichende Resultsets zurück

� Zu einer zugrunde liegenden Tabelle wird ein neuer Index hinzugefügt

� Der übergebene Parameterwert ist untypisch

� Erneutes Kompilieren mit Hilfe von

� CREATE PROCEDURE...[WITH RECOMPILE]

� EXECUTE...[WITH RECOMPILE] � sp_recompile

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Gespeicherte Prozeduren können explizit neu kompiliert werden. Dies sollte jedoch nicht die Regel sein und nur in folgenden Situationen erfolgen:

� Parameterwerte werden an eine gespeicherte Prozedur übergeben, die stark voneinander abweichende Resultsets zurückgibt.

� Zu einer zugrunde liegenden Tabelle wird ein neuer Index hinzugefügt, der möglicherweise von einer gespeicherten Prozedur vorteilhaft genutzt wer-den kann.

� Der übergebene Parameterwert ist untypisch.

SQL Server stellt drei Methoden für das explizite erneute Kompilieren einer gespeicherten Prozedur bereit.

ThemaErläutern Sie, wann ge-speicherte Prozeduren erneut kompiliert und welche Optionen dafür verwendet werden.

EinstiegGespeicherte Prozeduren können explizit neu kom-piliert werden. Dies sollte jedoch nicht die Regel sein.

Page 503: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 9: Implementieren gespeicherter Prozeduren 35

CREATE PROCEDURE…[WITH RECOMPILE] Die CREATE PROCEDURE...[WITH RECOMPILE]-Anweisung gibt an, dass SQL Server für diese gespeicherte Prozedur keinen Plan zwischenspeichert. Stattdessen wird die gespeicherte Prozedur bei jedem Ausführen dieser An-weisung erneut kompiliert.

Im folgenden Beispiel wird eine gespeicherte Prozedur mit der Bezeichnung OrderCount erstellt, die bei jedem Ausführen der Anweisung erneut kom-piliert wird.

USE Northwind GOCREATE PROC dbo.OrderCount @CustomerID nchar (10) WITH RECOMPILE AS SELECT count(*) FROM [Orders Qry] WHERE CustomerID = @CustomerID GO

EXECUTE…[WITH RECOMPILE] Wenn WITH RECOMPILE angegeben wird, erstellt die EXECUTE...[WITH RECOMPILE]-Anweisung einen neuen Ausführungsplan, sobald die Prozedur ausgeführt wird. Der neue Ausführungsplan wird nicht im Cache gespeichert. Verwenden Sie diese Option, wenn der übergebene Parameter stark von den normalerweise an die gespeicherte Prozedur übergebenen Parametern abweicht. Da dieser optimierte Plan eher die Ausnahme als die Regel darstellt, sollten Sie nach Abschluss der Ausführung die gespeicherte Prozedur erneut ausführen und hierfür einen Parameter verwenden, der üblicherweise übergeben wird. Diese Option ist auch hilfreich, wenn seit dem letzten Kompilieren der gespeicherten Prozedur eine umfangreiche Datenänderung stattgefunden hat.

In diesem Beispiel wird die gespeicherte Systemprozedur sp_help neu kom-piliert, wenn sie ausgeführt wird.

EXEC sp_help WITH RECOMPILE

sp_recompileDie gespeicherte Systemprozedur sp_recompile kompiliert die angegebene gespeicherte Prozedur oder den Trigger erneut, wenn sie bzw. er das nächste Mal ausgeführt wird. Wenn der @objname-Parameter eine Tabelle oder Sicht angibt, werden alle gespeicherten Prozeduren, die das genannte Objekt verwen-den, bei ihrer nächsten Ausführung erneut kompiliert.

Verwenden Sie die gespeicherte Systemprozedur sp_recompile mit der Option Tabellenname, wenn Sie einen neuen Index zu einer zugrunde liegenden Tabelle hinzugefügt haben, auf die die gespeicherte Prozedur verweist, und Sie annehmen, dass sich der neue Index positiv auf die Leistung der gespeicherten Prozedur auswirkt.

Beispiel 1

Beispiel 2

Page 504: Programmieren Einer Microsoft SQL Server 2000-Datenbank

36 Unterrichtseinheit 9: Implementieren gespeicherter Prozeduren

In diesem Beispiel werden alle gespeicherten Prozeduren oder Trigger erneut kompiliert, die auf die Customers-Tabelle in der Northwind-Datenbank ver-weisen.

EXEC sp_recompile Customers

Mit Hilfe von DBCC FREEPROCCACHE können Sie alle Aus-führungspläne für gespeicherte Prozeduren aus dem Cache löschen.

Beispiel 3

Anmerkung

Page 505: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 9: Implementieren gespeicherter Prozeduren 37

Ausführen erweiterter gespeicherter Prozeduren � Werden mit Hilfe der Open Data Services-API

programmiert

� Können Features enthalten, die mit C und C++ erstellt wurden

� Können mehrere Funktionen enthalten

� Können von einem Client oder von SQL Server aus aufgerufen werden

� Können nur zur „master“-Datenbank hinzugefügt werden

EXEC master..xp_cmdshell 'dir c:\'

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Erweiterte gespeicherte Prozeduren sind Funktionen innerhalb einer DLL, die die Funktionalität von SQL Server erweitern. Sie werden genauso wie ge-speicherte Prozeduren ausgeführt und unterstützen Eingabeparameter, Rück-gabestatuscodes und Ausgabeparameter.

In diesem Beispiel wird die erweiterte gespeicherte Prozedur xp_cmdshell aus-geführt, die eine Liste von Dateien und Unterverzeichnissen anzeigt, indem sie den Betriebssystembefehl dir ausführt.

EXEC master..xp_cmdshell 'dir c:\ '

Für erweiterte gespeicherte Prozeduren gilt Folgendes:

� Sie werden mit Hilfe der Open Data Services-API (Application Programming Interface, Schnittstelle für Anwendungsprogrammierung) programmiert.

� Sie bieten Ihnen die Möglichkeit, eigene externe Routinen in Programmier-sprachen wie z. B. Microsoft Visual C++® und Visual C zu erstellen.

� Sie können mehrere Funktionen enthalten. � Sie können von einem Client oder von SQL Server aus aufgerufen werden. � Sie können nur zur master-Datenbank hinzugefügt werden.

Sie können eine erweiterte gespeicherte Prozedur nur aus der master-Datenbank heraus oder durch explizites Angeben des Speicherortes master ausführen. Sie haben jedoch auch die Möglichkeit, eine benutzer-definierte gespeicherte Systemprozedur zu erstellen, die die erweiterte ge-speicherte Prozedur aufruft. Auf diese Weise können Sie die erweiterte gespeicherte Prozedur aus jeder beliebigen Datenbank heraus aufrufen.

ThemaBeschreiben Sie die Features von erweiterten gespeicherten Prozeduren.

EinstiegFür erweiterte gespei-cherte Prozeduren gilt Folgendes...

Beispiel 1

Anmerkung

Page 506: Programmieren Einer Microsoft SQL Server 2000-Datenbank

38 Unterrichtseinheit 9: Implementieren gespeicherter Prozeduren

In der folgenden Tabelle sind einige häufig verwendete erweiterte gespeicherte Prozeduren aufgeführt.

Erweiterte gespeicherte Prozedur Beschreibung

xp_cmdshell Diese Prozedur führt eine bestimmte Befehlszeichenfolge als Betriebssystembefehl aus und gibt eine aus Textzeilen be-stehende Ausgabe zurück.

xp_logevent Diese Prozedur protokolliert eine benutzerdefinierte Meldung in einer SQL Server-Protokolldatei oder in der Ereignisanzeige von Windows 2000.

In diesem Beispiel wird die gespeicherte Systemprozedur sp_helptext ausge-führt, um den Namen der DLL anzuzeigen, die die erweiterte gespeicherte Prozedur xp_cmdshell enthält.

EXEC master..sp_helptext xp_cmdshell

Das Ergebnis zeigt die DLL an, die die erweiterte gespeicherte Prozedur xp_cmdshell enthält.

xplog70.dll

Sie können auch eigene erweiterte gespeicherte Prozeduren erstellen. Im Allge-meinen werden erweiterte gespeicherte Prozeduren aufgerufen, um mit anderen Anwendungen oder dem Betriebssystem zu kommunizieren. Beispielsweise bietet Ihnen die Datei Sqlmap70.dll die Möglichkeit, mit Hilfe der erweiterten gespeicherten Prozedur xp_sendmail E-Mail-Nachrichten von SQL Server aus zu senden.

Wenn Sie beim Ausführen von SQL Server Setup die Option Entwicklungs-tools auswählen, installiert SQL Server Bespiele für erweiterte gespeicherte Prozeduren in Form von komprimierten, selbstextrahierenden ausführbaren Dateien im Ordner C:\Programme\Microsoft SQL Server\80\Tools\DevTools\Samples\ODS.

Methodischer Hinweis Führen Sie vor, wie die erweiterte gespeicherte Prozedur xp_cmdshellausgeführt wird, um Dateien anzuzeigen, die in einem der Verzeichnisse von SQL Server aufgeführt werden.

Beispiel 2

Ergebnis

Page 507: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 9: Implementieren gespeicherter Prozeduren 39

Behandeln von Fehlermeldungen

� Die RETURN-Anweisung beendet eine Abfrage oder eine gespeicherte Prozedur ohne Bedingung

� „sp_addmessage“ erstellt benutzerdefinierte Fehlermeldungen

� „@@error“ enthält die Fehlernummer für die letzte ausgeführte Anweisung

� RAISERROR-Anweisung

� Gibt benutzerdefinierte Fehlermeldungen oder Systemfehlermeldungen zurück

� Legt ein Systemflag fest, um einen Fehler aufzuzeichnen

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Um die Effektivität gespeicherter Prozeduren zu verbessern, sollten Sie Fehler-meldungen hinzufügen, die die Benutzer über den Transaktionsstatus (Erfolg oder Fehlschlag) informieren. Sie sollten die Überprüfung von Aufgaben- und Geschäftslogik sowie die Fehlerüberprüfung vor dem Transaktionsstart ausführen und möglichst kurze Transaktionen verwenden.

Mit Hilfe bestimmter Programmierungsstrategien, wie z. B. der Überprüfung auf das Vorhandensein bestimmter Daten, können Sie Fehler erkennen. Wenn ein Fehler auftritt, stellen Sie dem Client so viele Informationen wie möglich zur Verfügung. In der Fehlerbehandlungslogik können Rückgabecodes, SQL Server-Fehler und benutzerdefinierte Fehlermeldungen überprüft werden.

RETURN-Anweisung Die RETURN-Anweisung beendet eine Abfrage oder eine gespeicherte Pro-zedur ohne Bedingung. Sie kann auch einen ganzzahligen Statuswert (Rückgabecode) zurückgeben.

Durch den Rückgabewert 0 wird die erfolgreiche Ausführung angezeigt. Zurzeit werden Rückgabewerte zwischen 0 und -14 verwendet, Rückgabewerte zwischen -15 und -99 sind für die zukünftige Verwendung reserviert. Wenn kein benutzerdefinierter Rückgabewert angegeben wird, wird der SQL Server-Wert verwendet. Benutzerdefinierte Rückgabewerte haben stets Vorrang vor den von SQL Server bereitgestellten Werten.

ThemaErläutern Sie die verschie-denen Möglichkeiten für das Erstellen von Fehlermeldun-gen in gespeicherten Pro-zeduren.

EinstiegUm die Effektivität gespei-cherter Prozeduren zu ver-bessern, sollten Sie Fehler-meldungen hinzufügen, die die Benutzer über den Transaktionsstatus infor-mieren.

Auf den nächsten Seiten finden Sie eine Darstellung der Funktionsweise von Fehlermeldungen.

Page 508: Programmieren Einer Microsoft SQL Server 2000-Datenbank

40 Unterrichtseinheit 9: Implementieren gespeicherter Prozeduren

In diesem Beispiel wird die gespeicherte Prozedur GetOrders erstellt, die Informationen aus den Tabellen Orders und Customers abruft, indem die Orders Qry-Sicht abgefragt wird. Die RETURN-Anweisung in der ge-speicherten Prozedur GetOrders gibt die Gesamtzahl der Zeilen aus der SELECT-Anweisung an eine andere gespeicherte Prozedur zurück. Sie können die gespeicherte Prozedur GetOrders auch mit einer anderen gespeicherten Prozedur schachteln.

USE Northwind GOCREATE PROCEDURE dbo.GetOrders @CustomerID nchar (10) AS SELECT OrderID, CustomerID, EmployeeID FROM [Orders Qry] WHERE CustomerID = @CustomerID RETURN (@@ROWCOUNT) GO

sp_addmessageDiese gespeicherte Prozedur bietet Entwicklern die Möglichkeit, benutzer-definierte Fehlermeldungen zu erstellen. Vom System erstellte und benutzer-definierte Fehlermeldungen werden von SQL Server gleich behandelt. Alle Meldungen werden in der sysmessages-Tabelle der master-Datenbank ge-speichert. Diese Fehlermeldungen können auch automatisch in das Anwen-dungsprotokoll von Windows 2000 geschrieben werden.

In diesem Beispiel wird eine benutzerdefinierte Fehlermeldung erstellt, die bei Auftreten des Fehlers in das Anwendungsprotokoll von Windows 2000 ge-schrieben wird.

EXEC sp_addmessage @msgnum = 50010, @severity = 10, @msgtext = 'Kunde (Customer) kann nicht gelöscht werden.', @lang = 'us_english' @with_log = 'true'

@@errorDiese Systemfunktion enthält die Fehlernummer für die zuletzt ausgeführte Transact-SQL-Anweisung. Sie wird bei jedem Ausführen einer Anweisung ge-löscht und neu festgelegt. Beim erfolgreichen Ausführen der Anweisung wird der Wert 0 zurückgegeben. Mit Hilfe der @@error-Systemfunktion kann eine bestimmte Fehlernummer erkannt oder eine gespeicherte Prozedur ohne Bedin-gung beendet werden.

In diesem Beispiel wird die gespeicherte Prozedur AddSupplierProduct in der Northwind-Datenbank erstellt. Diese gespeicherte Prozedur verwendet die @@error-Systemfunktion, um zu ermitteln, ob beim Ausführen der einzelnen INSERT-Anweisungen ein Fehler auftritt. Wenn der Fehler auftritt, wird für die Transaktion ein Rollback ausgeführt.

Beispiel 1

Beispiel 2

Beispiel 3

Page 509: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 9: Implementieren gespeicherter Prozeduren 41

USE Northwind GOCREATE PROCEDURE dbo.AddSupplierProduct @CompanyName nvarchar (40) = NULL, @ContactName nvarchar (40) = NULL, @ContactTitle nvarchar (40)= NULL, @Address nvarchar (60) = NULL, @City nvarchar (15) = NULL, @Region nvarchar (40) = NULL, @PostalCode nvarchar (10) = NULL, @Country nvarchar (15) = NULL, @Phone nvarchar (24) = NULL, @Fax nvarchar (24) = NULL, @HomePage ntext = NULL, @ProductName nvarchar (40) = NULL, @CategoryID int = NULL, @QuantityPerUnit nvarchar (20) = NULL, @UnitPrice money = NULL, @UnitsInStock smallint = NULL, @UnitsOnOrder smallint = NULL, @ReorderLevel smallint = NULL, @Discontinued bit = NULL ASBEGIN TRANSACTION INSERT Suppliers ( CompanyName, ContactName, Address, City, Region, PostalCode, Country, Phone) VALUES ( @CompanyName, @ContactName, @Address, @City, @Region, @PostalCode, @Country, @Phone) IF @@error <> 0 BEGIN ROLLBACK TRAN RETURN END DECLARE @InsertSupplierID int SELECT @InsertSupplierID=@@identity INSERT Products ( ProductName, SupplierID, CategoryID, QuantityPerUnit, Discontinued) VALUES (

Page 510: Programmieren Einer Microsoft SQL Server 2000-Datenbank

42 Unterrichtseinheit 9: Implementieren gespeicherter Prozeduren

@ProductName, @InsertSupplierID, @CategoryID, @QuantityPerUnit, @Discontinued) IF @@error <> 0 BEGIN ROLLBACK TRAN RETURN END COMMIT TRANSACTION

RAISERROR-AnweisungDie RAISERROR-Anweisung gibt eine benutzerdefinierte Fehlermeldung zurück und legt ein Systemflag fest, um das Auftreten eines Fehlers aufzu-zeichnen. Wenn Sie die RAISERROR-Anweisung verwenden, müssen Sie einen Fehlerschweregrad und einen Meldungsstatus angeben.

Die RAISERROR-Anweisung ermöglicht der Anwendung, einen Eintrag aus der master..sysmessages-Systemtabelle abzurufen oder mit von Benutzern an-gegebenen Informationen dynamisch eine Meldung über Status und Schwere-grad zu erstellen. Die RAISERROR-Anweisung kann Fehlermeldungen in das SQL Server-Fehlerprotokoll und das Windows 2000-Anwendungsprotokoll schreiben.

In diesem Beispiel wird eine benutzerdefinierte Fehlermeldung ausgelöst, die dann in das Windows 2000-Anwendungsprotokoll geschrieben wird.

RAISERROR(50010, 16, 1) WITH LOG

Die PRINT-Anweisung gibt eine benutzerdefinierte Meldung an den Meldungshandler des Clients zurück. Im Gegensatz zur RAISERROR-Anweisung speichert die PRINT-Anweisung die Fehlernummer jedoch nicht in der @@error-Systemfunktion.

Beispiel 4

Methodischer Hinweis Für die RAISERROR-Anweisung müssen der Fehlerschweregrad und der Meldungsstatus angegeben werden.

Anmerkungen

Page 511: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 9: Implementieren gespeicherter Prozeduren 43

Vorführung: Behandeln von Fehlermeldungen

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Gehen Sie dieses Skript durch, während der Kursleiter auf die darin einge-schlossenen Fehlerbehandlungstechniken hinweist.

/* UpdateCustomerPhone Aktualisiert die Telefonnummer eines Kunden Die Fehlerbehandlung stellt sicher, dass eine gültige Kundenidentifikationsnummer angegeben wird *//*Die folgende benutzerdefinierte Meldung unterstützt die gespeicherte Prozedur UpdateCustomerPhone */ EXEC sp_addmessage 50010, 16, 'Kunden-ID (CustomerID) nicht gefunden.', 'us_english', @replace='replace' USE Northwind GOCREATE PROCEDURE UpdateCustomerPhone @CustomerID nchar (5) = NULL, @Phone nvarchar (24) = NULL ASIF @CustomerID IS NULL BEGIN PRINT 'Sie müssen eine gültige Kunden-ID (CustomerID) angeben.' RETURN END/* Sicherstellen, dass eine gültige Kunden-ID (CustomerID) angegeben wird' */

ThemaFühren Sie vor, wie Fehler-meldungen behandelt werden.

EinstiegIn dieser Vorführung wird die gespeicherte Prozedur analysiert, die Sie verwen-den würden, um ein Element aus der North-wind-Datenbank zu ent-fernen.

Methodischer Hinweis Sie müssen den Abschnitt „Hinweise für den Kursleiter“ für diese Unterrichtseinheit lesen; hier finden Sie die Informationen zum Ein-richten der Vorführung.

Besprechen Sie das Skript D09_UpdateCustomerPhone.sql genau, und führen Sie es dann aus.

Überprüfen Sie mit Hilfe des Skripts D09_TestUpdate.sql, ob die Fehlerbehandlungslogik funktioniert.

Page 512: Programmieren Einer Microsoft SQL Server 2000-Datenbank

44 Unterrichtseinheit 9: Implementieren gespeicherter Prozeduren

IF NOT EXISTS (SELECT * FROM Customers WHERE CustomerID = @CustomerID) BEGIN RAISERROR (50010, 16, 1) --Kunde nicht gefunden. RETURN END BEGIN TRANSACTION UPDATE Customers SET Phone = @Phone WHERE CustomerID = @CustomerID

/* Anzeigen der Meldung, dass die Telefonnummer für die Firma CustomerID aktualisiert wurde */ SELECT 'Die Telefonnummer für ' + @CustomerID + ' wurde aktualisiert zu ' + @PhoneCOMMIT TRANSACTION GO

Methodischer Hinweis Weisen Sie darauf hin, dass an dieser Stelle die UPDATE-Transaktion be-ginnt. Der gesamte vorher-gehende Code dient der Fehlerüberprüfung.

Weisen Sie darauf hin, dass es sich um ein typisches Größenverhältnis von Feh-lerüberprüfungs- zu Trans-aktionsanweisungenhandelt.

Page 513: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 9: Implementieren gespeicherter Prozeduren 45

Leistungsaspekte

� Windows 2000-Systemmonitor

� Objekt: SQLServer: Cache-Manager

� Objekt: SQLServer: SQL-Statistik

� SQL Profiler

� Kann Ereignisse überwachen

� Kann jede Anweisung in einer gespeicherten Prozedur testen

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Folgende Tools helfen Ihnen, die Ursache von Leistungsproblemen zu er-mitteln, die möglicherweise mit der Ausführung gespeicherter Prozeduren verbunden sind.

Windows 2000-Systemmonitor Neben zahlreichen weiteren Aktivitäten überwacht Windows 2000-System-monitor die Verwendung des Prozedurcaches.

Die folgenden Objekte und Leistungsindikatoren stellen allgemeine Infor-mationen zu den kompilierten Plänen im Prozedurcache und zur Anzahl der erneuten Kompilierungen zur Verfügung. Sie können auch eine bestimmte Instanz überwachen, wie z. B. Procedure Plans.

Objekt Leistungsindikatoren

SQLServer: Cache-Manager Cachetrefferquote

Cacheobjektzähler

Cacheseiten

Cacheverwendungszähler/Sekunde

SQLServer: SQL-Statistik Erneute SQL-Kompilierungen/Sekunde

ThemaErläutern Sie einige der Leistungsaspekte, die beim Implementieren gespeicher-ter Prozeduren berücksich-tigt werden müssen.

EinstiegWenn Sie gespeicherte Prozeduren implementieren, sollten Sie die folgenden Leistungsaspekte berück-sichtigen.

Page 514: Programmieren Einer Microsoft SQL Server 2000-Datenbank

46 Unterrichtseinheit 9: Implementieren gespeicherter Prozeduren

SQL Profiler Bei SQL Profiler handelt es sich um ein grafisches Tool, das Ihnen das Über-wachen von Ereignissen ermöglicht, wie z. B. Start oder Beendigung einer gespeicherten Prozedur oder Start und Beendigung einzelner Transact-SQL-Anweisungen innerhalb einer gespeicherten Prozedur. Darüber hinaus können Sie überwachen, ob eine gespeicherte Prozedur im Prozedurcache gefunden wurde.

In der Entwicklungsphase eines Projekts können Sie die Anweisungen einer gespeicherten Prozedur zeilenweise testen, um festzustellen, ob die Funktions-weise der Anweisungen Ihren Erwartungen entspricht.

Seien Sie vorsichtig beim Erstellen geschachtelter gespeicherter Prozeduren. Durch das Schachteln von gespeicherten Prozeduren wird ein Grad an Komplexität erreicht, durch den die Fehlerbehandlung bei Leistungs-problemen erschwert werden kann.

Anmerkung

Page 515: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 9: Implementieren gespeicherter Prozeduren 47

Empfohlene Methoden

Entwerfen Sie jede gespeicherte Prozedur so, dass sie eineneinzigen Task ausführtEntwerfen Sie jede gespeicherte Prozedur so, dass sie eineneinzigen Task ausführt

Führen Sie die Datenüberprüfung vor dem Starten vonTransaktionen durchFühren Sie die Datenüberprüfung vor dem Starten vonTransaktionen durch

Überprüfen Sie alle EingabeparameterÜberprüfen Sie alle Eingabeparameter

Verwenden Sie dieselben Verbindungseinstellungen für alle gespeicherten ProzedurenVerwenden Sie dieselben Verbindungseinstellungen für alle gespeicherten Prozeduren

Verwenden Sie die WITH ENCRYPTION-Option zumVerschlüsseln des Textes gespeicherter ProzedurenVerwenden Sie die WITH ENCRYPTION-Option zumVerschlüsseln des Textes gespeicherter Prozeduren

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Mit Hilfe der folgenden empfohlenen Methoden können Sie die Effektivität und Effizienz von gespeicherten Prozeduren erhöhen:

� Überprüfen Sie alle Eingabeparameter am Anfang einer gespeicherten Pro-zedur, um fehlende und ungültige Werte möglichst früh aufzuspüren.

� Entwerfen Sie jede gespeicherte Prozedur so, dass sie einen einzigen Task ausführt.

� Führen Sie die Fehlerüberprüfung für Aufgaben- und Geschäftslogik und die Datenüberprüfung vor dem Starten von Transaktionen durch. Verwen-den Sie kurze Transaktionen.

� Verwenden Sie dieselben Verbindungseinstellungen für alle gespeicherten Prozeduren.

� Verwenden Sie die WITH ENCRYPTION-Option zum Verschlüsseln des Textes gespeicherter Prozeduren. Löschen Sie nie Einträge aus der syscomments-Systemtabelle.

Zusätzliche Informationen zu dem folgenden Thema finden Sie in der SQL Server-Onlinedokumentation.

Thema Suchbegriff

Prozedurcache "SQL Server-Arbeitsspeicherpool"

"Zwischenspeicherung und Wiederverwendung von Ausführungs-plänen"

ThemaFassen Sie Tipps und Techniken zum Schreiben effizienter gespeicherter Prozeduren zusammen.

EinstiegVerwenden Sie für das Im-plementieren gespeicherter Prozeduren die folgenden empfohlenen Methoden.

Page 516: Programmieren Einer Microsoft SQL Server 2000-Datenbank

48 Unterrichtseinheit 9: Implementieren gespeicherter Prozeduren

Übungseinheit B: Erstellen gespeicherter Prozeduren mit Parametern

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

LernzieleAm Ende dieser Übungseinheit werden Sie in der Lage sein, die folgenden Aufgaben auszuführen:

� Erstellen einer gespeicherten Prozedur mit Hilfe des Assistenten zur Erstel-lung gespeicherter Prozeduren.

� Testen einer gespeicherten Prozedur, die Fehlerbehandlungstechniken ein-schließt.

� Erstellen benutzerdefinierter Fehlermeldungen. � Erstellen von gespeicherten Prozeduren, die Codes zurückgeben.

VoraussetzungenUm diese Übungseinheit zu bearbeiten, benötigen Sie Folgendes:

� Die Skriptdateien für diese Übungseinheit, die sich in C:\Moc\2328A\Labfiles\L09 befinden.

� Die Antwortdateien für diese Übungseinheit, die sich in C:\Moc\2328A\Labfiles\L09\Answers befinden.

Einrichten der ÜbungseinheitUm diese Übungseinheit zu bearbeiten, ist eine der folgenden Aktionen erforderlich:

� Bearbeiten der vorherigen Übungseinheit. � Ausführen der Batchdatei C:\Moc\2328A\Batches\Restore09B.cmd.

Mit dieser Befehlsdatei wird die ClassNorthwind-Datenbank wieder in den Zustand zurückversetzt, der für diese Übungseinheit erforderlich ist.

ThemaGeben Sie eine Einführung in die Übungseinheit.

EinstiegIn dieser Übungseinheit füh-ren Sie ein Skript aus, das mehrere gespeicherte Pro-zeduren erstellt, und erstel-len und ändern eigene ge-speicherte Prozeduren.

Page 517: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 9: Implementieren gespeicherter Prozeduren 49

Weitere Informationen Sollten Sie beim Ausführen von Dateien Hilfe benötigen, suchen Sie in der Hilfe von SQL Query Analyzer nach „Ausführen einer Abfrage“.

Daneben sind die folgenden Informationsquellen verfügbar:

� Das Northwind-Datenbankschema. � Die Microsoft SQL Server-Onlinedokumentation.

SzenarioDer Aufbau des Schulungsraumes soll die Organisation des weltweit agieren-den Handelsunternehmens Northwind Traders widerspiegeln. Das Unternehmen hat den fiktiven Domänennamen nwtraders.msft. Der primäre DNS-Server für nwtraders.msft ist der Kursleitercomputer, dessen IP-Adresse (Internetproto-koll) 192.168.x.200 lautet (wobei x die zugewiesene Schulungsraumnummer ist). Der Name des Kursleitercomputers ist London.

Die folgende Tabelle stellt den Benutzernamen, den Computernamen und die IP-Adresse für jeden Kursteilnehmercomputer in der fiktiven Domäne nwtraders.msft bereit. Suchen Sie den Ihrem Computer zugewiesenen Benutzernamen und notieren Sie ihn.

Benutzername Computername IP-Adresse

SQLAdmin1 Vancouver 192.168.x.1SQLAdmin2 Denver 192.168.x.2SQLAdmin3 Perth 192.168.x.3SQLAdmin4 Brisbane 192.168.x.4SQLAdmin5 Lisbon 192.168.x.5SQLAdmin6 Bonn 192.168.x.6SQLAdmin7 Lima 192.168.x.7SQLAdmin8 Santiago 192.168.x.8SQLAdmin9 Bangalore 192.168.x.9SQLAdmin10 Singapore 192.168.x.10SQLAdmin11 Casablanca 192.168.x.11SQLAdmin12 Tunis 192.168.x.12SQLAdmin13 Acapulco 192.168.x.13SQLAdmin14 Miami 192.168.x.14SQLAdmin15 Auckland 192.168.x.15SQLAdmin16 Suva 192.168.x.16SQLAdmin17 Stockholm 192.168.x.17SQLAdmin18 Moscow 192.168.x.18SQLAdmin19 Caracas 192.168.x.19SQLAdmin20 Montevideo 192.168.x.20SQLAdmin21 Manila 192.168.x.21SQLAdmin22 Tokyo 192.168.x.22SQLAdmin23 Khartoum 192.168.x.23SQLAdmin24 Nairobi 192.168.x.24

Veranschlagte Zeit für die Übungseinheit: 45 Minuten

Page 518: Programmieren Einer Microsoft SQL Server 2000-Datenbank

50 Unterrichtseinheit 9: Implementieren gespeicherter Prozeduren

Übung 1 Verwenden des Assistenten zur Erstellung gespeicherter Prozeduren

In dieser Übung verwenden Sie den Assistenten zur Erstellung gespeicherter Prozeduren, um eine gespeicherte Prozedur in der ClassNorthwind-Datenbank zu erstellen, durch die die Telefonnummer eines Mitarbeiters aktualisiert wird.

� So verwenden Sie den Assistenten zur Erstellung gespeicherter Prozeduren

In diesem Verfahren verwenden Sie den Assistenten zur Erstellung gespeicher-ter Prozeduren, um eine gespeicherte Prozedur zu erstellen, durch die die Tele-fonnummer eines Mitarbeiters aktualisiert wird. 1. Melden Sie sich mit Hilfe der Informationen in der folgenden Tabelle an der

Schulungsraumdomäne nwtraders an.

Option Eingabe

Benutzername SQLAdminx (wobei x die Ihrem Computernamen zugewiesene Nummer ist, wie in der Schulungsraumdomäne nwtraders.msftfestgelegt)

Kennwort password

2. Öffnen Sie SQL Server Enterprise Manager. 3. Klicken Sie in der Konsolenstruktur auf Ihren Server. 4. Klicken Sie im Menü Extras auf Assistenten.5. Erweitern Sie Datenbank, und doppelklicken Sie dann auf Assistent zur

Erstellung gespeicherter Prozeduren.6. Wählen Sie die ClassNorthwind-Datenbank aus. 7. Erstellen Sie eine gespeicherte Prozedur, die die Telefonnummer eines Mit-

arbeiters aktualisiert. Die Telefonnummer wird in der Employees-Tabelle verwaltet. Wählen Sie die Aktion Aktualisieren für die Employees-Tabelle aus.

8. Klicken Sie auf die Schaltfläche Bearbeiten, um die Eigenschaften der ge-speicherten Prozedur zu bearbeiten.

9. Weisen Sie der gespeicherten Prozedur den Namen UpdateEmployeePhone zu.

10. Geben Sie in der SET-Klausel nur die HomePhone-Spalte und in der WHERE-Klausel nur die EmployeeID-Spalte an.

11. Erweitern Sie in der Konsolenstruktur die ClassNorthwind-Datenbank, und klicken Sie dann auf Gespeicherte Prozeduren.

12. Überprüfen Sie, ob die gespeicherte Prozedur UpdateEmployeePhone im Detailbereich aufgeführt wird.

Page 519: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 9: Implementieren gespeicherter Prozeduren 51

13. Überprüfen Sie die Eigenschaften der gespeicherten Prozedur UpdateEmployeePhone.Welche Parameter wurden in der gespeicherten Prozedur definiert? @EmployeeID_1 und @HomePhone_2 ____________________________________________________________

____________________________________________________________

14. Öffnen Sie SQL Query Analyzer, und melden Sie sich, wenn Sie dazu aufgefordert werden, über die Microsoft Windows-Authentifizierung am (lokalen) Server an. Sie sind berechtigt, sich bei SQL Server anzumelden und SQL Server zu verwalten, da Sie als SQLAdminx angemeldet und damit Mitglied der lokalen Administratorgruppe von Windows 2000 sind. Alle Mitglieder dieser Gruppe werden automatisch der sysadmin-Rolle von SQL Server zugeordnet.

15. Führen Sie die gespeicherte Prozedur UpdateEmployeePhone aus, um zu überprüfen, ob sie erwartungsgemäß funktioniert. Aktualisieren Sie die Telefonnummer der Mitarbeiterin Nancy Davolio, sodass ihre Telefon-nummer jetzt (503) 555-1212 lautet. Der Wert von EmployeeID dieser Mitarbeiterin ist 1.EXEC UpdateemployeePhone @EmployeeID_1 = 1, @HomePhone_2 = '(503)555-1212'

� So generieren Sie ein Skript In diesem Verfahren generieren und speichern Sie ein Skript für die gespeicher-te Prozedur, die Sie mit dem Assistenten zur Erstellung gespeicherter Prozedu-ren erstellt haben. 1. Wechseln Sie zu SQL Server Enterprise Manager. 2. Erweitern Sie in der Konsolenstruktur den Knoten Datenbanken, erweitern

Sie ClassNorthwind, und klicken Sie dann auf Gespeicherte Prozeduren.3. Klicken Sie im Detailbereich mit der rechten Maustaste auf

UpdateEmployeePhone, zeigen Sie auf Alle Tasks, und klicken Sie dann auf SQL-Skript generieren.

4. Klicken Sie auf OK, um das Skript zu generieren. 5. Speichern Sie das Skript unter UpdateEmployeePhone.sql.6. Öffnen Sie das gespeicherte Skript, und sehen Sie es sich an.

Page 520: Programmieren Einer Microsoft SQL Server 2000-Datenbank

52 Unterrichtseinheit 9: Implementieren gespeicherter Prozeduren

Übung 2 Verwenden der Fehlerbehandlung in gespeicherten Prozeduren

In dieser Übung führen Sie ein Skript aus, das eine gespeicherte Prozedur er-stellt, mit der ein Lieferant und ein Artikel zur ClassNorthwind-Datenbank hinzugefügt wird. Anschließend testen Sie die Fehlerbehandlung, die in diesem Skript enthalten ist.

� So erstellen und testen Sie eine gespeicherte Prozedur In diesem Verfahren öffnen und lesen Sie ein Skript, das eine gespeicherte Pro-zedur erstellt, um einen neuen Lieferanten und einen neuen Artikel hinzuzu-fügen. Anschließend testen Sie die gespeicherte Prozedur, um sicherzustellen, dass sie erwartungsgemäß ausgeführt wird, indem Sie sie zum Einfügen eines neuen Lieferanten und eines neuen Artikels verwenden. Abschließend testen Sie die Fehlerbehandlung der gespeicherten Prozedur. 1. Wechseln Sie zu SQL Query Analyzer. 2. Öffnen Sie C:\Moc\2328A\Labfiles\L09\SupplierProduct.sql, und sehen

Sie sich den Inhalt der Datei an. Welchen Vorteil bietet es, wenn die @@error-Systemfunktion verwendet wird, während Werte in die Tabellen Suppliers und Products eingefügt werden? Wenn der Einfügevorgang aufgrund einer Datentyp- oder Einschrän-kungsverletzung fehlschlägt, wird ein Rollback der Transaktion durch-geführt. ____________________________________________________________

____________________________________________________________

3. Führen Sie das Skript aus, um die gespeicherte Prozedur SupplierProductInsert zu erstellen.

4. Öffnen Sie C:\Moc\2328A\Labfiles\L09\SupplierProductInsert.sql.Ändern Sie das Skript, indem Sie die geeigneten Werte eingeben, um einen neuen Lieferanten und einen neuen Artikel hinzuzufügen. (Sie können beliebige Werte angeben.)

5. Führen Sie das geänderte Skript aus. 6. Testen Sie die Fehlerbehandlung in der gespeicherten Prozedur

SupplierProductInsert, indem Sie die Werte ändern und die Zeile mit dem @contactname-Parameter durch einen Kommentar deaktivieren. Führen Sie das geänderte Skript aus, um sicherzustellen, dass der Wert ignoriert wird. Welche Fehlermeldung wird angezeigt? Sie müssen Company Name, Contact Name, Address, City, Region, Postal Code, Country, Phone, Product Name and Discontinued eingeben. (Contact Title, Fax, Home Page, Unit Price, Units in Stock, Units on Order und Reorder Level können den Wert NULL haben.) ____________________________________________________________

____________________________________________________________

Page 521: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 9: Implementieren gespeicherter Prozeduren 53

Übung 3 Anpassen von Fehlermeldungen

In dieser Übung erstellen Sie eine benutzerdefinierte Fehlermeldung, die im Anwendungsprotokoll der Windows 2000-Ereignisanzeige protokolliert wird. Die Meldung enthält die Lieferanten-ID, die eingefügt wurde, sowie den SQL Server-Benutzer, der diese Einfügung vorgenommen hat.

� So erstellen Sie eine benutzerdefinierte Fehlermeldung In diesem Verfahren ändern Sie die gespeicherte Prozedur SupplierProduct,um benutzerdefinierte Fehlermeldungen aufzurufen. C:\Moc\2328A\Labfiles\L09\Answers\CustomErrorAnswer.sql enthält ein fertiges Skript für dieses Verfahren. 1. Öffnen Sie C:\Moc\2328A\Labfiles\L09\CustomError.sql, sehen Sie sich

den Inhalt der Datei an, und führen Sie sie dann aus. 2. Suchen Sie nach dem Kommentar /* #1 Ersetzen Sie dies durch den Code

der Kursteilnehmer */, und fügen Sie zur gespeicherten Prozedur CustomError eine Variable hinzu, die den Wert des Benutzernamens speichert, der den Lieferanten einfügt. /* #1 Ersetzen Sie dies durch den Code der Kursteilnehmer. */

DECLARE @UserName nvarchar (60)

SELECT @UserName = suser_sname()

Verwenden Sie die SUSER_SNAME-Systemfunktion.

3. Suchen Sie nach dem nächsten Kommentar /* #2 Ersetzen Sie dies durch den Code der Kursteilnehmer */. Fügen Sie eine RAISERROR-Anweisung hinzu, die anzeigt, dass ein neuer Lieferant hinzugefügt wurde. Die RAISERROR-Anweisung muss den Fehler #50018 aufrufen und die Parameter für die Lieferantennummer und den Benutzer übergeben, der die gespeicherte Prozedur ausführt. Weitere Informationen zur die RAISERROR-Anweisung finden Sie in der SQL Server-Onlinedokumentation. RAISERROR (50018, 16, 1, @InsertSupplierID, @UserName)

4. Suchen Sie nach dem nächsten Kommentar /* #3 Ersetzen Sie dies durch den Code der Kursteilnehmer */, um die Fehlermeldung Nr. 50018 mit Hilfe der gespeicherten Systemprozedur sp_addmessage zu erstellen. Schließen Sie die Werte für Supplier und UserName in die Fehlermeldung ein. EXEC sp_addmessage 50018, 16, 'Supplier %d was inserted by %s', 'us_english','true'

Tipp

Page 522: Programmieren Einer Microsoft SQL Server 2000-Datenbank

54 Unterrichtseinheit 9: Implementieren gespeicherter Prozeduren

5. Führen Sie das Skript aus, um die gespeicherte Prozedur CustomError zu erstellen.

6. Öffnen Sie C:\Moc\2328A\Labfiles\L09\SupplierProductInsert.sql.Ändern Sie das Skript, indem Sie die geeigneten Werte eingeben, um einen neuen Lieferanten und einen neuen Artikel hinzuzufügen. (Sie können be-liebige Werte angeben.)

7. Führen Sie das geänderte Skript aus. 8. Überprüfen Sie die Ergebnisse, öffnen Sie dann die Ereignisanzeige, und

zeigen Sie das Anwendungsprotokoll an, um zu überprüfen, ob die Infor-mationsmeldung aufgezeichnet wurde.

Page 523: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 9: Implementieren gespeicherter Prozeduren 55

Übung 4 Verwenden von Rückgabecodes

In dieser Übung verwenden Sie das Skript C:\Moc\2328A\Labfiles\L09\Return1.sql, um eine gespeicherte Prozedur mit dem OUTPUT-Schlüsselwort zu erstellen. Anschließend führen Sie die ge-speicherte Prozedur aus und testen sie für unterschiedliche Rückgabecodes, indem Sie die Skripts Return2.sql und Return3.sql verwenden.

� So erstellen Sie die gespeicherte Prozedur „OrderCount“ In diesem Verfahren erstellen Sie die gespeicherte Prozedur OrderCount, die die Anzahl der unerledigten Aufträge für einen Kunden zählt. Wenn für den Kunden mindestens ein unerledigter Auftrag vorliegt, wird der Status 1 zurück-gegeben. Wenn für den Kunden kein unerledigter Auftrag vorliegt, wird der Status 0 zurückgegeben. Dies ist ein Beispiel für eine geschachtelte gespei-cherte Prozedur. 1. Wechseln Sie zu SQL Query Analyzer, öffnen Sie

C:\Moc\2328A\Labfiles\L09\Return1.sql, sehen Sie sich den Inhalt der Datei an, und führen Sie sie dann aus.

2. Geben Sie die folgende Prozedur ein, und führen Sie sie aus: EXEC OrderCount 1,1

Wie lautet das Ergebnis? Der Befehl wurde erfolgreich ausgeführt, es wurden jedoch keine Daten zurückgegeben. ____________________________________________________________

____________________________________________________________

� So führen Sie die gespeicherte Prozedur „OrderCount“ mit der Option OUTPUT aus

In diesem Verfahren beobachten Sie, wie sich die Option OUTPUT auf die Ausführung der gespeicherten Prozedur OrderCount auswirkt. 1. Wechseln Sie zu SQL Query Analyzer, öffnen Sie

C:\Moc\2328A\Labfiles\L09\Return2.sql, sehen Sie sich den Inhalt der Datei an, und führen Sie sie dann aus. Dieses Skript führt die gespeicherte Prozedur OrderCount aus und übergibt einen Wert für CustomerID, für den unerledigte Aufträge vorliegen. Wie lautet das Ergebnis? Customer RATTC has 18 unfilled order(s). ____________________________________________________________

____________________________________________________________

Page 524: Programmieren Einer Microsoft SQL Server 2000-Datenbank

56 Unterrichtseinheit 9: Implementieren gespeicherter Prozeduren

2. Öffnen Sie C:\Moc\2328A\Labfiles\L09\Return3.sql, sehen Sie sich den Inhalt der Datei an, und führen Sie sie dann aus. Dieses Skript führt die gespeicherte Prozedur OrderCount aus und übergibt einen Wert für CustomerID, für den unerledigte Aufträge vorliegen. Wie lautet das Ergebnis? Customer WOLZA has NO unfilled order(s). ____________________________________________________________

____________________________________________________________

Page 525: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 9: Implementieren gespeicherter Prozeduren 57

Wenn Sie noch Zeit haben Ausführen erweiterter gespeicherter Prozeduren

In dieser Übung führen Sie eine erweiterte gespeicherte Prozedur aus und zeigen den Dateinamen der DLL-Datei an, in der die Funktion definiert ist.

� So führen Sie eine erweiterte gespeicherte Prozedur aus In diesem Verfahren führen Sie die erweiterte gespeicherte Prozedur xp_cmdshell aus, um alle Dateien und Ordner im Stammverzeichnis von Laufwerk C: aufzulisten. 1. Verwenden Sie SQL Query Analyzer, und überprüfen Sie, ob Sie die

master-Datenbank verwenden. 2. Führen Sie die erweiterte gespeicherte Prozedur xp_cmdshell aus, um eine

Liste aller Dateien anzuzeigen, die im Ordner C:\ enthalten sind. EXEC master..xp_cmdshell 'dir c:\'

Wie lautet das Ergebnis? Die Verzeichnisliste wurde in Form von Textzeilen zurückgegeben. ____________________________________________________________

____________________________________________________________

3. Führen Sie die gespeicherte Systemprozedur sp_helptext aus, um die Definition von xp_cmdshell anzuzeigen. EXEC master..sp_helptext xp_cmdshell

Wie lautet das Ergebnis? „Xplog70.dll“. Diese DLL enthält die Funktion der erweiterten gespeicherten Prozedur. ____________________________________________________________

____________________________________________________________

Page 526: Programmieren Einer Microsoft SQL Server 2000-Datenbank

58 Unterrichtseinheit 9: Implementieren gespeicherter Prozeduren

Wenn Sie noch Zeit haben Verfolgen des Ablaufs gespeicherter Prozeduren mit Hilfe von SQL Profiler

In dieser Übung verwenden Sie das grafische Tool SQL Profiler, um den Ablauf einzelner gespeicherter Prozeduren zu verfolgen.

� So verfolgen Sie den Ablauf von Ereignissen gespeicherter Prozeduren mittels SQL Profiler

In diesem Verfahren starten Sie eine SQL Profiler-Ablaufverfolgung, indem Sie eine benutzerdefinierte Ablaufverfolgsvorlage verwenden, um gespeicherte Prozeduren zu überwachen. 1. Öffnen Sie SQL Profiler. 2. Klicken Sie auf der Symbolleiste auf das Symbol Neue Ablaufverfolgung.3. Stellen Sie unter Verwendung der Windows-Authentifizierung eine Ver-

bindung zum (lokalen) Server her. 4. Fügen Sie auf der Registerkarte Ereignisse alle gespeicherten Prozeduren

und Transact-SQL-Ereignisklassen hinzu. 5. Klicken Sie auf Ausführen.6. Wechseln Sie zu SQL Query Analyzer, öffnen Sie

C:\Moc\2328A\Labfiles\L09\SupplierProductInsert.sql, sehen Sie sich den Inhalt der Datei an, und führen Sie sie dann aus.

7. Wechseln Sie zu SQL Profiler. 8. Beenden Sie die aktive Ablaufverfolgung, und prüfen Sie sie.

Page 527: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 9: Implementieren gespeicherter Prozeduren 59

Lernzielkontrolle

� Einführung in gespeicherte Prozeduren

� Erstellen, Ausführen, Ändern und Löschen gespeicherter Prozeduren

� Verwenden von Parametern in gespeicherten Prozeduren

� Ausführen erweiterter gespeicherter Prozeduren

� Behandeln von Fehlermeldungen

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

1. Sie haben eine gespeicherte Prozedur erstellt, um einen Kunden aus der Datenbank zu entfernen. Nach Abschluss der Löschtransaktion soll eine benutzerdefinierte Fehlermeldung in das Windows 2000-Anwendungs-protokoll geschrieben werden. Wie führen Sie diese Aufgabe aus? Erstellen Sie eine benutzerdefinierte Fehlermeldung, indem Sie den „@with_log“-Parameter in der gespeicherten Prozedur „sp_addmessage“ angeben. Führen Sie die RAISERROR-Anweisung in der gespeicherten Prozedur aus, um die benutzerdefinierte Fehler-meldung auszulösen, sobald für die Löschtransaktion ein Commit ausgeführt wurde.

2. Den Benutzern in der Lohnbuchhaltung soll es möglich sein, Daten in die payroll-Datenbank einzufügen oder vorhandene Daten zu aktualisieren und zu löschen. Sie sollen jedoch keinen Zugriff auf die zugrunde liegenden Tabellen haben. Welches Verfahren können Sie alternativ zum Erstellen einer Sicht verwenden, um dieses Ziel zu erreichen? Erstellen Sie mehrere gespeicherte Prozeduren, von denen jede einen bestimmten Task ausführt. Erteilen Sie den Benutzern in der Lohn-buchhaltung die EXECUTE-Berechtigung für die gespeicherten Prozeduren.

ThemaVertiefen Sie die Lernziele dieser Unterrichtseinheit, indem Sie die Kernpunkte wiederholen.

EinstiegDie Fragen zur Lernziel-kontrolle beziehen sich auf einige der Schlüsselkon-zepte, die Inhalt dieser Unterrichtseinheit sind.

Gehen Sie anhand dieser Fragen die Themen der Unterrichtseinheit durch.

Klären Sie andere offene Fragen der Kursteilnehmer, bevor Sie fortfahren.

Page 528: Programmieren Einer Microsoft SQL Server 2000-Datenbank

60 Unterrichtseinheit 9: Implementieren gespeicherter Prozeduren

3. Sie müssen eine gespeicherte Prozedur in der Datenbank ändern. Mehrere Benutzer verfügen über die Berechtigung zum Ausführen dieser gespeicher-ten Prozedur. Welche Anweisung müssen Sie ausführen, um die Änderung ohne Auswirkung auf die bestehenden Berechtigungen durchzuführen? ALTER PROC. Wenn Sie die Anweisungen DROP PROC und CREATE PROC mit den gewünschten Änderungen ausführen, müssen Sie den Benutzern die EXECUTE-Anweisung erneut erteilen.

Page 529: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Inhalt

Übersicht 1

Arten von benutzerdefinierten Funktionen 2

Definieren von benutzerdefinierten Funktionen 3

Beispiele für benutzerdefinierte Funktionen 9

Empfohlene Methoden 17

Übungseinheit A: Erstellen von benutzerdefinierten Funktionen 18

Lernzielkontrolle 24

Unterrichtseinheit 10: Implementieren von benutzerdefiniertenFunktionen

Page 530: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Die in diesen Unterlagen enthaltenen Angaben und Daten können ohne vorherige Ankündigung geändert werden. Die in diesen Unterlagen genannten Firmen, Produkte, Menschen, Charaktere und/oder Daten sind frei erfunden und sollen keine wirklichen Individuen, Gesellschaften, Produkte oder Veranstaltungen darstellen, soweit nichts anderes angegeben ist. Die Benutzer/innen sind verpflichtet, sich an alle anwendbaren Urheberrechtsgesetze zu halten. Ohne ausdrückliche schriftliche Erlaubnis der Microsoft Corporation darf kein Teil dieser Unterlagen für irgendwelche Zwecke vervielfältigt oder übertragen werden, unabhängig davon, auf welche Art und Weise oder mit welchen Mitteln, elektronisch oder mechanisch, dies geschieht. Wenn auf dieses Dokument nur auf elektronischem Wege zugegriffen werden kann, sind Sie hiermit berechtigt, eine (1) Kopie zum persönlichen Gebrauch auszudrucken.

Microsoft Corporation kann Inhaber von Patenten oder Patentanträgen, Marken, Urheberrechten oder anderen gewerblichen Schutzrechten sein, die den Inhalt dieses Dokuments betreffen. Die Bereitstellung dieses Dokuments gewährt keinerlei Lizenzrechte an diesen Patenten, Marken, Urheberrechten oder anderen gewerblichen Schutzrechten, es sei denn, dies wurde ausdrücklich durch einen schriftlichen Lizenzvertrag mit der Microsoft Corporation vereinbart.

2000 Microsoft Corporation. Alle Rechte vorbehalten.

Microsoft, ActiveX, BackOffice, MS-DOS, PowerPoint, Visual Basic, Visual C++, Visual Studio, Windows und Windows NT sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern.

Andere in diesem Dokument aufgeführte Produkt- und Firmennamen sind möglicherweise Marken der jeweiligen Eigentümer.

Project Lead: Rich Rose Instructional Designers: Rich Rose, Cheryl Hoople, Marilyn McGill Instructional Software Design Engineers: Karl Dehmer, Carl Raebler, Rick Byham Technical Lead: Karl Dehmer Subject Matter Experts: Karl Dehmer, Carl Raebler, Rick Byham Graphic Artist: Kirsten Larson (Independent Contractor) Editing Manager: Lynette Skinner Editor: Wendy Cleary Copy Editor: Edward McKillop (S&T Consulting) Production Manager: Miracle Davis Production Coordinator: Jenny Boe Production Support: Lori Walker (S&T Consulting) Test Manager: Sid Benavente Courseware Testing: TestingTesting123 Classroom Automation: Lorrin Smith-Bates Creative Director, Media/Sim Services: David Mahlmann Web Development Lead: Lisa Pease CD Build Specialist: Julie Challenger Online Support: David Myka (S&T Consulting) Localization Manager: Rick Terek Operations Coordinator: John Williams Manufacturing Support: Laura King; Kathy Hershey Lead Product Manager, Release Management: Bo Galford Lead Product Manager, Data Base: Margo Crandall Group Manager, Courseware Infrastructure: David Bramble Group Product Manager, Content Development: Dean Murray General Manager: Robert Stewart

Page 531: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 10: Implementieren von benutzerdefinierten Funktionen iii

Hinweise für den Kursleiter Diese Unterrichtseinheit gibt Kursteilnehmern Informationen zur Implementie-rung von benutzerdefinierten Funktionen. Es werden die drei Arten von benutzerdefinierten Funktionen und die allgemeine Syntax zum Erstellen und Ändern der Funktionen erläutert. Außerdem wird zu jeder Art ein Beispiel gegeben.

Am Ende dieser Unterrichtseinheit werden die Kursteilnehmer in der Lage sein, die folgenden Aufgaben auszuführen: � Beschreiben der drei Arten von benutzerdefinierten Funktionen. � Erstellen und Ändern von benutzerdefinierten Funktionen. � Erstellen der drei Arten von benutzerdefinierten Funktionen.

Unterlagen und Vorbereitung In diesem Abschnitt werden die Unterlagen und vorbereitenden Aufgaben erläutert, die nötig sind, um diese Unterrichtseinheit zu unterrichten.

Erforderliche Unterlagen Um diese Unterrichtseinheit zu unterrichten, benötigen Sie folgende Unterlagen:

� Die Microsoft® PowerPoint®-Datei 2328A_10.ppt� Die Beispieldatei C:\Moc\2328A\Demo\D10_Ex.sql, die alle Beispiel-

skripts der Unterrichtseinheit enthält, soweit in der Unterrichtseinheit nichts anderes angegeben ist.

Vorbereitende Aufgaben Zur Vorbereitung dieser Unterrichtseinheit gehen Sie folgendermaßen vor:

� Lesen Sie alle Unterlagen für diese Unterrichtseinheit. � Arbeiten Sie die Übungseinheit durch.

Strategie für die Unterrichtseinheit Verwenden Sie die folgende Strategie, um diese Unterrichtseinheit zu präsentieren:

� Arten von benutzerdefinierten Funktionen Kenntnisse im Hinblick auf integrierte Funktionen sind eine Voraussetzung für diesen Kurs. Besprechen Sie eine einfache Funktion, wie z. B. COUNT oder SUM, um sicherzustellen, dass die Kursteilnehmer mit diesem Konzept vertraut sind. Stellen Sie die drei Arten von benutzerdefinierten Funktionen vor, und weisen Sie darauf hin, dass die Skalarfunktion am ehesten den integrierten Funktionen entspricht. Stellen Sie heraus, dass die beiden anderen Funktionen eine Tabelle zurückgeben.

Präsentation:30 Minuten

Übungseinheit:30 Minuten

Page 532: Programmieren Einer Microsoft SQL Server 2000-Datenbank

iv Unterrichtseinheit 10: Implementieren von benutzerdefinierten Funktionen

� Definieren von benutzerdefinierten Funktionen Erläutern Sie die allgemeine Syntax zum Erstellen einer Funktion, insbeson-dere den Befehl CREATE FUNCTION, den Funktionsnamen, die Eingabe-parameter, die RETURNS-Klausel und den Inhaltsbereich. Verwenden Sie das Beispiel der Skalarfunktion auf der Folie, konzentrieren Sie die Diskus-sion aber auf die Teile der Syntax, die für alle benutzerdefinierten Funktio-nen gleich sind. Erläutern Sie die Bedeutung des Begriffs nicht determinis-tisch, indem Sie darauf hinweisen, dass GETDATE() bei jedem Aufruf einen anderen Wert zurückgibt. Stellen Sie heraus, dass Schemabindung, Sicherheit sowie das Ändern und Löschen von benutzerdefinierten Funk-tionen ganz ähnlich wie bei Sichten ablaufen.

� Beispiele für benutzerdefinierte Funktionen Weisen Sie darauf hin, dass das Beispiel, das beim Erstellen von benutzer-definierten Funktionen besprochen wurde, eine Skalarfunktion war. Be-sprechen Sie das zweite Beispiel, und weisen Sie auf die Datentypdekla-ration und die Platzierung von RETURN im BEGIN…END-Block hin. Zeigen Sie, wie die Funktion aufgerufen wird, und weisen Sie auf den Besitzernamen in dem zweiteiligen Namenssystem hin. Besprechen Sie die Stichpunkte auf der Folie „Verwenden einer Funktion mit mehreren Anweisungen und Tabellenrückgabe“, und betonen Sie, dass Funktionen mit Tabellenrückgabe als Ergebnis eine Tabelle zurückgeben.Zeigen und besprechen Sie die Syntax zum Erstellen der Funktion. Stellen Sie heraus, wie die RETURNS-Klausel den Namen und die Struktur der Tabelle definiert. Besprechen Sie den BEGIN…END-Block und die Anord-nung von RETURN kurz vor dem Blockende. Führen Sie die Verwendung der Funktion vor, und stellen Sie heraus, wie die Funktion eine Tabelle oder eine Sicht ersetzt. Vergegenwärtigen Sie den Kursteilnehmern, dass eine gespeicherte Prozedur nicht anstelle einer Tabelle oder Sicht verwendet werden kann. Betonen Sie, dass eine Funktion mit mehreren Anweisungen und Tabellenrückgabe im Prinzip eine gespeicherte Prozedur ist, die als Tabelle oder Sicht verwendet werden kann.Besprechen Sie die Stichpunkte auf der Folie „Verwenden einer Inline-funktion mit Tabellenrückgabe“. Weisen Sie auf die Einschränkung auf eine SELECT-Anweisung hin. Beachten Sie, dass der BEGIN…END-Block aufgrund dieser Einschränkung nicht erforderlich ist. Stellen Sie heraus, dass eine Inlinefunktion mit Tabellenrückgabe wegen der Einschränkung auf eine einzige SELECT-Anweisung mit einer Sicht vergleichbar ist. Fah-ren Sie mit der Folie zur Syntax fort, und besprechen Sie die Syntax. Wei-sen Sie dann darauf hin, dass eine Inlinefunktion mit Tabellenrückgabe sich darin von einer Sicht unterscheidet, dass sie einen Parameter annehmen kann. Führen Sie das Beispiel vor, indem sie die Funktion aufrufen. Betonen Sie, dass eine indizierte Sicht mit Aggregationen möglicherweise eine län-gere Erstellungszeit beansprucht, aber schnell Antworten auf Abfragen be-reitstellt. Die Anwendung einer Inlinefunktion mit Tabellenrückgabe auf die indizierte Sicht ist eine einfache Methode, um die gewünschten Aggrega-tionen abzurufen.

Page 533: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 10: Implementieren von benutzerdefinierten Funktionen v

AnpassungsinformationenDieser Abschnitt beschreibt die Anforderungen zum Einrichten der Übungs-einheiten für eine Unterrichtseinheit sowie die Konfigurationsänderungen, die während der Übungseinheiten an den Kursteilnehmercomputern vorgenommen werden. Diese Informationen sollen Ihnen beim Replizieren oder Anpassen der Microsoft Official Curriculum-Courseware (MOC) helfen.

Die Übungseinheit in dieser Unterrichtseinheit hängt auch von der Schulungsraumkonfiguration ab, die im Abschnitt „Anpassungsinformationen“ am Ende des Dokuments Handbuch für das Einrichten von Schulungs-computern für Kurs 2328A, Programmieren einer Microsoft SQL Server 2000-Datenbank, angegeben ist.

Einrichten der Übungseinheit Im folgenden Abschnitt werden die Anforderungen zum Einrichten der Übungseinheit in dieser Unterrichtseinheit beschrieben.

Anforderung zum Einrichten der Übungseinheit Für die Übungseinheit in dieser Unterrichtseinheit muss sich die ClassNorthwind-Datenbank in dem für die Übungseinheit erforderlichen Zustand befinden. Um die Kursteilnehmercomputer so vorzubereiten, dass sie diese Anforderung erfüllen, führen Sie eine der folgenden Aktionen aus:

� Bearbeiten der vorhergehenden Übungseinheit. � Ausführen der Batchdatei C:\Moc\2328A\Batches\Restore10.cmd.

Falls dieser Kurs angepasst wurde, müssen die Kursteilnehmer die Batchdatei C:\Moc\2328A\Batches\Restore10.cmd ausführen, um sicherzu-stellen, dass die Übungseinheit ordnungsgemäß durchgeführt werden kann.

Ergebnisse der Übungseinheit Auf den Kursteilnehmercomputern gibt es keine Konfigurationsänderungen, die die Replikation oder die Anpassung betreffen.

Wichtig

Achtung

Page 534: Programmieren Einer Microsoft SQL Server 2000-Datenbank

vi Unterrichtseinheit 10: Implementieren von benutzerdefinierten Funktionen

This page is intentionally left blank.

Page 535: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 10: Implementieren von benutzerdefinierten Funktionen 1

Übersicht

� Arten von benutzerdefinierten Funktionen

� Definieren von benutzerdefinierten Funktionen

� Beispiele für benutzerdefinierte Funktionen

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Diese Unterrichtseinheit gibt eine Übersicht über benutzerdefinierte Funk-tionen. Sie erläutert, warum und wie benutzerdefinierte Funktionen verwendet werden, und beschreibt die Syntax für ihre Erstellung.

Am Ende dieser Unterrichtseinheit werden Sie in der Lage sein, die folgenden Aufgaben auszuführen:

� Beschreiben der drei Arten von benutzerdefinierten Funktionen. � Erstellen und Ändern von benutzerdefinierten Funktionen. � Erstellen der drei Arten von benutzerdefinierten Funktionen.

ThemaGeben Sie eine Übersicht über die Themen und Lern-ziele dieser Unterrichts-einheit.

EinstiegIn dieser Unterrichtseinheit lernen Sie, wie benutzer-definierte Funktionen erstellt und verwendet werden.

Page 536: Programmieren Einer Microsoft SQL Server 2000-Datenbank

2 Unterrichtseinheit 10: Implementieren von benutzerdefinierten Funktionen

Arten von benutzerdefinierten Funktionen

� Skalarfunktionen� Ähneln einer integrierten Funktion

� Funktionen mit mehreren Anweisungen und Tabellenrückgabe� Inhalt entspricht dem einer gespeicherten Prozedur

� Verweise wie bei einer Sicht� Inlinefunktionen mit Tabellenrückgabe

� Ähneln einer Sicht mit Parametern� Geben eine Tabelle als Ergebnis einer einzelnen

SELECT-Anweisung zurück

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Mit Microsoft® SQL Server™ 2000 können Sie eigene Funktionen entwerfen und so die integrierten Systemfunktionen erweitern und neue hinzufügen.

An eine benutzerdefinierte Funktion können mehrere Eingabeparameter über-geben werden, sie kann aber auch ohne Eingabeparameter ausgeführt werden. Sie gibt entweder einen skalaren Wert oder eine Tabelle zurück. Als Eingabe-parameter können alle Datentypen außer timestamp, cursor und table ver-wendet werden. Benutzerdefinierte Funktionen unterstützen keine Ausgabe-parameter.

SQL Server 2000 unterstützt drei Arten von benutzerdefinierten Funktionen:

SkalarfunktionenEine Skalarfunktion ähnelt einer integrierten Funktion.

Funktionen mit mehreren Anweisungen und Tabellenrückgabe Eine Funktion mit mehreren Anweisungen und Tabellenrückgabe gibt eine Tabelle zurück, die von einer oder mehreren Transact-SQL-Anweisungen erstellt wurde, und sie ähnelt einer gespeicherten Prozedur. Im Gegensatz zu einer gespeicherten Prozedur kann auf eine Funktion mit mehreren Anweisun-gen und Tabellenrückgabe jedoch wie auf eine Sicht in der FROM-Klausel einer SELECT-Anweisung verwiesen werden.

Inlinefunktionen mit Tabellenrückgabe Eine Inlinefunktion mit Tabellenrückgabe gibt eine Tabelle zurück, die das Ergebnis einer einzelnen SELECT-Anweisung ist. Die Funktion ähnelt einer Sicht, bietet aber bei der Verwendung von Parametern mehr Flexibilität als Sichten und erweitert die Funktionen von indizierten Sichten.

ThemaStellen Sie das Konzept einer benutzerdefinierten Funktion vor, und erläutern Sie ihre Vorteile.

EinstiegEs gibt drei Arten von be-nutzerdefinierten Funk-tionen.

Methodischer Hinweis Diese Folie gibt eine Ein-führung in die drei Arten von benutzerdefinierten Funktionen. Weisen Sie die Kursteilnehmer darauf hin, dass in den nachfolgenden Themen die Unterschiede zwischen den Funktions-arten besprochen werden.

Page 537: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 10: Implementieren von benutzerdefinierten Funktionen 3

���� Definieren von benutzerdefinierten Funktionen

� Erstellen einer benutzerdefinierten Funktion

� Erstellen einer Funktion mit Schemabindung

� Festlegen von Berechtigungen für benutzerdefinierte Funktionen

� Ändern und Löschen von benutzerdefinierten Funktionen

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

In diesem Abschnitt wird das Erstellen, Ändern und Löschen von benutzer-definierten Funktionen behandelt. Außerdem werden Berechtigungen behandelt.

ThemaGeben Sie eine Übersicht über die Themen dieses Abschnitts.

EinstiegIn diesem Abschnitt wird das Erstellen, Ändern und Löschen von benutzer-definierten Funktionen behandelt. Außerdem werden Berechtigungen behandelt.

Page 538: Programmieren Einer Microsoft SQL Server 2000-Datenbank

4 Unterrichtseinheit 10: Implementieren von benutzerdefinierten Funktionen

Erstellen einer benutzerdefinierten Funktion

� Erstellen einer Funktion

� Einschränkungen für Funktionen

USE NorthwindGOCREATE FUNCTION fn_NewRegion

(@myinput nvarchar(30)) RETURNS nvarchar(30)

BEGINIF @myinput IS NULLSET @myinput = 'Not Applicable'RETURN @myinput

END

USE NorthwindGOCREATE FUNCTION fn_NewRegion

(@myinput nvarchar(30)) RETURNS nvarchar(30)

BEGINIF @myinput IS NULLSET @myinput = 'Not Applicable'RETURN @myinput

END

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Sie erstellen eine benutzerdefinierte Funktion auf fast dieselbe Weise wie eine Sicht oder eine gespeicherte Prozedur.

Erstellen einer Funktion Benutzerdefinierte Funktionen werden mit der CREATE FUNCTION-Anwei-sung erstellt. Jeder vollgekennzeichnete benutzerdefinierte Funktionsname (database_name.owner_name.function_name) muss eindeutig sein. Die Anwei-sung gibt die Eingabeparameter mit ihrem jeweiligen Datentyp, die Verarbei-tungsanweisungen und den Wert an, der mit jedem Datentyp zurückgegeben wird.

CREATE FUNCTION [ owner_name. ] function_name( [ { @parameter_name [AS] scalar_parameter_data_type [ = default ] } [ ,...n ] ] )RETURNS scalar_return_data_type[ WITH < function_option> [,...n] ][ AS ] BEGIN function_bodyRETURN scalar_expressionEND

ThemaBeschreiben Sie die all-gemeine CREATE FUNCTION-Anweisung.

EinstiegSie erstellen eine benutzer-definierte Funktion auf fast dieselbe Weise wie eine Sicht oder eine gespeicherte Prozedur.

Methodischer Hinweis Fragen Sie die Kursteil-nehmer, welche Art von benutzerdefinierter Funktion im Beispiel verwendet wird.

Das Beispiel zeigt eine be-nutzerdefinierte Skalarfunk-tion. Führen Sie die Diskus-sion aber so allgemein, dass sie für alle benutzerdefinier-ten Funktionen gilt.

Syntax

Page 539: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 10: Implementieren von benutzerdefinierten Funktionen 5

In diesem Beispiel wird eine benutzerdefinierte Funktion erstellt, mit der ein NULL-Wert durch die Wörter „Not Applicable“ ersetzt wird.

USE Northwind GO

CREATE FUNCTION fn_NewRegion (@myinput nvarchar(30)) RETURNS nvarchar(30) BEGIN IF @myinput IS NULL SET @myinput = 'Not Applicable' RETURN @myinput END

Geben Sie bei einem Verweis auf eine benutzerdefinierte Skalarfunktion den Funktionsbesitzer und den Funktionsnamen in einer zweiteiligen Syntax an.

SELECT LastName, City, dbo.fn_NewRegion(Region) AS Region, Country FROM dbo.Employees

LastName City Region Country

Davolio Seattle WA USA Fuller Tacoma WA USA Leverling Kirkland WA USA Peacock Redmond WA USA Buchanan London Not Applicable UK Suyama London Not Applicable UK King London Not Applicable UK Callahan Seattle WA USA Dodsworth London Not Applicable UK

Einschränkungen für Funktionen Nicht deterministische Funktionen, z. B. GETDATE(), können unterschiedliche Ergebniswerte zurückgeben, auch wenn Sie jedes Mal mit denselben Eingabe-werten aufgerufen werden. Integrierte, nicht deterministische Funktionen dürfen im Hauptteil von benutzerdefinierten Funktionen nicht verwendet werden. Die folgenden integrierten Funktionen sind nicht deterministisch.

@@ERROR FORMATMESSAGE IDENTITY USER_NAME

@@IDENTITY GETANSINULL NEWID @@ERROR

@@ROWCOUNT GETDATE PERMISSIONS @@IDENTITY

@@TRANCOUNT GetUTCDate SESSION_USER @@ROWCOUNT

APP_NAME HOST_ID STATS_DATE @@TRANCOUNT

CURRENT_TIMESTAMP HOST_NAME SYSTEM_USER

CURRENT_USER IDENT_INCR TEXTPTR

DATENAME IDENT_SEED TEXTVALID

Beispiel

Ergebnis

Page 540: Programmieren Einer Microsoft SQL Server 2000-Datenbank

6 Unterrichtseinheit 10: Implementieren von benutzerdefinierten Funktionen

Erstellen einer Funktion mit Schemabindung

� Alle benutzerdefinierten Funktionen und Sichten, auf die die Funktion verweist, sind ebenfalls schemagebunden

� Auf die Objekte, auf die die Funktion verweist, wird nicht mit einem zweiteiligen Namen verwiesen

� Die Funktion und die Objekte gehören zur gleichen Datenbank

� Der Benutzer verfügt über die REFERENCE-Berechtigung für die erforderlichen Datenbankobjekte

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Mit der Schemabindung können Sie die Funktion an die Datenbankobjekte binden, auf die sie verweist. Wenn eine Funktion mit der Option SCHEMABINDING erstellt wird, können die Datenbankobjekte, auf die die Funktion verweist, nicht geändert (mit der ALTER-Anweisung) und nicht gelöscht (mit der DROP-Anweisung) werden.

Eine Funktion kann nur dann schemagebunden sein, wenn die folgenden Bedingungen erfüllt sind:

� Alle benutzerdefinierten Funktionen und Sichten, auf die die Funktion verweist, sind ebenfalls schemagebunden.

� Auf die Objekte, auf die die Funktion verweist, wird nicht mit einem zwei-teiligen Namen im owner.objectname-Format verwiesen.

� Die Funktion und die Objekte, auf die sie verweist, gehören zur gleichen Datenbank.

� Der Benutzer, der die CREATE FUNCTION-Anweisung ausgeführt hat, verfügt über die REFERENCE-Berechtigung für alle Datenbankobjekte, auf die die Funktion verweist.

ThemaErläutern Sie den Zweck und die Einschränkungen der Schemabindung.

EinstiegMit der Schemabindung können Sie die Funktion an die Datenbankobjekte binden, auf die sie verweist.

Page 541: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 10: Implementieren von benutzerdefinierten Funktionen 7

Festlegen von Berechtigungen für benutzerdefinierte Funktionen

� Erfordert die CREATE FUNCTION-Berechtigung

� Erfordert EXECUTE-Berechtigung

� Erfordert die REFERENCE-Berechtigung für die Tabellen, Sichten oder Funktionen, auf die verwiesen wird

� Erfordert den Besitz der Funktion, wenn sie in einerCREATE- oder ALTER TABLE-Anweisung verwendet wird

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Benutzerdefinierte Funktionen haben weitgehend dieselben Anforderungen an Berechtigungen wie andere Datenbankobjekte.

� Sie müssen über die CREATE FUNCTION-Berechtigung verfügen, um benutzerdefinierte Funktionen zu erstellen, zu ändern oder zu löschen.

� Andere Benutzer als der Besitzer benötigen die EXECUTE-Berechtigung für eine Funktion, um sie in einer Transact-SQL-Anweisung verwenden zu können.

� Wenn die Funktion an ein Schema gebunden ist, benötigen Sie die REFERENCE-Berechtigung für Tabellen, Sichten und Funktionen, auf die die Funktion verweist. REFERENCE- Berechtigungen können mit der GRANT-Anweisung für Sichten und benutzerdefinierte Funktionen ebenso wie für Tabellen erteilt werden.

� Wenn eine CREATE TABLE- oder ALTER TABLE-Anweisung auf eine benutzerdefinierte Funktion in einer CHECK-Einschränkung, DEFAULT-Klausel oder berechneten Spalte verweist, muss der Tabellenbesitzer auch Besitzer der Funktion sein.

ThemaErläutern Sie, dass es wichtig ist, Berechtigungen für die Verwendung von benutzerdefinierten Funk-tionen festzulegen.

EinstiegDas Sicherheitsmodell für benutzerdefinierte Funk-tionen entspricht weit-gehend dem von Sichten.

Page 542: Programmieren Einer Microsoft SQL Server 2000-Datenbank

8 Unterrichtseinheit 10: Implementieren von benutzerdefinierten Funktionen

Ändern und Löschen von benutzerdefinierten Funktionen

� Ändern von Funktionen

� Zugewiesene Berechtigungen bleiben erhalten

� Bewirkt, dass die neue Funktionsdefinition die vorhandene Definition ersetzt

� Löschen von Funktionen

ALTER FUNCTION dbo.fn_NewRegion <New function content>

ALTER FUNCTION dbo.fn_NewRegion <New function content>

DROP FUNCTION dbo.fn_NewRegionDROP FUNCTION dbo.fn_NewRegion

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Benutzerdefinierte Funktionen werden mit Hilfe der ALTER FUNCTION-Anweisung geändert und mit Hilfe der DROP FUNCTION-Anweisung ge-löscht.

Eine Funktion zu ändern anstatt zu löschen und neu zu erstellen, ist mit den-selben Vorteilen verbunden, die auch für Sichten und Prozeduren gelten. Die Berechtigungen für die Funktion bleiben erhalten und werden sofort auf die geänderte Funktion angewandt.

Ändern von Funktionen Benutzerdefinierte Funktionen werden mit der ALTER FUNCTION-Anwei-sung geändert.

Dieses Beispiel zeigt, wie eine Funktion geändert wird.

ALTER FUNCTION dbo.fn_NewRegion <New function content>

Löschen von Funktionen Benutzerdefinierte Funktionen werden mit der DROP FUNCTION-Anweisung gelöscht.

Dieses Beispiel zeigt, wie eine Funktion gelöscht wird.

DROP FUNCTION dbo.fn_NewRegion

ThemaBeschreiben Sie die ALTER FUNCTION- und DROP FUNCTION-Anweisungen.

EinstiegBenutzerdefinierte Funk-tionen werden mit Hilfe der ALTER FUNCTION-Anweisung geändert.

Beispiel

Beispiel

Page 543: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 10: Implementieren von benutzerdefinierten Funktionen 9

���� Beispiele für benutzerdefinierte Funktionen

� Erstellen einer benutzerdefinierten Skalarfunktion

� Beispiel für eine benutzerdefinierte Skalarfunktion

� Verwenden einer Funktion mit mehreren Anweisungen und Tabellenrückgabe

� Beispiel für eine Funktion mit mehreren Anweisungen und Tabellenrückgabe

� Verwenden einer Inlinefunktion mit Tabellenrückgabe

� Beispiel für eine Inlinefunktion mit Tabellenrückgabe

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

In diesem Abschnitt werden die drei Arten von benutzerdefinierten Funktionen beschrieben. Es werden ihre Aufgaben beschrieben und Beispiele für die Syntax bereitgestellt, mit der sie erstellt und aufgerufen werden können.

ThemaGeben Sie eine Übersicht über die Themen dieses Abschnitts.

EinstiegIn diesem Abschnitt werden die drei Arten von benutzer-definierten Funktionen beschrieben.

Page 544: Programmieren Einer Microsoft SQL Server 2000-Datenbank

10 Unterrichtseinheit 10: Implementieren von benutzerdefinierten Funktionen

Erstellen einer benutzerdefinierten Skalarfunktion

� Der Datentyp wird in der RETURNS-Klausel angegeben

� Die Funktion wird innerhalb eines BEGIN…END-Blockesdefiniert

� Alle Datentypen außer „text“, „ntext“, „image“, „cursor“und „timestamp“ können zurückgegeben werden

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Eine Skalarfunktion gibt einen einzelnen Datenwert zurück, dessen Typ in einer RETURNS-Klausel definiert wird. Der Hauptteil der Funktion, der in einem BEGIN...END-Block definiert ist, enthält die Reihe von Transact-SQL-Anwei-sungen, die den Wert zurückgeben. Es können alle Datentypen außer text,ntext, image, cursor und timestamp zurückgegeben werden.

ThemaBeschreiben Sie die Arbeits-weise einer Skalarfunktion.

EinstiegEine benutzerdefinierte Skalarfunktion ähnelt einer integrierten Funktion.

Page 545: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 10: Implementieren von benutzerdefinierten Funktionen 11

Beispiel für eine benutzerdefinierte Skalarfunktion

USE NorthwindCREATE FUNCTION fn_DateFormat

(@indate datetime, @separator char(1))RETURNS Nchar(20)ASBEGIN

RETURN CONVERT(Nvarchar(20), datepart(mm,@indate))+ @separator+ CONVERT(Nvarchar(20), datepart(dd, @indate))+ @separator+ CONVERT(Nvarchar(20), datepart(yy, @indate))

END

USE NorthwindCREATE FUNCTION fn_DateFormat

(@indate datetime, @separator char(1))RETURNS Nchar(20)ASBEGIN

RETURN CONVERT(Nvarchar(20), datepart(mm,@indate))+ @separator+ CONVERT(Nvarchar(20), datepart(dd, @indate))+ @separator+ CONVERT(Nvarchar(20), datepart(yy, @indate))

END

SELECT dbo.fn_DateFormat(GETDATE(), ':')SELECT dbo.fn_DateFormat(GETDATE(), ':')

� Erstellen der Funktion

� Aufrufen der Funktion

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Eine benutzerdefinierte Skalarfunktion entsprecht einer integrierten Funktion. Einmal erstellt, können Sie sie immer wieder verwenden.

In diesem Beispiel wird eine benutzerdefinierte Funktion erstellt, die Datum und Spaltentrennzeichen als Variablen erhält und das Datum als eine Zeichen-folge neu formatiert.

USE Northwind GOCREATE FUNCTION fn_DateFormat (@indate datetime, @separator char(1)) RETURNS Nchar(20) ASBEGIN RETURN CONVERT(Nvarchar(20), datepart(mm,@indate)) + @separator + CONVERT(Nvarchar(20), datepart(dd, @indate)) + @separator + CONVERT(Nvarchar(20), datepart(yy, @indate)) END

Sie rufen eine benutzerdefinierte Skalarfunktion genau so wie eine integrierte Funktion auf.

SELECT dbo.fn_DateFormat(GETDATE(), ':')

ThemaStellen Sie ein Beispiel für eine benutzerdefinierte Skalarfunktion für die Gruppendiskussion bereit.

EinstiegDies ist ein Beispiel für eine benutzerdefinierte Skalar-funktion.

Beispiel

Methodischer Hinweis Dieses Beispiel zeigt, wie eine nicht deterministische Funktion wie GETDATE() beim Aufrufen einer be-nutzerdefinierten Funktion verwendet werden kann, obwohl sie nicht in einer benutzerdefinierten Funktion verwendet werden kann.

Page 546: Programmieren Einer Microsoft SQL Server 2000-Datenbank

12 Unterrichtseinheit 10: Implementieren von benutzerdefinierten Funktionen

Verwenden einer Funktion mit mehreren Anweisungen und Tabellenrückgabe

� BEGIN und END schließen mehrere Anweisungen ein

� Die RETURNS-Klausel gibt „table“als Datentyp an

� Die RETURNS-Klausel benennt und definiert die Tabelle

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Eine Funktion mit mehreren Anweisungen und Tabellenrückgabe ist eine Kom-bination aus einer Sicht und einer gespeicherten Prozedur. Sie können benutzer-definierte Funktionen, die eine Tabelle zurückgeben, verwenden, um gespei-cherte Prozeduren oder Sichten zu ersetzen.

Eine Funktion mit Tabellenrückgabe kann (wie eine gespeicherte Prozedur) eine komplexe Logik und mehrere Transact-SQL-Anweisungen zum Erstellen einer Tabelle verwenden. Wie eine Sicht können Sie auch eine Funktion mit Tabellenrückgabe in der FROM-Klausel einer Transact-SQL-Anweisung ver-wenden.

Beachten Sie beim Verwenden einer Funktion mit mehreren Anweisungen und Tabellenrückgabe die folgenden Punkte:

� BEGIN und END begrenzen den Hauptteil der Funktion. � Die RETURNS-Klausel gibt table als Datentyp für den Rückgabewert an. � Die RETURNS-Klausel definiert einen Namen und das Format der Tabelle.

Der Gültigkeitsbereich des Namens der Rückgabevariablen ist lokal zur Funktion.

ThemaBeschreiben Sie die Arbeits-weise einer Funktion mit mehreren Anweisungen und Tabellenrückgabe.

EinstiegEine Funktion mit mehreren Anweisungen und Tabellen-rückgabe ist eine Kombina-tion aus einer Sicht und einer gespeicherten Prozedur.

Page 547: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 10: Implementieren von benutzerdefinierten Funktionen 13

Beispiel für eine Funktion mit mehreren Anweisungen und Tabellenrückgabe

� Erstellen der Funktion

� Aufrufen der Funktion

USE NorthwindGOCREATE FUNCTION fn_Employees (@length nvarchar(9))RETURNS @fn_Employees table

(EmployeeID int PRIMARY KEY NOT NULL,[Employee Name] nvarchar(61) NOT NULL)

ASBEGIN

IF @length = 'ShortName'INSERT @fn_Employees SELECT EmployeeID, LastName FROM Employees

ELSE IF @length = 'LongName'INSERT @fn_Employees SELECT EmployeeID, (FirstName + ' ' + LastName) FROM Employees

RETURNEND

USE NorthwindGOCREATE FUNCTION fn_Employees (@length nvarchar(9))RETURNS @fn_Employees table

(EmployeeID int PRIMARY KEY NOT NULL,[Employee Name] nvarchar(61) NOT NULL)

ASBEGIN

IF @length = 'ShortName'INSERT @fn_Employees SELECT EmployeeID, LastName FROM Employees

ELSE IF @length = 'LongName'INSERT @fn_Employees SELECT EmployeeID, (FirstName + ' ' + LastName) FROM Employees

RETURNEND

SELECT * FROM dbo.fn_Employees('LongName')OderSELECT * FROM dbo.fn_Employees('ShortName')

SELECT * FROM dbo.fn_Employees('LongName')OderSELECT * FROM dbo.fn_Employees('ShortName')

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Beim Erstellen von Funktionen können Sie viele Anweisungen verwenden, mit denen komplexe Operationen durchgeführt werden.

In diesem Beispiel wird eine Funktion mit mehreren Anweisungen und Tabel-lenrückgabe erstellt, die abhängig vom bereitgestellten Parameter den Nach-namen oder den Vornamen und den Nachnamen eines Mitarbeiters zurückgibt.

USE Northwind GO

CREATE FUNCTION fn_Employees (@length nvarchar(9)) RETURNS @fn_Employees TABLE (EmployeeID int PRIMARY KEY NOT NULL, [Employee Name] Nvarchar(61) NOT NULL) ASBEGIN IF @length = 'ShortName' INSERT @fn_Employees SELECT EmployeeID, LastName FROM Employees ELSE IF @length = 'LongName' INSERT @fn_Employees SELECT EmployeeID, (FirstName + ' ' + LastName) FROM Employees RETURNEND

Sie können die Funktion anstelle einer Tabelle oder Sicht aufrufen.

SELECT * FROM dbo.fn_Employees('LongName')

Oder

SELECT * FROM dbo.fn_Employees('ShortName')

ThemaStellen Sie ein Beispiel für eine Funktion mit mehreren Anweisungen und Tabellen-rückgabe für die Gruppen-diskussion bereit.

EinstiegDies ist ein Beispiel für eine Funktion mit mehreren Anweisungen und Tabellen-rückgabe.

Beispiel

Page 548: Programmieren Einer Microsoft SQL Server 2000-Datenbank

14 Unterrichtseinheit 10: Implementieren von benutzerdefinierten Funktionen

Verwenden einer Inlinefunktion mit Tabellenrückgabe

� Inhalt der Funktion ist eine SELECT-Anweisung

� BEGIN und END werden nicht verwendet

� Die RETURNS-Klausel gibt „table“als Datentyp an

� Das Format wird durch das Resultset definiert

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Benutzerdefinierte Inlinefunktionen geben eine Tabelle zurück. Auf sie wird ebenso wie auf Sichten in der FROM-Klausel verwiesen. Beachten Sie beim Verwenden von benutzerdefinierten Inlinefunktionen die folgenden Punkte:

� Die RETURN-Klausel enthält eine einzige SELECT-Anweisung in Klam-mern. Das Resultset der SELECT-Anweisung bildet die Tabelle, die von der Funktion zurückgegeben wird. Für die SELECT-Anweisung in einer Inline-funktion gelten die gleichen Einschränkungen wie für SELECT-Anweisun-gen in Sichten.

� BEGIN und END begrenzen den Hauptteil der Funktion nicht. � RETURNS gibt table als Datentyp für den Rückgabewert an. � Das Format der Rückgabevariablen muss nicht definiert werden, da es durch

das Format des Resultsets der SELECT-Anweisung in der RETURN-Klausel festgelegt wird.

ThemaBeschreiben Sie die Arbeits-weise einer Inlinefunktion mit Tabellenrückgabe.

EinstiegEine Inlinefunktion mit Tabellenrückgabe kann nur eine einzige SELECT-Anweisung enthalten.

Page 549: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 10: Implementieren von benutzerdefinierten Funktionen 15

Beispiel für eine Inlinefunktion mit Tabellenrückgabe

� Erstellen der Funktion

� Aufrufen der Funktion mit einem Parameter

USE NorthwindGOCREATE FUNCTION fn_CustomerNamesInRegion

( @RegionParameter nvarchar(30) )RETURNS tableASRETURN (

SELECT CustomerID, CompanyNameFROM Northwind.dbo.CustomersWHERE Region = @RegionParameter)

USE NorthwindGOCREATE FUNCTION fn_CustomerNamesInRegion

( @RegionParameter nvarchar(30) )RETURNS tableASRETURN (

SELECT CustomerID, CompanyNameFROM Northwind.dbo.CustomersWHERE Region = @RegionParameter)

SELECT * FROM fn_CustomerNamesInRegion(N'WA') SELECT * FROM fn_CustomerNamesInRegion(N'WA')

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Sie können mit Inlinefunktionen die Funktionalität von parametrisierten Sichten erzielen.

Beim Erstellen der Sicht darf kein benutzerdefinierter Parameter in die Sicht eingeschlossen werden. Sie können dieses Problem in der Regel lösen, indem Sie eine WHERE-Klausel beim Aufrufen der Sicht bereitstellen. Hierzu muss jedoch möglicherweise eine Zeichenfolge für die dynamische Ausführung er-stellt werden. Dies kann die Komplexität der Anwendung erhöhen. Sie können mit Hilfe einer Inlinefunktion mit Tabellenrückgabe die Funktionalität einer parametrisierten Sicht erzielen.

In diesem Beispiel wird eine Inlinefunktion mit Tabellenrückgabe erstellt, die einen Region-Wert als Parameter übernimmt.

USE Northwind GO

CREATE FUNCTION fn_CustomerNamesInRegion ( @RegionParameter nvarchar(30) ) RETURNS table ASRETURN ( SELECT CustomerID, CompanyName FROM Northwind.dbo.Customers WHERE Region = @RegionParameter )

ThemaStellen Sie ein Beispiel für eine Inlinefunktion mit Tabellenrückgabe für die Gruppendiskussion bereit.

EinstiegDies ist ein Beispiel für eine Inlinefunktion mit Tabellen-rückgabe.

Methodischer Hinweis Weisen Sie darauf hin, dass Sichten wie die folgende nicht erstellt werden können:CREATE VIEW CustView ASSELECT <fields> FROM Customers WHERE Region = @RegionParameter

Beispiel

Page 550: Programmieren Einer Microsoft SQL Server 2000-Datenbank

16 Unterrichtseinheit 10: Implementieren von benutzerdefinierten Funktionen

Stellen Sie zum Aufrufen der Funktion den Funktionsnamen als FROM-Klausel und einen Region-Wert als Parameter bereit.

SELECT * FROM fn_CustomerNamesInRegion(N'WA')

Inlinefunktionen können die Leistung erheblich steigern, wenn sie mit indizierten Sichten verwendet werden. SQL Server führt bei der Indexerstellung komplexe Aggregations- und Verknüpfungsoperationen durch. Nachfolgende Abfragen können eine Inlinefunktion mit einem Parameter verwenden, um Zeilen aus dem vereinfachten, gespeicherten Resultset zu filtern.

Tipp

Page 551: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 10: Implementieren von benutzerdefinierten Funktionen 17

Empfohlene Methoden

Verwenden Sie Funktionen mit mehreren Anweisungenanstelle von gespeicherten Prozeduren, die Tabellen zurückgebenVerwenden Sie Funktionen mit mehreren Anweisungenanstelle von gespeicherten Prozeduren, die Tabellen zurückgeben

Verwenden Sie Inlinefunktionen, um Sichten zu filternVerwenden Sie Inlinefunktionen, um Sichten zu filtern

Verwenden Sie komplexe Skalarfunktionen für kleine ResultsetsVerwenden Sie komplexe Skalarfunktionen für kleine Resultsets

Verwenden Sie Inlinefunktionen, um Sichten mit Hilfe von Parameternzu erstellenVerwenden Sie Inlinefunktionen, um Sichten mit Hilfe von Parameternzu erstellen

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Die folgenden empfohlenen Methoden sollen Ihnen beim Implementieren von benutzerdefinierten Funktionen helfen:

� Verwenden Sie komplexe Skalarfunktionen für kleine Resultsets. Benutzer-definierte Funktionen stellen eine Methode bereit, komplexe Zusammen-hänge in einer einfachen Abfrage zusammenzufassen. Wenn aber nicht alle Benutzer der Funktion die Komplexität der zugrunde liegenden Berechnung verstehen können, kann das zeitaufwendige Berechnungen, die der Benutzer nicht wahrnimmt, zur Folge haben. Wenden Sie eine komplexe Aggregation nicht auf alle Mitglieder eines umfangreichen Resultsets an.

� Verwenden Sie Funktionen mit mehreren Anweisungen anstelle von ge-speicherten Prozeduren, die Tabellen zurückgeben. Das Schreiben von ge-speicherten Prozeduren, die Tabellen zurückgeben, in Form von benutzer-definierten Funktionen mit mehreren Anweisungen kann die Leistung ver-bessern.

� Verwenden Sie Inlinefunktionen, um Sichten mit Hilfe von Parametern zu erstellen. Parameter in Inlinefunktionen können Verweise auf Tabellen und Sichten vereinfachen.

� Verwenden Sie Inlinefunktionen, um Sichten zu filtern. Die Verwendung von Inlinefunktionen mit indizierten Sichten kann die Leistung erheblich verbessern.

Zusätzliche Informationen zu den folgenden Themen erhalten Sie in der SQL Server-Onlinedokumentation.

Thema Suchbegriff

Erstellen von benutzerdefinierten Funktionen "CREATE FUNCTION"

Beschreiben der Aufgaben und Typen von benutzerdefinierten Funktionen

"Benutzerdefinierte Funktionen"

Definition und Liste der deterministischen und nicht deterministischen Funktionen

"Nicht deterministische Funktionen"

ThemaErläutern Sie die empfohle-nen Methoden zum Ver-wenden von benutzer-definierten Funktionen.

EinstiegDie folgenden Tipps sind empfohlene Methoden zum Verwenden von benutzer-definierten Funktionen.

Page 552: Programmieren Einer Microsoft SQL Server 2000-Datenbank

18 Unterrichtseinheit 10: Implementieren von benutzerdefinierten Funktionen

Übungseinheit A: Erstellen von benutzerdefinierten Funktionen

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

LernzieleAm Ende dieser Übungseinheit werden Sie in der Lage sein, die folgenden Aufgaben auszuführen:

� Erstellen von benutzerdefinierten Skalarfunktionen. � Erstellen von benutzerdefinierten Funktionen mit mehreren Anweisungen

und Tabellenrückgabe. � Erstellen von benutzerdefinierten Inlinefunktionen mit Tabellenrückgabe.

VoraussetzungenUm diese Übungseinheit zu bearbeiten, benötigen Sie Folgendes:

� Die Skriptdateien für diese Übungseinheit, die sich in C:\Moc\2328A\Labfiles\L10 befinden.

� Die Antwortdateien für diese Übungseinheit, die sich in C:\Moc\2328A\Labfiles\L10\Answers befinden.

Einrichten der ÜbungseinheitUm diese Übungseinheit zu bearbeiten, ist eine der folgenden Aktionen erforderlich:

� Bearbeiten der vorherigen Übungseinheit. � Ausführen der Batchdatei C:\Moc\2328A\Batches\Restore10.cmd.

Mit dieser Befehlsdatei wird die ClassNorthwind-Datenbank wieder in den Zustand zurückversetzt, der für diese Übungseinheit erforderlich ist.

ThemaGeben Sie eine Einführung in die Übungseinheit.

EinstiegIn dieser Übungseinheit erstellen Sie benutzer-definierte Funktionen.

Erläutern Sie die Lernziele der Übungseinheit.

Page 553: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 10: Implementieren von benutzerdefinierten Funktionen 19

Weitere Informationen Sollten Sie beim Ausführen von Dateien Hilfe benötigen, suchen Sie in der Hilfe von SQL Query Analyzer nach „Ausführen einer Abfrage“.

Daneben sind die folgenden Informationsquellen verfügbar:

� Das Northwind-Datenbankschema. � Die Microsoft SQL Server-Onlinedokumentation.

SzenarioDer Aufbau des Schulungsraumes soll die Organisation des weltweit agieren-den Handelsunternehmens Northwind Traders widerspiegeln. Das Unternehmen hat den fiktiven Domänennamen nwtraders.msft. Der primäre DNS-Server für nwtraders.msft ist der Kursleitercomputer, dessen IP-Adresse (Internetproto-koll) 192.168.x.200 lautet (wobei x die zugewiesene Schulungsraumnummer ist). Der Name des Kursleitercomputers ist London.

Die folgende Tabelle stellt den Benutzernamen, den Computernamen und die IP-Adresse für jeden Kursteilnehmercomputer in der fiktiven Domäne nwtraders.msft bereit. Suchen Sie den Ihrem Computer zugewiesenen Benutzernamen und notieren Sie ihn.

Benutzername Computername IP-Adresse

SQLAdmin1 Vancouver 192.168.x.1SQLAdmin2 Denver 192.168.x.2SQLAdmin3 Perth 192.168.x.3SQLAdmin4 Brisbane 192.168.x.4SQLAdmin5 Lisbon 192.168.x.5SQLAdmin6 Bonn 192.168.x.6SQLAdmin7 Lima 192.168.x.7SQLAdmin8 Santiago 192.168.x.8SQLAdmin9 Bangalore 192.168.x.9SQLAdmin10 Singapore 192.168.x.10SQLAdmin11 Casablanca 192.168.x.11SQLAdmin12 Tunis 192.168.x.12SQLAdmin13 Acapulco 192.168.x.13SQLAdmin14 Miami 192.168.x.14SQLAdmin15 Auckland 192.168.x.15SQLAdmin16 Suva 192.168.x.16SQLAdmin17 Stockholm 192.168.x.17SQLAdmin18 Moscow 192.168.x.18SQLAdmin19 Caracas 192.168.x.19SQLAdmin20 Montevideo 192.168.x.20SQLAdmin21 Manila 192.168.x.21SQLAdmin22 Tokyo 192.168.x.22SQLAdmin23 Khartoum 192.168.x.23SQLAdmin24 Nairobi 192.168.x.24

Veranschlagte Zeit für die Übungseinheit: 30 Minuten

Page 554: Programmieren Einer Microsoft SQL Server 2000-Datenbank

20 Unterrichtseinheit 10: Implementieren von benutzerdefinierten Funktionen

Übung 1 Erstellen einer benutzerdefinierten Skalarfunktion

Die Produkte Ihres Unternehmens unterliegen unterschiedlichen Steuersätzen, die sich aus der Produktkategorie ableiten. Bestimmte Produkte, wie z. B. Getränke, werden hoch besteuert. Andere Produkte, wie z. B. Gewürze, sind steuerfrei. Sie haben sich entschlossen, eine benutzerdefinierte Funktion zu erstellen, in der die gesamte Besteuerungslogik zusammengefasst wird. Diese benutzerdefinierte Funktion dient der zentralen Verwaltung der Steuersätze, und sie reduziert die Anzahl der Stellen, in denen die Logik wiederholt und verwal-tet werden muss.

In dieser Übung werden Sie ein Skript erstellen und ausführen, mit dem eine benutzerdefinierte Skalarfunktion erstellt wird. Nachdem Sie die Funktion er-stellt haben, testen Sie sie, um die korrekte Funktionsweise zu überprüfen.

� So erstellen Sie eine benutzerdefinierte Skalarfunktion In diesem Verfahren erstellen Sie eine benutzerdefinierte Skalarfunktion, indem Sie eine Skriptdatei ausführen. 1. Melden Sie sich mit Hilfe der Informationen in der folgenden Tabelle an der

Schulungsraumdomäne nwtraders an.

Option Eingabe

Benutzername SQLAdminx (wobei x die Ihrem Computernamen zugewiesene Nummer ist, wie in der Schulungsraumdomäne nwtraders.msftfestgelegt)

Kennwort password

2. Öffnen Sie SQL Query Analyzer und melden Sie sich gegebenenfalls mit Microsoft Windows®-Authentifizierung am (lokalen) Server an. Sie sind berechtigt, sich an SQL Server anzumelden und SQL Server zu verwalten, da Sie als SQLAdminx angemeldet und damit Mitglied der lokalen Administratorgruppe von Microsoft Windows 2000 sind. Alle Mitglieder dieser Gruppe werden automatisch der sysadmin-Rolle von SQL Server zugeordnet.

3. Klicken Sie in der Liste DB auf ClassNorthwind.4. Öffnen und überprüfen Sie TaxRate.sql im Ordner

C:\Moc\2328A\Labfiles\L10, und führen Sie das Skript aus. In diesem Skript wird gezeigt, wie mit einer CASE-Anweisung für jedes Produkt ein Steuersatz abhängig von der Produktkategorie berechnet wird.

5. Erstellen Sie eine benutzerdefinierte Skalarfunktion mit dem Namen fn_TaxRate, um die CASE-Anweisung zu kapseln. Nehmen Sie einen Para-meter als @ProdID int an, und geben Sie einen numeric(5,4)-Datentyp zurück.C:\Moc\2328A\Labfiles\L10\Answers\fn_TaxRate.sql ist ein vollstän-diges Skript, das diese Funktion enthält.

Page 555: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 10: Implementieren von benutzerdefinierten Funktionen 21

� So testen Sie die Funktion In diesem Verfahren testen Sie die soeben erstellte Funktion, indem Sie Spalten aus der Products-Tabelle auswählen. • Führen Sie die folgende SELECT-Anweisung aus, um ProductName,

UnitPrice, CategoryID, TaxRate und einen berechneten PriceWithTax-Wert aus der Products-Tabelle auszuwählen: SELECT ProductName, UnitPrice, CategoryID, ClassNorthwind.dbo.fn_TaxRate(ProductID) AS TaxRate, UnitPrice * ClassNorthwind.dbo. fn_TaxRate(ProductID) AS PriceWithTax FROM Products

Die TaxRate-Spalte sollte jetzt für jedes Produkt den Wert 1.00, 1.05 oder 1.10 enthalten. Die PriceWithTax-Spalte sollte den Preis inklusive Steuer (ermittelt aus UnitPrice multipliziert mit TaxRate) enthalten.

Page 556: Programmieren Einer Microsoft SQL Server 2000-Datenbank

22 Unterrichtseinheit 10: Implementieren von benutzerdefinierten Funktionen

Übung 2 Erstellen einer benutzerdefinierten Funktion mit mehreren Anweisungen und Tabellenrückgabe

In dieser Übung erstellen Sie eine benutzerdefinierte Funktion mit mehreren Anweisungen und Tabellenrückgabe. Die Funktion fragt die Employees-Tabelle in der ClassNorthwind-Datenbank ab und zeigt alle direkten und indirekten Berichte an.

� So erstellen Sie eine benutzerdefinierte Funktion mit mehreren Anweisungen und Tabellenrückgabe

Die Employees-Tabelle in der ClassNorthwind-Datenbank enthält eine Spalte mit dem Namen ReportsTo. Sie enthält die Personalnummer (Employee ID)des Vorgesetzten, an den der betreffende Mitarbeiter berichtet. In diesem Beispiel erstellen Sie eine benutzerdefinierte Funktion, die die Per-sonalnummer (EmployeeID) eines Vorgesetzten als Parameter übernimmt und aus der Employee-Tabelle alle Mitarbeiter entnimmt, die an diesen Vorge-setzten berichten. • Öffnen und überprüfen Sie fn_FindReports.sql im Ordner

C:\Moc\2328A\Labfiles\L10, und führen Sie das Skript aus. Dieses Skript erstellt eine Funktion mit dem Namen fn_FindReports, die eine Tabelle der berichtenden Mitarbeiter zurückgibt.

� So testen Sie die Funktion In diesem Verfahren testen Sie die soeben erstellte Funktion, indem Sie Spalten aus der fn_FindReports-Funktion auswählen. 1. Führen Sie die folgende SELECT-Anweisung aus, um EmployeeID-,

Name-, Title- und MgrEmployeeID-Spalten aus der fn_FindReports-Funktion auszuwählen. SELECT EmployeeID, [Name], Title, MgrEmployeeID FROM dbo.fn_FindReports(5)

Diese SELECT-Anweisung gibt die Mitarbeiter zurück, die an Steven Buchanan, den Vorgesetzten mit der Personalnummer 5 (EmployeeID 5), berichten.

2. Führen Sie die folgende SELECT-Anweisung aus, um EmployeeID, Name,Title und MgrEmployeeID aus der fn_FindReports-Funktion auszuwählen. SELECT EmployeeID, Name, Title, MgrEmployeeID FROM dbo.fn_FindReports(2)

Diese Anweisung gibt eine Tabelle mit den Namen der Mitarbeiter zurück, die an Andrew Fuller, den Vorgesetzten mit der Personalnummer 2 (EmployeeID 2), berichten. C:\Moc\2328A\Labfiles\L10\Answers\Call_fn_FindReports.sql ist ein vollständiges Skript, das diese Anweisung enthält.

Page 557: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 10: Implementieren von benutzerdefinierten Funktionen 23

Übung 3 Erstellen einer benutzerdefinierten Inlinefunktion mit Tabellenrückgabe

In dieser Übung erstellen Sie eine benutzerdefinierte Inlinefunktion mit Tabellenrückgabe als Alternative zu einer Sicht. Diese Funktion mit dem Namen fn_LargeFreight nimmt einen Dollarbetrag als Parameter an und gibt Frachtaufträge zurück, deren Frachtkosten den Dollarbetrag übersteigt.

� So erstellen Sie eine benutzerdefinierte Inlinefunktion mit Tabellenrückgabe

Die Orders-Tabelle in der ClassNorthwind-Datenbank enthält eine Spalte mit dem Namen Freight. Sie enthält den Dollarbetrag, der für die Frachtkosten pro Auftrag berechnet wird. Sie möchten die Tabelle mit der Shippers-Tabelle ver-knüpfen, um sowohl die Auftragsdaten als auch die Lieferdaten zurückzugeben. Außerdem möchten Sie das Resultset filtern, sodass nur die Aufträge mit hohen Frachtkosten angezeigt werden. In diesem Verfahren erstellen Sie eine benutzerdefinierte Inlinefunktion mit Tabellenrückgabe, die als parametrisierte Sicht dient. • Erstellen Sie eine benutzerdefinierte Inlinefunktion mit Tabellenrückgabe

mit dem Namen fn_LargeFreight, die einen Parameter mit dem Namen @FreightAmt vom Datentyp money annimmt und die Ausgabe der fol-genden SELECT-Anweisung zurückgibt: SELECT S.ShipperID, S.CompanyName, O.OrderID, O.ShippedDate, O.Freight FROM Shippers AS S JOIN Orders AS O ON S.ShipperID = O.ShipVia WHERE O.Freight > @FreightAmt

C:\Moc\2328A\Labfiles\L10\Answers\fn_LargeFreight.sql ist ein voll-ständiges Skript, das diese Funktion enthält.

� So testen Sie die Funktion In diesem Verfahren testen Sie die soeben erstellte Funktion, indem Sie Spalten aus der fn_LargeFreight-Funktion auswählen. • Führen Sie die folgende SELECT-Anweisung aus, um Zeilen aus der

fn_LargeFreight-Funktion auszuwählen, die Frachtkosten über 600 $ ausweisen. SELECT * FROM fn_LargeFreight(600)

C:\Moc\2328A\Labfiles\L10\Answers\Call_fn_LargeFreight.sql ist ein vollständiges Skript, das diese Anweisung enthält.

Page 558: Programmieren Einer Microsoft SQL Server 2000-Datenbank

24 Unterrichtseinheit 10: Implementieren von benutzerdefinierten Funktionen

Lernzielkontrolle

� Arten von benutzerdefinierten Funktionen

� Definieren von benutzerdefinierten Funktionen

� Beispiele für benutzerdefinierte Funktionen

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

1. Beschreiben Sie die drei Arten von benutzerdefinierten Funktionen. Skalarfunktionen ähneln integrierten Funktionen. Funktion mit mehreren Anweisungen und Tabellenrückgabe ähneln gespeicherten Prozeduren. Inlinefuntionen mit Tabellenrückgabe ähneln Sichten.

2. Welche integrierten Funktionen dürfen im Hauptteil einer benutzer-definierten Funktion nicht verwendet werden? Nicht deterministische Funktionen, wie z. B. GETDATE(), dürfen im Hauptteil nicht verwendet werden.

3. Bei welchen benutzerdefinierten Funktionen müssen Sie die Namen und Datentypen der Ausgabespalten angeben? Skalarfunktionen und benutzerdefinierte Funktionen mit mehreren Anweisungen und Tabellenrückgabe erfordern vollständige Spalten-beschreibungen, einschließlich der Definition der Spaltennamen und Datentypen. Inlinefunktionen verwenden die Spaltennamen und die impliziten Datentypen der Ausgabespalten.

ThemaVertiefen Sie die Lernziele dieser Unterrichtseinheit, indem Sie die Kernpunkte wiederholen.

EinstiegDie Fragen zur Lernziel-kontrolle beziehen sich auf einige der Schlüsselkon-zepte, die Inhalt dieser Unterrichtseinheit sind.

Methodischer Hinweis Gehen Sie anhand dieser Fragen die Themen der Unterrichtseinheit durch.

Klären Sie andere offene Fragen der Kursteilnehmer, bevor Sie fortfahren.

Page 559: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 11: Implementieren von Triggern

Inhalt

Übersicht 1

Einführung in Trigger 2

Definieren von Triggern 10

Funktionsweise von Triggern 16

Beispiele für Trigger 31

Leistungsaspekte 34

Empfohlene Methoden 35

Übungseinheit A: Erstellen von Triggern 36

Lernzielkontrolle 44

Page 560: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Die in diesen Unterlagen enthaltenen Angaben und Daten können ohne vorherige Ankündigung geändert werden. Die in diesen Unterlagen genannten Firmen, Produkte, Menschen, Charaktere und/oder Daten sind frei erfunden und sollen keine wirklichen Individuen, Gesellschaften, Produkte oder Veranstaltungen darstellen, soweit nichts anderes angegeben ist. Die Benutzer/innen sind verpflichtet, sich an alle anwendbaren Urheberrechtsgesetze zu halten. Ohne ausdrückliche schriftliche Erlaubnis der Microsoft Corporation darf kein Teil dieser Unterlagen für irgendwelche Zwecke vervielfältigt oder übertragen werden, unabhängig davon, auf welche Art und Weise oder mit welchen Mitteln, elektronisch oder mechanisch, dies geschieht. Wenn auf dieses Dokument nur auf elektronischem Wege zugegriffen werden kann, sind Sie hiermit berechtigt, eine (1) Kopie zum persönlichen Gebrauch auszudrucken.

Microsoft Corporation kann Inhaber von Patenten oder Patentanträgen, Marken, Urheberrechten oder anderen gewerblichen Schutzrechten sein, die den Inhalt dieses Dokuments betreffen. Die Bereitstellung dieses Dokuments gewährt keinerlei Lizenzrechte an diesen Patenten, Marken, Urheberrechten oder anderen gewerblichen Schutzrechten, es sei denn, dies wurde ausdrücklich durch einen schriftlichen Lizenzvertrag mit der Microsoft Corporation vereinbart.

2000 Microsoft Corporation. Alle Rechte vorbehalten.

Microsoft, ActiveX, BackOffice, MS-DOS, PowerPoint, Visual Basic, Visual C++, Visual Studio, Windows und Windows NT sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern.

Andere in diesem Dokument aufgeführte Produkt- und Firmennamen sind möglicherweise Marken der jeweiligen Eigentümer.

Project Lead: Rich Rose Instructional Designers: Rich Rose, Cheryl Hoople, Marilyn McGill Instructional Software Design Engineers: Karl Dehmer, Carl Raebler, Rick Byham Technical Lead: Karl Dehmer Subject Matter Experts: Karl Dehmer, Carl Raebler, Rick Byham Graphic Artist: Kirsten Larson (Independent Contractor) Editing Manager: Lynette Skinner Editor: Wendy Cleary Copy Editor: Edward McKillop (S&T Consulting) Production Manager: Miracle Davis Production Coordinator: Jenny Boe Production Support: Lori Walker (S&T Consulting) Test Manager: Sid Benavente Courseware Testing: TestingTesting123 Classroom Automation: Lorrin Smith-Bates Creative Director, Media/Sim Services: David Mahlmann Web Development Lead: Lisa Pease CD Build Specialist: Julie Challenger Online Support: David Myka (S&T Consulting) Localization Manager: Rick Terek Operations Coordinator: John Williams Manufacturing Support: Laura King; Kathy Hershey Lead Product Manager, Release Management: Bo Galford Lead Product Manager, Data Base: Margo Crandall Group Manager, Courseware Infrastructure: David Bramble Group Product Manager, Content Development: Dean Murray General Manager: Robert Stewart

Page 561: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 11: Implementieren von Triggern iii

Hinweise für den Kursleiter In dieser Unterrichtseinheit erhalten die Kursteilnehmer eine Übersicht darüber, was Trigger sind und wie sie erstellt werden. Trigger sind hilfreiche Tools für Datenbankimplementierer, die vordefinierte Aktionen ausführen möchten, sobald in einer bestimmten Tabelle Daten eingefügt, aktualisiert oder gelöscht werden. Sie eignen sich insbesondere für das Durchsetzen von Geschäftsregeln und das Sicherstellen der Datenintegrität.

Die folgenden Bestandteile eines Triggers werden erläutert:

� Die Anweisungen, mit denen er aktiviert wird (INSERT, UPDATE oder DELETE)

� Die Tabelle, die vom Trigger geschützt wird � Die Maßnahme, die der Trigger ergreift, wenn er aufgerufen wird

In diesem Abschnitt werden darüber hinaus auch die Verwendungsmöglich-keiten für Trigger sowie die Aspekte erläutert, die bei der Ermittlung berück-sichtigt werden müssen, ob ein Trigger das geeignete Tool zum Ausführen einer Aufgabe ist.

Im nachfolgenden Abschnitt wird das Verfahren zum Erstellen und Löschen von Triggern erläutert, und es werden detaillierte Informationen zu den Funk-tionsweisen der vier Triggerarten bereitgestellt: INSERT, UPDATE, DELETE und INSTEAD OF. Daneben wird erläutert, wie Trigger geändert werden.

Darauf folgt eine Erläuterung, wie Trigger funktionieren, einschließlich einiger Beispiele zum Schachteln von Triggern und wie Trigger sinnvoll eingesetzt werden können, um Datenintegrität, komplexe referenzielle Integrität und Geschäftsregeln durchzusetzen.

Die Unterrichtseinheit schließt mit einer Liste von empfohlenen Methoden und Leistungsaspekten, die Implementierer berücksichtigen sollten, wenn sie Trigger erstellen und mit Triggern arbeiten.

In der Übungseinheit erstellen die Kursteilnehmer Trigger und testen die Effek-tivität dieser Trigger.

Am Ende dieser Unterrichtseinheit werden die Kursteilnehmer in der Lage sein, die folgenden Aufgaben auszuführen:

� Erstellen eines Triggers. � Löschen eines Triggers. � Ändern eines Triggers. � Erläutern der Arbeitsweise verschiedener Trigger. � Beurteilen der Leistungsaspekte, die Auswirkungen auf das Verwenden von

Triggern haben.

Präsentation:45 Minuten

Übungseinheit:30 Minuten

Page 562: Programmieren Einer Microsoft SQL Server 2000-Datenbank

iv Unterrichtseinheit 11: Implementieren von Triggern

Unterlagen und Vorbereitung In diesem Abschnitt werden die erforderlichen Unterlagen und vorbereitenden Aufgaben erläutert, die nötig sind, um diese Unterrichtseinheit zu unterrichten.

Erforderliche Unterlagen Um diese Unterrichtseinheit zu unterrichten, benötigen Sie folgende Unterlagen:

� Die Microsoft® PowerPoint®-Datei 2328A_11.ppt� Die Beispieldatei C:\Moc\2328A\Demo\D11_Ex.sql, die alle Beispiel-

skripts der Unterrichtseinheit enthält, soweit in der Unterrichtseinheit nichts anderes angegeben ist.

Vorbereitende Aufgaben Zur Vorbereitung dieser Unterrichtseinheit gehen Sie folgendermaßen vor:

� Lesen Sie alle Unterlagen für diese Unterrichtseinheit. � Arbeiten Sie die Übungseinheit durch.

Sonstige Aktivitäten In diesem Abschnitt werden Verfahren bereitgestellt, mit denen interaktive Aktivitäten zum Anzeigen und Überprüfen von Informationen implementiert werden, wie Spiele oder Übungen mit Rollenspielen.

Anzeigen der PowerPoint-Animationen Alle Animationen sind durch ein Hyperlinksymbol in der unteren linken Ecke der Folie gekennzeichnet.

� So zeigen Sie die Folie „Funktionsweise eines INSERT-Triggers“ an Diese Folie zeigt, wie mit dem INSERT-Trigger eine Zeile eingefügt und wie die inserted-Tabelle verwendet wird. 1. Zeigen Sie die Folie an, die die Order Details-Tabelle zeigt, bevor irgend-

welche Änderungen vorgenommen wurden. 2. Zeigen Sie die nächste Folie an, auf der eine Zeile gezeigt wird, die in die

Tabelle eingefügt wurde. Die Folie wechselt automatisch, um zu zeigen, dass die eingefügte Zeile auch in das Protokoll geschrieben wird und dass sie für den Trigger und die Benutzer als die inserted-Tabelle zugänglich ist.

3. Zeigen Sie die nächste Folie an, die das Triggerdefinitionsskript zeigt, und erläutern Sie die Aktionen, die von den Anweisungen ausgeführt werden.

4. Zeigen Sie die letzte Folie an, auf der die Funktionsweise des Triggers zusammengefasst wird.

Page 563: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 11: Implementieren von Triggern v

� So zeigen Sie die Folie „Funktionsweise eines DELETE-Triggers“ an Diese Folie zeigt, wie mit dem DELETE-Trigger eine Zeile gelöscht und wie die deleted-Tabelle verwendet wird. 1. Zeigen Sie die Folie an, die die Categories-Tabelle zeigt, bevor irgend-

welche Änderungen vorgenommen wurden. 2. Zeigen Sie die nächste Folie an, die zeigt, dass eine Zeile aus der Tabelle

gelöscht wurde und nun als die deleted-Tabelle zur Verfügung steht. 3. Zeigen Sie die nächste Folie an, die zeigt, welche Aktionen das Trigger-

definitionsskript und der Trigger in der Products-Tabelle ausführen. 4. Zeigen Sie die letzte Folie an, auf der die Funktionsweise des Triggers

zusammengefasst wird.

� So zeigen Sie die Folie „Funktionsweise eines UPDATE-Triggers“ an Diese Folie zeigt, wie ein UPDATE-Trigger eine Zeile unter Verwendung der inserted- und deleted-Tabellen ändert. 1. Die Folie zeigt die Employees-Tabelle, für die eine UPDATE-Anweisung

ausgeführt werden soll, bevor irgendwelche Änderungen vorgenommen wurden. Die Folie zeigt darüber hinaus auch die Zeilen, die in den inserted-und deleted-Tabellen gespeichert werden.

2. Zeigen Sie die nächste Folie an, die das Triggerdefinitionsskript zeigt und die Aktionen illustriert, die vom Trigger ausgelöst wurden.

3. Zeigen Sie die letzte Folie an, die die Reihenfolge der Ereignisse bei der Ausführung eines Triggers zusammenfasst.

� So zeigen Sie die Folie „Funktionsweise eines INSTEAD OF-Triggers“ an

Diese Folie zeigt, wie ein INSTEAD OF-Trigger verwendet werden kann, um eine Sicht zu aktualisieren und die Daten umzuleiten. 1. Die Folie zeigt eine Sicht, die auf zwei Tabellen basiert. Erläutern Sie, wie

die Kunden mit diesen Tabellen nach Ländern aufgeteilt werden. 2. Zeigen Sie die nächste Folie an, auf der die Sicht aktualisiert wird. Erläutern

Sie im weiteren Verlauf der Präsentation, wie die Aktualisierung umgeleitet wird und dass in der Customers-Sicht kein Einfügungsversuch erfolgt.

3. Zeigen Sie die letzte Folie an, die die Kernpunkte im Bezug auf INSTEAD OF-Trigger zusammenfasst.

� So zeigen Sie die Folie „Durchsetzen von Geschäftsregeln“ an Diese Folie zeigt, wie die Geschäftsregel „Produkte mit ausstehenden Bestellungen können nicht gelöscht werden“ mit Hilfe eines Triggers durchgesetzt wird. 1. Die Folie zeigt anfänglich den DELETE-Trigger, der die Geschäftsregel

„Produkte mit ausstehenden Bestellungen können nicht gelöscht werden“ durchsetzt. Darüber hinaus wird die Products-Tabelle angezeigt, aus der ProductID 2 entfernt wird.

2. Zeigen Sie die nächste Folie an, auf der das Produkt mit der ProductID 2 ausder Products-Tabelle entfernt wird.

Page 564: Programmieren Einer Microsoft SQL Server 2000-Datenbank

vi Unterrichtseinheit 11: Implementieren von Triggern

3. Zeigen Sie die nächste Folie an, die die Order Details-Tabelle mit mar-kierter ProductID 2-Zeile zeigt und so angibt, dass Bestellungen für dieses Produkt ausstehen.

4. Zeigen Sie die nächste Folie an, in der eine Fehlermeldung ausgegeben wird.

5. Zeigen Sie die letzte Folie an, in der die Zeile ProductID2 wieder in die Products-Tabelle eingefügt wird.

Strategie für die Unterrichtseinheit Verwenden Sie die folgende Strategie, um diese Unterrichtseinheit zu präsentieren:

� Einführung in Trigger Geben Sie den Kursteilnehmern eine Definition von Triggern. Weisen Sie darauf hin, dass es sich bei einem Trigger um eine spezielle Form einer ge-speicherten Prozedur handelt, die einer bestimmten Tabelle zugewiesen ist. Erläutern Sie dann die drei Kernpunkte: dass Trigger automatisch aufge-rufen werden, dass Trigger nur von einer Auslöseraktion für die Trigger-tabelle aufgerufen werden können und dass es sich um Transaktionen handelt. Befassen Sie sich kurz mit den wichtigsten Verwendungsmöglichkeiten von Triggern. Mit Triggern können Änderungen über eine gesamte Datenbank kaskadiert werden. Hiermit können komplexere Geschäftsregeln durchge-setzt werden als diejenigen, die mit CHECK-Einschränkungen oder Regeln definiert werden können. Trigger bieten auch die Möglichkeit eines Status-vergleichs vor und nach einer Aktion (Abbild) bei Daten, die mit einer INSERT-, UPDATE- oder DELETE-Anweisung geändert wurden. Erwäh-nen Sie, dass kaskadierende Aktionen zur Durchsetzung von referenzieller Integrität alternativ zur Verwendung von Triggern eingesetzt werden können.Erläutern Sie einige der Aspekte und Richtlinien, die Implementierer bei der Entscheidung berücksichtigen müssen, ob Trigger anstelle anderer Tools verwendet werden sollen.

� Definieren von Triggern Erläutern Sie die CREATE TRIGGER-Anweisung und die verschiedenen Optionen, die den Benutzern bei der Erstellung eines Triggers zur Ver-fügung stehen. Betonen Sie, dass die Kursteilnehmer die vollständige Kontrolle über die Anweisungen haben, die von einem Trigger ausgeführt werden, und dass die Benutzer die Auslösung des Triggers nicht umgehen können.Gehen Sie auf Berechtigungen, Microsoft SQL Server™ 2000-Anweisungen, die nicht in Triggerdefinitionen verwendet werden können, ein, und erläu-tern Sie, dass Benutzer die gespeicherte Systemprozedur sp_depends für eine Tabelle verwenden können, um die mit der Tabelle verknüpften Triggerinformationen anzuzeigen. Erklären Sie das Verfahren zum Ändern eines Triggers und liefern Sie Bei-spiele für Situationen (oder lassen Sie die Kursteilnehmer Beispiele nen-nen), in denen Triggerdefinitionen eventuell geändert werden könnten. Befassen Sie sich auch mit der DROP TRIGGER-Syntax.

Page 565: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 11: Implementieren von Triggern vii

� Funktionsweise von Triggern Erläutern Sie anhand der Animationen, wie die INSERT-, DELETE-, UPDATE- und INSTEAD OF-Anweisungen arbeiten. Beschreiben Sie die Verwendung von geschachtelten Triggern, und erwäh-nen Sie, dass Benutzer Schachtelung aktivieren oder deaktivieren können. Zeigen Sie Situationen auf, in denen die Kursteilnehmer möglicherweise mit Schachtelung arbeiten möchten, und erläutern Sie die Auswirkungen dieser Vorgehensweise, wie beispielsweise langwierige Transaktionen, Sperren und ROLLBACK TRANSACTION-Anweisungen. Befassen Sie sich abschließend mit der Funktionsweise von rekursiven Triggern. Weisen Sie die Kursteilnehmer darauf hin, dass zwar ein Trigger sich selbst aufrufen kann, dass in diesem Fall jedoch eine Anweisung zur Beendigungsprüfung der Rekursion in die Triggerdefinition aufgenommen werden sollte, damit der Trigger nicht in eine Endlosschleife gerät.

� Beispiele für Trigger Besprechen und erläutern Sie jedes Beispiel für einen effektiven Trigger.

� Leistungsaspekte Erläutern Sie einige Leistungsaspekte, die bei der Verwendung von Triggern berücksichtigt werden müssen.

AnpassungsinformationenDieser Abschnitt beschreibt die Anforderungen zum Einrichten der Übungs-einheiten für eine Unterrichtseinheit sowie die Konfigurationsänderungen, die während der Übungseinheiten an den Kursteilnehmercomputern vorgenommen werden. Diese Informationen sollen Ihnen beim Replizieren oder Anpassen der Microsoft Official Curriculum-Courseware (MOC) helfen.

Die Übungseinheit in dieser Unterrichtseinheit hängt auch von der Schulungsraumkonfiguration ab, die im Abschnitt „Anpassungsinformationen“ am Ende des Dokuments Handbuch für das Einrichten von Schulungs-computern für Kurs 2328A, Programmieren einer Microsoft SQL Server 2000-Datenbank, angegeben ist.

Wichtig

Page 566: Programmieren Einer Microsoft SQL Server 2000-Datenbank

viii Unterrichtseinheit 11: Implementieren von Triggern

Einrichten der Übungseinheit Der folgende Abschnitt beschreibt die Anforderungen zum Einrichten der Übungseinheit für diese Unterrichtseinheit.

EinrichtungsanforderungFür die Übungseinheit in dieser Unterrichtseinheit muss sich die ClassNorthwind-Datenbank in dem für die Übungseinheit erforderlichen Zustand befinden. Um die Kursteilnehmercomputer so vorzubereiten, dass sie diese Anforderung erfüllen, führen Sie eine der folgenden Aktionen aus:

� Bearbeiten der vorhergehenden Übungseinheit. � Ausführen der Batchdatei C:\Moc\2328A\Batches\Restore11.cmd.

Wenn dieser Kurs angepasst wurde, müssen die Kursteilnehmer die Batchdatei C:\Moc\2328A\Batches\Restore11.cmd ausführen, damit sicherge-stellt ist, dass die Übungseinheit ordnungsgemäß durchgeführt werden kann.

Ergebnisse der Übungseinheit Auf den Kursteilnehmercomputern gibt es keine Konfigurationsänderungen, die die Replikation oder die Anpassung betreffen.

Achtung

Page 567: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 11: Implementieren von Triggern 1

Übersicht

� Einführung in Trigger

� Definieren von Triggern

� Funktionsweise von Triggern

� Beispiele für Trigger

� Leistungsaspekte

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Ein Trigger ist eine gespeicherte Prozedur, die ausgeführt wird, wenn Daten in einer angegebenen Tabelle geändert werden. Trigger werden häufig erstellt, um die referenzielle Integrität oder Konsistenz von logisch verknüpften Daten in unterschiedlichen Tabellen durchzusetzen. Da Trigger vom Benutzer nicht um-gangen werden können, können Sie Trigger verwenden, um komplexe Geschäftsregeln durchzusetzen, mit denen die Datenintegrität sichergestellt wird.

Am Ende dieser Unterrichtseinheit werden Sie in der Lage sein, die folgenden Aufgaben auszuführen:

� Erstellen eines Triggers. � Löschen eines Triggers. � Ändern eines Triggers. � Erläutern der Arbeitsweise verschiedener Trigger. � Beurteilen der Leistungsaspekte, die Auswirkungen auf das Verwenden von

Triggern haben.

ThemaGeben Sie eine Übersicht über die Themen und Lern-ziele dieser Unterrichts-einheit.

EinstiegIn dieser Unterrichtseinheit erfahren Sie, wie Trigger erstellt werden.

Page 568: Programmieren Einer Microsoft SQL Server 2000-Datenbank

2 Unterrichtseinheit 11: Implementieren von Triggern

���� Einführung in Trigger

� Definition von Triggern

� Verwendungsmöglichkeiten von Triggern

� Überlegungen zum Verwenden von Triggern

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

In diesem Abschnitt erhalten Sie eine Einführung zu Triggern, und es wird erläutert, wann und wie Trigger verwendet werden.

ThemaStellen Sie das Konzept der Triggerobjekte vor.

EinstiegIn diesem Abschnitt erfahren Sie, wann und wie Trigger verwendet werden.

Page 569: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 11: Implementieren von Triggern 3

Definition von Triggern

� Trigger sind mit einer Tabelle verknüpft

� Trigger werden automatisch aufgerufen

� Trigger können nicht direkt aufgerufen werden

� Trigger sind Teil einer Transaktion

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Ein Trigger ist eine spezielle Form einer gespeicherten Prozedur, die bei jedem Versuch ausgeführt wird, vom Trigger geschützte Daten einer Tabelle zu än-dern. Trigger sind mit bestimmten Tabellen verbunden.

Trigger sind mit einer Tabelle verknüpft Trigger werden für eine bestimmte Tabelle definiert, die als Triggertabellebezeichnet wird.

Trigger werden automatisch aufgerufen Bei einem Versuch, Daten in eine Tabelle einzufügen oder Daten in einer Tabelle zu aktualisieren oder zu löschen, wird der Trigger automatisch ausge-führt, wenn für die spezielle Aktion ein Trigger für die Tabelle definiert wurde. Der Trigger kann nicht umgangen werden.

Trigger können nicht direkt aufgerufen werden Im Gegensatz zu gespeicherten Standardsystemprozeduren können Trigger nicht direkt aufgerufen werden und keine Parameter übergeben oder annehmen.

Trigger sind Teil einer Transaktion Der Trigger und die den Trigger auslösende Anweisung werden als eine ein-zelne Transaktion behandelt, für die an einer beliebigen Stelle innerhalb des Triggers ein Rollback ausgeführt werden kann. Beachten Sie bei der Verwen-dung von Triggern die folgenden Aspekte und Richtlinien:

� Triggerdefinitionen können selbst dann eine ROLLBACK TRANSACTION-Anweisung einschließen, wenn keine explizite BEGIN TRANSACTION-Anweisung vorhanden ist.

ThemaStellen Sie das Konzept von Triggern vor, und nen-nen Sie die Vorteile der Verwendung von Triggern.

EinstiegEin Trigger ist eine spezielle Form einer gespeicherten Prozedur, die bei jedem Versuch, vom Trigger ge-schützte Daten zu ändern, automatisch ausgeführt wird. Trigger sind mit be-stimmten Tabellen verbunden.

KernpunkteEin Trigger ist eine beson-dere Art von gespeicherter Prozedur. Ein Trigger kann jede beliebige Transact-SQL-Anweisung enthalten. Trigger verwenden zum Speichern des Ausführungs-planes den Prozedurcache.

Methodischer Hinweis Gehen Sie nicht detailliert auf Transaktionen ein. Transaktionen werden in anderen Unterrichtsein-heiten dieses Kurses erläutert.

Page 570: Programmieren Einer Microsoft SQL Server 2000-Datenbank

4 Unterrichtseinheit 11: Implementieren von Triggern

� Wenn eine ROLLBACK TRANSACTION-Anweisung vorliegt, wird ein Rollback für die gesamte Transaktion ausgeführt. Wenn im Triggerskript auf die ROLLBACK TRANSACTION-Anweisung eine Anweisung folgt, wird diese Anweisung ausgeführt. Daher kann es notwendig sein, eine RETURN-Klausel in einer IF-Anweisung zu verwenden, um die Verarbei-tung anderer Anweisungen zu verhindern.

� Wenn ein Trigger, der eine ROLLBACK TRANSACTION-Anweisung ent-hält, innerhalb einer benutzerdefinierten Transaktion ausgelöst wird, wird durch die ROLLBACK TRANSACTION-Anweisung ein Rollback für die gesamte Transaktion durchgeführt. Ein Trigger, der innerhalb eines Batches zur Durchführung einer ROLLBACK TRANSACTION-Anweisung ausge-führt wird, bricht die Ausführung des Batches ab; die nachfolgenden Anwei-sungen im Batch werden nicht ausgeführt.

� Sie sollten die Verwendung von ROLLBACK TRANSACTION im Trigger-code minimal halten oder ganz vermeiden. Mit dem Rollback einer Trans-aktion ergibt sich ein zusätzlicher Aufwand, da alle Arbeiten rückgängig gemacht werden müssen, die bis zu diesem Punkt in der Transaktion ausge-führt wurden. Dies hat einen negativen Einfluss auf die Leistung. Die Daten sollten daher außerhalb der Transaktion überprüft werden. Starten Sie die Transaktion erst dann, wenn die Überprüfung vollständig abgeschlossen ist.

� Der Benutzer, der den Trigger aufruft, muss außerdem berechtigt sein, alle Anweisungen für alle Tabellen auszuführen.

Page 571: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 11: Implementieren von Triggern 5

Verwendungsmöglichkeiten von Triggern

� Kaskadieren von Änderungen über verknüpfte Tabellen in einer Datenbank

� Durchsetzen einer komplexeren Datenintegrität als bei einer CHECK-Einschränkung

� Festlegen benutzerdefinierter Fehlermeldungen

� Verwalten nicht normalisierter Daten

� Statusvergleiche vor und nach dem Ändern von Daten

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Die beste Verwendungsmöglichkeit von Triggern liegt in der Sicherstellung der Datenintegrität auf der unteren Ebene, nicht im Zurückgeben von Abfrage-ergebnissen. Der Hauptvorteil von Triggern besteht darin, dass sie eine kom-plexe Verarbeitungslogik enthalten können. Mit Triggern können Änderungen über verknüpfte Tabellen in einer Datenbank kaskadiert werden, es kann eine weitaus komplexere Datenintegrität als mit einer CHECK-Einschränkung durchgesetzt werden, es können benutzerdefinierte Fehlermeldungen definiert werden, nicht normalisierte Daten können beibehalten werden, und es kann ein Statusvergleich vor und nach dem Ändern von Daten vorgenommen werden.

Kaskadieren von Änderungen über verknüpfte Tabellen in einer DatenbankSie können einen Trigger verwenden, um Aktualisierungen und Löschvorgänge über verknüpfte Tabellen in einer Datenbank zu kaskadieren. Mit einem DELETE-Trigger für die Products-Tabelle in der Northwind-Datenbank können beispielsweise übereinstimmende Zeilen in anderen Tabellen gelöscht werden, wenn diese Tabellen Zeilen enthalten, die mit den gelöschten Werten für ProductID übereinstimmen. Um diesen Vorgang durchzuführen, werden über den Trigger die Zeilen in der Order Details-Tabelle mit Hilfe der ProductID-Fremdschlüsselspalte lokalisiert.

Durchsetzen einer komplexeren Datenintegrität als bei einer CHECK-EinschränkungIm Gegensatz zu CHECK-Einschränkungen können Trigger auf Spalten in an-deren Tabellen verweisen. Beispielsweise können Sie einen INSERT-Trigger für die Order Details-Tabelle definieren, der die UnitsInStock-Spalte in der Products-Tabelle auf dieses Element überprüft. Mit dem Trigger könnte er-mittelt werden, dass die maximale Bestellmenge drei Einheiten beträgt, wenn der Wert von UnitsInStock kleiner als 10 ist. Diese Art der Prüfung verweist auf Spalten in anderen Tabellen. Der Verweis auf Spalten in anderen Tabellen ist in einer CHECK-Einschränkung nicht zulässig.

ThemaStellen Sie die Vorteile der Verwendung von Triggern vor.

EinstiegDas Verwenden von Triggern bietet mehrere Vorteile.

Methodischer Hinweis Weisen Sie darauf hin, dass mit Triggern Aktualisierun-gen und Löschvorgänge über verknüpfte Tabellen in einer Datenbank kaskadiert werden können.

Erwähnen Sie, dass viele Datenbanken, die mit früheren Versionen von SQL Server erstellt wurden, diesen Triggertyp enthalten.

Page 572: Programmieren Einer Microsoft SQL Server 2000-Datenbank

6 Unterrichtseinheit 11: Implementieren von Triggern

Mit Hilfe von Triggern können Sie eine komplexe referenzielle Integrität durch-setzen, indem Sie folgende Aufgaben ausführen:

� Durchführen von Aktionen oder Kaskadieren von Aktualisierungen oder Löschvorgängen. Eine referenzielle Integrität kann definiert werden, indem die Einschränkun-gen FOREIGN KEY und REFERENCE zusammen mit der CREATE TABLE-Anweisung verwendet werden. Trigger sind nützlich, um sicherzu-stellen, dass entsprechende Aktionen durchgeführt werden, wenn ein Kas-kadieren von Löschvorgängen oder Aktualisierungen erfolgen muss. Wenn Einschränkungen für die Triggertabelle vorhanden sind, werden diese vor der Ausführung des Triggers überprüft. Wenn Einschränkungen verletzt werden, wird der Trigger nicht ausgeführt.

� Erstellen mehrzeiliger Trigger. Wenn mehr als eine Zeile eingefügt, aktualisiert oder gelöscht wird, müssen Sie einen Trigger erstellen, der mehrere Zeilen verarbeiten kann.

� Durchsetzen einer referenziellen Integrität zwischen Datenbanken.

Festlegen benutzerdefinierter Fehlermeldungen Gelegentlich kann der Einsatz benutzerdefinierter Fehlermeldungen, die den Status einer Aktion anzeigen, für Ihre Implementation vorteilhaft sein. Mit Hil-fe von Triggern können Sie vordefinierte oder dynamische benutzerdefinierte Fehlermeldungen aufrufen, wenn bei der Ausführung eines Triggers bestimmte Umstände auftreten.

Verwalten nicht normalisierter Daten Trigger können verwendet werden, um die Datenintegrität auf der unteren Ebene in nicht normalisierten Datenbankumgebungen aufrechtzuerhalten. Das Verwalten nicht normalisierter Daten unterscheidet sich vom Kaskadieren darin, dass sich Kaskadieren normalerweise auf die Beibehaltung der Beziehun-gen zwischen primären und Fremdschlüsselwerten bezieht. Bei nicht normali-sierten Daten handelt es sich in der Regel um eigens erstellte, abgeleitete oder redundante Datenwerte. In den folgenden Fällen müssen Sie einen Trigger verwenden:

� Wenn für die referenzielle Integrität andere Aspekte als eine exakte Über-einstimmung erforderlich sind, z. B. das Verwalten abgeleiteter Daten (Ver-käufe in diesem Jahr) oder das Hinzufügen von Attributen zu Spalten (An-gabe von Y oder N, um anzuzeigen, ob ein Produkt verfügbar ist).

� Wenn Sie benutzerdefinierte Meldungen und komplexe Fehlermeldungen benötigen.

Redundante Daten und abgeleitete Daten verlangen in der Regel den Einsatz von Triggern. Anmerkung

Page 573: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 11: Implementieren von Triggern 7

Statusvergleiche vor und nach dem Ändern von Daten Die meisten Trigger bieten die Möglichkeit, auf die Änderungen zu verweisen, die über die Anweisungen INSERT, UPDATE oder DELETE an den Daten vorgenommen werden. Dies ermöglicht es Ihnen, auf die Zeilen zu verweisen, die von den Änderungsanweisungen innerhalb des Triggers betroffen sind.

Fehler im Rahmen von Einschränkungen, Regeln und Standard-werten können ausschließlich über standardisierte Systemfehlermeldungen aus-gegeben werden. Wenn die Anwendung benutzerdefinierte Meldungen erfordert (oder diese von Vorteil wären) und eine komplexere Fehlerbehandlung be-nötigt, müssen Sie einen Trigger verwenden.

Anmerkung

Page 574: Programmieren Einer Microsoft SQL Server 2000-Datenbank

8 Unterrichtseinheit 11: Implementieren von Triggern

Überlegungen zum Verwenden von Triggern

� Trigger sind reaktiv, Einschränkungen sind proaktiv

� Einschränkungen werden zuerst geprüft� Tabellen können mehrere Trigger für beliebige Aktionen

besitzen� Tabellenbesitzer können den ersten und letzten

auszulösenden Trigger angeben� Sie müssen über die Berechtigung zum Ausführen

sämtlicher in einer Triggerdefinition verwendeten Anweisungen verfügen

� Der Tabellenbesitzer kann keine AFTER-Trigger für Sichten oder temporäre Tabellen erstellen

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Beachten Sie bei der Arbeit mit Triggern die folgenden Aspekte und Richt-linien:

� Die meisten Trigger sind reaktiv, wohingegen Einschränkungen und der INSTEAD OF-Trigger proaktiv sind. Trigger werden ausgeführt, nachdem eine INSERT-, UPDATE- oder DELETE-Anweisung für die Tabelle, für die der Trigger definiert ist, durch-geführt wurde. Beim Aktualisieren einer Zeile in einer Tabelle durch eine UPDATE-Anweisung wird beispielsweise der Trigger für diese Tabelle automatisch ausgeführt. Einschränkungen werden vor der Ausführung einer INSERT-, UPDATE- oder DELETE-Anweisung überprüft.

� Einschränkungen werden zuerst geprüft. Wenn Einschränkungen für die Triggertabelle vorhanden sind, werden diese vor der Ausführung des Triggers überprüft. Wenn Einschränkungen verletzt werden, wird der Trigger nicht ausgeführt.

� Tabellen können mehrere Trigger für beliebige Aktionen besitzen. SQL Server 2000 ermöglicht das Schachteln von mehreren Triggern für eine einzelne Tabelle. Für eine Tabelle können mehrere Trigger definiert werden. Die einzelnen Trigger können so definiert werden, dass entweder eine ein-zelne Aktion oder mehrere Aktionen durchgeführt werden.

� Tabellenbesitzer können den ersten und letzten auszulösenden Trigger angeben.Wenn für eine Tabelle mehrere Trigger definiert wurden, kann der Tabellen-besitzer die gespeicherte Systemprozedur sp_settriggerorder verwenden, um den ersten und letzten auszulösenden Trigger anzugeben. Für die ver-bleibenden Trigger kann keine Auslösungsreihenfolge festgelegt werden.

ThemaErläutern Sie die verschie-denen Aspekte, die die Kursteilnehmer bei der Verwendung von Triggern berücksichtigen müssen.

EinstiegBeachten Sie bei der Arbeit mit Triggern die folgenden Aspekte und Richtlinien.

Methodischer Hinweis Achten Sie darauf, alle inder Aufzählung befindlichen Punkte zu besprechen, auch wenn nicht alle auf der Folie angezeigt werden.

Page 575: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 11: Implementieren von Triggern 9

� Sie müssen über die Berechtigung zum Ausführen sämtlicher in einer Triggerdefinition verwendeten Anweisungen verfügen. Nur der Tabellenbesitzer sowie Mitglieder der festen Serverrolle sysadmin und Mitglieder der festen Datenbankrollen db_owner und db_ddladmin können Trigger für diese Tabelle erstellen und löschen. Diese Berechtigun-gen sind nicht übertragbar. Darüber hinaus muss der Ersteller des Triggers ebenfalls über die Berechti-gung zum Ausführen aller Anweisungen für sämtliche betroffenen Tabellen verfügen. Wenn Berechtigungen für einen Teil der Transact-SQL-Anwei-sungen innerhalb des Triggers verweigert werden, wird ein Rollback für die gesamte Transaktion ausgeführt.

� Tabellenbesitzer können keine AFTER-Trigger für Sichten oder temporäre Tabellen erstellen. Trigger können jedoch auf Sichten und temporäre Tabellen verweisen.

� Der Tabellenbesitzer kann INSTEAD OF-Trigger für Sichten und Tabellen erstellen; in diesem Fall werden die Aktualisierungstypen, die von einer Sicht unterstützt werden, von den INSTEAD OF-Triggern erheblich erweitert.

� Trigger sollten nicht zur Ausgabe von Resultsets verwendet werden. Trigger enthalten Transact-SQL-Anweisungen in einer Weise, die mit der von gespeicherten Prozeduren vergleichbar ist. Wie gespeicherte Proze-duren können auch Trigger Anweisungen enthalten, die ein Resultset zurückgeben. Das Einschließen von Anweisungen in Triggern, durch die Werte ausgegeben werden, wird jedoch nicht empfohlen, da die Ausgabe eines Resultsets bei der Ausführung einer UPDATE-, INSERT- oder DELETE-Anweisung von Benutzern und Entwicklern nicht erwartet wird.

� Trigger können mehrzeilige Aktionen verarbeiten. Eine INSERT-, UPDATE- oder DELETE-Aktion, durch die ein Trigger ausgelöst wird, kann mehrere Zeilen betreffen. Sie können einen der folgenden Schritte ausführen:

• Gleichzeitiges Verarbeiten sämtlicher Zeilen. In diesem Fall müssen alle betroffenen Zeilen den Triggerkriterien entsprechen, damit eine Aktion stattfinden kann.

• Zulassen bedingter Aktionen. Wenn Sie beispielsweise drei Kunden aus der Customers-Tabelle löschen möchten, können Sie einen Trigger definieren, um sicherzu-stellen, dass zu den einzelnen gelöschten Kunden keine aktiven Bestel-lungen oder offenen Rechnungen vorhanden sind. Wenn für einen der drei Kunden eine offene Rechnung vorhanden ist, wird dieser Kunde nicht gelöscht. Die anderen beiden Kunden, die die Voraussetzungen erfüllen, werden jedoch gelöscht.

Mit Hilfe der Systemfunktion @@ROWCOUNT können Sie ermitteln, ob mehrere Zeilen betroffen sind.

Methodischer Hinweis Erinnern Sie die Kursteil-nehmer daran, dass Trigger keine Resultsets ausgeben oder Parameter übergeben können.

Page 576: Programmieren Einer Microsoft SQL Server 2000-Datenbank

10 Unterrichtseinheit 11: Implementieren von Triggern

���� Definieren von Triggern

� Erstellen von Triggern

� Ändern und Löschen von Triggern

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

In diesem Abschnitt wird das Erstellen, Ändern und Löschen von Triggern behandelt. Darüber hinaus werden die erforderlichen Berechtigungen sowie die Richtlinien besprochen, die beim Definieren von Triggern berücksichtigt werden müssen.

ThemaStellen Sie die Themen vor, die in diesem Abschnitt behandelt werden: Erstellen, Ändern und Löschen von Triggern.

EinstiegDa Sie jetzt wissen, was Trigger sind, befassen wir uns nun mit dem Erstellen, Ändern und Löschen von Triggern.

Page 577: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 11: Implementieren von Triggern 11

Erstellen von Triggern

� Entsprechende Berechtigungen sind erforderlich

� Bestimmte Anweisungen können nicht verwendet werden

Use NorthwindGOCREATE TRIGGER Empl_Delete ON EmployeesFOR DELETE ASIF (SELECT COUNT(*) FROM Deleted) > 1BEGIN

RAISERROR('You cannot delete more than one employee at a time.', 16, 1)

ROLLBACK TRANSACTIONEND

Use NorthwindGOCREATE TRIGGER Empl_Delete ON EmployeesFOR DELETE ASIF (SELECT COUNT(*) FROM Deleted) > 1BEGIN

RAISERROR('You cannot delete more than one employee at a time.', 16, 1)

ROLLBACK TRANSACTIONEND

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Erstellen Sie Trigger mit Hilfe der CREATE TRIGGER-Anweisung. In der Anweisung wird die Tabelle angegeben, für die der Trigger definiert wird, die Ereignisse, bei denen der Trigger ausgeführt wird, und die besonderen Anweisungen für den Trigger.

CREATE TRIGGER [owner.] trigger_nameON [owner.] table_name [WITH ENCRYPTION] {FOR | AFTER | INSTEAD OF} {INSERT | UPDATE | DELETE} AS[IF UPDATE (column_name)...] [{AND | OR} UPDATE (column_name)...]

sql_statements}

Wenn eine FOR UPDATE-Aktion angegeben wird, kann die Aktion mit Hilfe der IF UPDATE (column_name)-Klausel auf eine bestimmte Spalte gerichtet werden, die aktualisiert wird.

Sowohl FOR als auch AFTER sind äquivalente Syntaxelemente, mit denen der gleiche Triggertyp erstellt wird, der nach der initialisierenden Aktion (INSERT, UPDATE oder DELETE) ausgelöst wird.

Mit INSTEAD OF-Triggern wird die Triggeraktion abgebrochen und statt-dessen eine neue Funktion ausgeführt.

Beim Erstellen eines Triggers werden Informationen über den Trigger in die Systemtabellen sysobjects und syscomments eingefügt. Wird ein Trigger erstellt, der denselben Namen wie ein bereits vorhandener Trigger besitzt, wird der vorhandene Trigger durch den neuen Trigger überschrieben.

Das Hinzufügen benutzerdefinierter Trigger in Systemtabellen wird von SQL Server nicht unterstützt. Sie können daher keine Trigger für Systemtabellen erstellen.

ThemaStellen Sie die CREATE TRIGGER-Syntax vor.

EinstiegBeachten Sie beim Erstellen von Triggern diese Aspekte und Richtlinien.

Syntax

Anmerkung

Page 578: Programmieren Einer Microsoft SQL Server 2000-Datenbank

12 Unterrichtseinheit 11: Implementieren von Triggern

Entsprechende Berechtigungen sind erforderlich Tabellenbesitzer und Mitglieder der Rollen db_owner und sysadmin besitzen die Berechtigung zum Erstellen von Triggern.

Um Situationen zu vermeiden, in denen der Besitzer einer Sicht und der Besitzer einer zugrunde liegenden Tabelle nicht identisch sind, wird empfohlen, dass der dbo-Benutzer sämtliche Objekte in einer Datenbank besitzt. Da ein Benutzer Mitglied mehrerer Rollen sein kann, geben Sie beim Erstellen des Objekts immer den dbo-Benutzer als Besitzername an. Andernfalls wird beim Erstellen des Objekts Ihr Benutzername als Besitzer festgelegt.

Bestimmte Anweisungen können nicht verwendet werden Unter SQL Server sind die folgenden Anweisungen in einer Triggerdefinition nicht zulässig:

� ALTER DATABASE � CREATE DATABASE � DISK INIT � DISK RESIZE � DROP DATABASE � LOAD DATABASE � LOAD LOG � RECONFIGURE � RESTORE DATABASE � RESTORE LOG

Um zu ermitteln, für welche Tabellen Trigger vorhanden sind, führen Sie die gespeicherte Systemprozedur sp_depends <tablename> aus. Um eine Trigger-definition anzuzeigen, führen Sie die gespeicherte Systemprozedur sp_helptext<triggername> aus. Um zu ermitteln, welche Trigger für eine bestimmte Tabelle vorhanden sind, und um deren Aktionen anzuzeigen, führen Sie die gespeicherte Systemprozedur sp_helptrigger <tablename> aus.

Page 579: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 11: Implementieren von Triggern 13

Im folgenden Beispiel wird ein Trigger für die Employees-Tabelle erstellt, der verhindert, dass Benutzer mehr als einen Mitarbeiter gleichzeitig löschen. Der Trigger wird jedes Mal ausgelöst, wenn ein Datensatz oder eine Datensatz-gruppe aus der Tabelle gelöscht wird. Der Trigger prüft die Anzahl der zu löschenden Datensätze, indem er die Deleted-Tabelle abfragt. Wenn mehr als ein Datensatz gelöscht werden soll, gibt der Trigger eine benutzerdefinierte Fehlermeldung aus und führt ein Rollback der Transaktion durch.

Use Northwind GO

CREATE TRIGGER Empl_Delete ON NewEmployees FOR DELETE ASIF (SELECT COUNT(*) FROM Deleted) > 1 BEGIN RAISERROR( 'You cannot delete more than one employee at a time.', 16, 1) ROLLBACK TRANSACTION END

Die folgende DELETE-Anweisung löst den Trigger aus und verhindert die Transaktion.

DELETE FROM Employees WHERE EmployeeID > 6

Die folgende DELETE-Anweisung löst den Trigger aus und ermöglicht die Transaktion.

DELETE FROM Employees WHERE EmployeeID = 6

Beispiel

Page 580: Programmieren Einer Microsoft SQL Server 2000-Datenbank

14 Unterrichtseinheit 11: Implementieren von Triggern

Ändern und Löschen von Triggern

� Ändern eines Triggers� Ändern der Definition ohne Löschen des Triggers� Deaktivieren und Aktivieren eines Triggers

� Löschen eines Triggers

USE NorthwindGOALTER TRIGGER Empl_Delete ON EmployeesFOR DELETE ASIF (SELECT COUNT(*) FROM Deleted) > 6BEGIN

RAISERROR('You cannot delete more than six employees at a time.', 16, 1)ROLLBACK TRANSACTION

END

USE NorthwindGOALTER TRIGGER Empl_Delete ON EmployeesFOR DELETE ASIF (SELECT COUNT(*) FROM Deleted) > 6BEGIN

RAISERROR('You cannot delete more than six employees at a time.', 16, 1)ROLLBACK TRANSACTION

END

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Sie können einen Trigger ändern oder löschen.

Ändern eines Triggers Wenn Sie die Definition eines vorhandenen Triggers ändern müssen, können Sie diese ändern, ohne den Trigger zu löschen.

Ändern der Definition ohne Löschen des Triggers Das Ändern der Definition ersetzt die Definition des vorhandenen Triggers durch die neue Definition. Die durch den Trigger ausgelöste Aktion kann eben-falls geändert werden. Wenn Sie beispielsweise einen Trigger für INSERT erstellen und dann die Aktion in UPDATE ändern, wird der geänderte Trigger bei jeder Aktualisierung der Tabelle ausgeführt.

Mit der verzögerten Namensauflösung können Sie Verweise auf Tabellen und Sichten in einem Trigger erstellen, die noch nicht existieren. Wenn das Objekt bei der Erstellung eines Triggers noch nicht vorhanden ist, wird eine Warnmel-dung ausgegeben und die Triggerdefinition von SQL Server sofort aktualisiert.

ALTER TRIGGER trigger_nameON table[WITH ENCRYPTION] {{FOR {[,] [DELETE] [,] [UPDATE] [,][INSERT]} [NOT FOR REPLICATION] ASsql_statement [...n] } |{FOR {[,] [INSERT] [,] [UPDATE]} [NOT FOR REPLICATION] ASIF UPDATE (column)[{AND | OR} UPDATE (column) [,...n]]sql_statement [...n] } }

ThemaStellen Sie das Konzept zum Ändern eines Triggers vor.

EinstiegWenn Sie die Definition eines vorhandenen Triggers ändern müssen, können Sie diese ändern, ohne den Trigger zu löschen.

Syntax

Page 581: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 11: Implementieren von Triggern 15

In diesem Beispiel wird der im vorherigen Beispiel erstellte DELETE-Trigger geändert. Der Triggerinhalt wird dahingehend geändert, dass der Grenzwert für zu löschende Datensätze von einen auf sechs Datensätze heraufgesetzt wird.

Use Northwind GO

ALTER TRIGGER Empl_Delete ON Employees FOR DELETE ASIF (SELECT COUNT(*) FROM Deleted) > 6 BEGIN RAISERROR( 'You cannot delete more than six employees at a time.', 16, 1) ROLLBACK TRANSACTION END

Deaktivieren und Aktivieren eines Triggers Sie können einen bestimmten Trigger oder sämtliche Trigger für eine Tabelle deaktivieren oder aktivieren. Wenn ein Trigger deaktiviert ist, ist dieser immer noch für die Tabelle definiert. Wenn jedoch eine INSERT-, UPDATE- oder DELETE-Anweisung für die Tabelle durchgeführt wird, werden die Aktionen im Trigger nicht ausgeführt, es sei denn, der Trigger wird wieder aktiviert.

Sie können Trigger über die ALTER TABLE-Anweisung aktivieren bzw. deaktivieren.

ALTER TABLE table {ENABLE | DISABLE} TRIGGER {ALL | trigger_name[,…n]}

Löschen eines Triggers Sie können einen Trigger entfernen, indem Sie ihn löschen. Trigger werden automatisch gelöscht, wenn die mit dem Trigger verknüpften Tabellen gelöscht werden.

Die Berechtigung zum Löschen eines Triggers ist standardmäßig dem Tabellen-besitzer zugewiesen und ist nicht übertragbar. Mitglieder der Rollen sysadminund db_owner können jedoch durch Angabe des Besitzers in der DROP TRIGGER-Anweisung jedes beliebige Objekt löschen.

DROP TRIGGER trigger_name

Beispiel

Teilsyntax

Syntax

Page 582: Programmieren Einer Microsoft SQL Server 2000-Datenbank

16 Unterrichtseinheit 11: Implementieren von Triggern

���� Funktionsweise von Triggern

� Funktionsweise eines INSERT-Triggers

� Funktionsweise eines DELETE-Triggers

� Funktionsweise eines UPDATE-Triggers

� Funktionsweise eines INSTEAD OF-Triggers

� Funktionsweise von geschachtelten Triggern

� Rekursive Trigger

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Wenn Sie sich mit dem Entwerfen von Triggern befassen, sollten Sie unbedingt Kenntnisse über deren Funktionsweise besitzen. In diesem Abschnitt werden INSERT-, DELETE-, UPDATE-, INSTEAD OF-, geschachtelte und rekursive Trigger erläutert.

ThemaGeben Sie eine Einführung in die Funktionsweise von Triggern.

EinstiegSchauen wir uns nun an, wie die verschiedenen Triggertypen funktionieren.

Page 583: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 11: Implementieren von Triggern 17

Funktionsweise eines INSERT-Triggers INSERT-Anweisung für eine Tabelle, für die ein INSERT-Triggerdefiniert ist

INSERT [Order Details] VALUES(10525, 2, 19.00, 5, 0.2)

INSERT [Order Details] VALUES(10525, 2, 19.00, 5, 0.2)

Order DetailsOrder DetailsOrder DetailsOrderIDOrderID

105221052310524

105221052310524

ProductIDProductID

10417

10417

UnitPriceUnitPrice

31.009.6530.00

31.009.6530.00

QuantityQuantity

79

24

79

24

DiscountDiscount

0.20.150.0

0.20.150.0

519.002 0.210523

Protokollierte INSERT-Anweisung

insertedinsertedinserted

1052310523 22 19.0019.00 55 0.20.2

Ausgeführte Triggeraktionen

Order DetailsOrder DetailsOrder DetailsOrderIDOrderID

105221052310524

105221052310524

ProductIDProductID

10417

10417

UnitPriceUnitPrice

31.009.6530.00

31.009.6530.00

QuantityQuantity

79

24

79

24

DiscountDiscount

0.20.150.0

0.20.150.0

519.002 0.210523

Trigger Code:USE NorthwindCREATE TRIGGER OrdDet_InsertON [Order Details]FOR INSERTASUPDATE P SET UnitsInStock = (P.UnitsInStock – I.Quantity)FROM Products AS P INNER JOIN Inserted AS ION P.ProductID = I.ProductID

Trigger Code:USE NorthwindCREATE TRIGGER OrdDet_InsertON [Order Details]FOR INSERTASUPDATE P SET UnitsInStock = (P.UnitsInStock – I.Quantity)FROM Products AS P INNER JOIN Inserted AS ION P.ProductID = I.ProductID

UPDATE P SET UnitsInStock = (P.UnitsInStock – I.Quantity)FROM Products AS P INNER JOIN Inserted AS ION P.ProductID = I.ProductID

ProductsProductsProductsProductIDProductID UnitsInStockUnitsInStock …… ……

1234

1234

15106520

15106520

2 15

INSERT-Anweisung für eine Tabelle, für die einINSERT-Trigger definiert ist

Protokollierte INSERT-Anweisung

Ausgeführte Triggeraktionen

111

222

333

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Sie können einen Trigger so definieren, dass dieser ausgeführt wird, sobald Daten durch eine INSERT-Anweisung in eine Tabelle eingefügt werden.

Wenn ein INSERT-Trigger ausgelöst wird, werden sowohl der Triggertabelle als auch der inserted-Tabelle neue Zeilen hinzugefügt. Die inserted-Tabelle ist eine logische Tabelle, die eine Kopie der eingefügten Zeilen enthält. Die inserted-Tabelle enthält die protokollierten Einfügeaktionen der INSERT-Anweisung. Mit dieser Tabelle können Sie auf protokollierte Daten der ge-starteten INSERT-Anweisung verweisen. Durch den Trigger kann die inserted-Tabelle überprüft werden, um zu ermitteln, ob bzw. wie die Triggeraktionen ausgeführt werden sollten. Die Zeilen in der inserted-Tabelle sind immer Duplikate einer oder mehrerer Zeilen in der Triggertabelle.

Sämtliche Aktivitäten im Rahmen von Datenänderungen (INSERT-, UPDATE- und DELETE-Anweisungen) werden protokolliert, die Informationen im Trans-aktionsprotokoll können jedoch nicht gelesen werden. Die inserted-Tabelle ermöglicht es Ihnen jedoch, auf die durch die INSERT-Anweisung verursachten protokollierten Änderungen zu verweisen. Anschließend können Sie die Ände-rungen mit den eingefügten Daten vergleichen, um diese zu überprüfen bzw. weitere Maßnahmen zu ergreifen. Sie können auch auf eingefügte Daten ver-weisen, ohne dass die Informationen in Variablen gespeichert sein müssen.

ThemaGeben Sie ein Beispiel für einen INSERT-Trigger.

EinstiegEin INSERT-Trigger wird bei dem Versuch aufgerufen, eine Zeile in eine Tabelle einzufügen, die durch einen Trigger geschützt wird.

Alle Einfügungen werden, wie in dieser Folie dar-gestellt, in einer speziellen inserted-Tabelle gespei-chert.

Methodischer Hinweis Zeigen Sie den Kursteilneh-mern, wie CREATE TRIGGER-Anweisungen schnell gelesen werden können, um den Trigger-namen, die Tabelle und die Aktion festzustellen. Der gesamte Text unter der AS-Anweisung stellt die Aktion dar, die vom Trigger ausgeführt wird.

Page 584: Programmieren Einer Microsoft SQL Server 2000-Datenbank

18 Unterrichtseinheit 11: Implementieren von Triggern

Der Trigger in diesem Beispiel wurde erstellt, um eine Spalte (UnitsInStock) in der Products-Tabelle immer dann zu aktualisieren, wenn ein Produkt bestellt wird (immer wenn ein Datensatz in die Order Details-Tabelle eingefügt wird). Der neue Wert wird auf den vorherigen Wert abzüglich der Bestellmenge festgelegt.

USE Northwind GOCREATE TRIGGER OrdDet_Insert ON [Order Details] FOR INSERT ASUPDATE P SET UnitsInStock = (P.UnitsInStock – I.Quantity) FROM Products AS P INNER JOIN Inserted AS I ON P.ProductID = I.ProductID

Beispiel

Page 585: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 11: Implementieren von Triggern 19

Funktionsweise eines DELETE-Triggers DELETE-Anweisung für eine Tabelle, für die eine DELETE-Anweisung definiert ist

DeletedDeletedDeleted44 Dairy ProductsDairy Products CheesesCheeses 0x15…0x15…

Protokollierte DELETE-Anweisung

CategoriesCategoriesCategoriesCategoryIDCategoryID

123

123

CategoryNameCategoryName

BeveragesCondimentsConfections

BeveragesCondimentsConfections

DescriptionDescription

Soft drinks, coffees…Sweet and savory …Desserts, candies, …

Soft drinks, coffees…Sweet and savory …Desserts, candies, …

PicturePicture

0x15…0x15…0x15…

0x15…0x15…0x15…0x15…CheesesDairy Products4

DELETE CategoriesWHERE CategoryID = 4

DELETE CategoriesWHERE CategoryID = 4

USE NorthwindCREATE TRIGGER Category_Delete

ON CategoriesFOR DELETE

ASUPDATE P SET Discontinued = 1FROM Products AS P INNER JOIN deleted AS dON P.CategoryID = d.CategoryID

USE NorthwindCREATE TRIGGER Category_Delete

ON CategoriesFOR DELETE

ASUPDATE P SET Discontinued = 1FROM Products AS P INNER JOIN deleted AS dON P.CategoryID = d.CategoryID

ProductsProductsProductsProductIDProductID DiscontinuedDiscontinued …… ……

1234

1234

0000

0000

Ausgeführte Triggeraktionen

2 1

UPDATE P SET Discontinued = 1FROM Products AS P INNER JOIN deleted AS dON P.CategoryID = d.CategoryID

DELETE-Anweisung für eine Tabelle, für die eine DELETE-Anweisung definiert ist

Protokollierte DELETE-Anweisung

Ausgeführte Triggeraktionen

111

222

333

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Wenn ein DELETE-Trigger ausgelöst wird, werden die aus der betroffenen Tabelle gelöschten Zeilen in einer speziellen deleted-Tabelle gespeichert. Die deleted-Tabelle ist eine logische Tabelle, die eine Kopie der gelöschten Zeilen enthält. Mit dieser Tabelle können Sie auf protokollierte Daten der gestarteten DELETE-Anweisung verweisen.

Beachten Sie bei der Verwendung des DELETE-Triggers die folgenden Aspekte:

� Wenn eine Zeile an die deleted-Tabelle angehängt wird, ist diese nicht mehr in der Datenbanktabelle vorhanden. Daher besitzen die deleted-Tabelle und die Datenbanktabellen keine gemeinsamen Zeilen.

� Für die Erstellung der deleted-Tabelle wird freier Speicherplatz aus dem Arbeitsspeicher reserviert. Die deleted-Tabelle ist immer im Cache ge-speichert.

� Ein Trigger, der für eine DELETE-Aktion definiert ist, wird nicht für die TRUNCATE TABLE-Anweisung ausgeführt, da TRUNCATE TABLE nicht protokolliert wird.

ThemaGeben Sie ein Beispiel für einen DELETE-Trigger.

EinstiegEin DELETE-Trigger wird bei dem Versuch aufge-rufen, Informationen aus der Tabelle, für die der Trigger definiert ist, zu löschen.

Wenn Zeilen aus einer Tabelle gelöscht werden, werden diese, wie in dieser Folie dargestellt, in einer speziellen deleted-Tabelle gespeichert.

Page 586: Programmieren Einer Microsoft SQL Server 2000-Datenbank

20 Unterrichtseinheit 11: Implementieren von Triggern

Der Trigger in diesem Beispiel wurde erstellt, um die Discontinued-Spalte in der Products-Tabelle immer dann zu aktualisieren, wenn eine Kategorie ge-löscht wird (immer wenn ein Datensatz aus der Categories-Tabelle gelöscht wird). Alle betroffenen Produkte werden als 1 markiert, um anzuzeigen, dass sie nicht weiter geführt werden.

USE Northwind GOCREATE TRIGGER Category_Delete ON Categories FOR DELETE AS UPDATE P SET Discontinued = 1 FROM Products AS P INNER JOIN deleted AS d ON P.CategoryID = d.CategoryID

Beispiel

Page 587: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 11: Implementieren von Triggern 21

Funktionsweise eines UPDATE-Triggers

UPDATE-Anweisung für eine Tabelle, für die ein UPDATE-Trigger definiert ist

UPDATE EmployeesSET EmployeeID = 17WHERE EmployeeID = 2

UPDATE EmployeesSET EmployeeID = 17WHERE EmployeeID = 2

UPDATE-Anweisung als INSERT- und DELETE-Anweisung protokolliert

EmployeesEmployeesEmployeesEmployeeIDEmployeeID LastNameLastName FirstNameFirstName TitleTitle HireDateHireDate

1234

1234

DavolioBarrLeverlingPeacock

DavolioBarrLeverlingPeacock

NancyAndrewJanetMargaret

NancyAndrewJanetMargaret

Sales Rep.RSales Rep.Sales Rep.

Sales Rep.RSales Rep.Sales Rep.

~~~~~~~~~~~~

~~~~~~~~~~~~

2 Fuller Andrew Vice Pres. ~~~

insertedinsertedinserted1717 FullerFuller AndrewAndrew Vice Pres.Vice Pres. ~~~~~~

deleteddeleteddeleted22 FullerFuller AndrewAndrew Vice Pres.Vice Pres. ~~~~~~

Ausführen der TriggeraktionenUSE NorthwindGOCREATE TRIGGER Employee_UpdateON EmployeesFOR UPDATEASIF UPDATE (EmployeeID)BEGIN TRANSACTIONRAISERROR ('Transaction cannot be processed.\***** Employee ID number cannot be modified.', 10, 1)ROLLBACK TRANSACTION

USE NorthwindGOCREATE TRIGGER Employee_UpdateON EmployeesFOR UPDATEASIF UPDATE (EmployeeID)BEGIN TRANSACTIONRAISERROR ('Transaction cannot be processed.\***** Employee ID number cannot be modified.', 10, 1)ROLLBACK TRANSACTION

ASIF UPDATE (EmployeeID)BEGIN TRANSACTIONRAISERROR ('Transaction cannot be processed.\***** Employee ID number cannot be modified.', 10, 1)ROLLBACK TRANSACTION

Transaction cannot be processed.***** Member number cannot be modifiedTransaction cannot be processed.***** Member number cannot be modified

EmployeesEmployeesEmployeesEmployeeIDEmployeeID LastNameLastName FirstNameFirstName TitleTitle HireDateHireDate

1234

1234

DavolioBarrLeverlingPeacock

DavolioBarrLeverlingPeacock

NancyAndrewJanetMargaret

NancyAndrewJanetMargaret

Sales Rep.RSales Rep.Sales Rep.

Sales Rep.RSales Rep.Sales Rep.

~~~~~~~~~~~~

~~~~~~~~~~~~

2 Fuller Andrew Vice Pres. ~~~

UPDATE-Anweisung für eine Tabelle, für die ein UPDATE-Trigger definiert ist

UPDATE-Anweisung als INSERT- und DELETE-Anweisung protokolliert

Ausführen der Triggeraktionen

111

222

333

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Eine UPDATE-Anweisung kann als aus zwei Schritten bestehend betrachtet werden: der DELETE-Schritt, mit dem das Abbild der Daten vor der Aktion aufgezeichnet wird, und der INSERT-Schritt, mit dem das Abbild der Daten nach der Aktion aufgezeichnet wird. Wenn eine UPDATE-Anweisung für eine Tabelle ausgeführt wird, für die ein Trigger definiert ist, werden die ursprüng-lichen Zeilen (Abbild vor der Aktion) in die deleted-Tabelle und die aktuali-sierten Zeilen (Abbild nach der Aktion) in die inserted-Tabelle eingefügt.

Durch den Trigger können sowohl die Tabellen deleted und inserted als auch die aktualisierte Tabelle überprüft werden, um zu ermitteln, ob mehrere Zeilen aktualisiert wurden und wie die Triggeraktionen durchgeführt werden sollten.

Mit Hilfe einer IF UPDATE-Anweisung können Sie einen Trigger definieren, um Datenaktualisierungen einer bestimmte Spalte zu überwachen. Mit dem Trigger kann so die Aktivität im Zusammenhang mit einer bestimmten Spalte auf einfache Weise isoliert werden. Wenn der Trigger feststellt, dass die spe-zielle Spalte aktualisiert wurde, kann dieser geeignete Aktionen veranlassen, wie z. B. die Ausgabe einer Warnmeldung, die darauf aufmerksam macht, dass die Spalte nicht aktualisiert werden kann, oder die Verarbeitung einer Reihe von Anweisungen basierend auf dem neu aktualisierten Spaltenwert.

IF UPDATE (<column_name>)

ThemaGeben Sie ein Beispiel für einen UPDATE-Trigger.

EinstiegEin Trigger, der für eine UPDATE-Anweisung defi-niert ist, wird bei dem Ver-such aufgerufen, Daten in einer Tabelle, für die der Trigger definiert ist, zu aktualisieren.

Einstieg (Fortsetzung)Durch eine UPDATE-Anwei-sung wird, wie in dieser Fo-lie dargestellt, die ursprüng-liche Zeile in die deleted-Tabelle verschoben und die aktualisierte Zeile in die inserted-Tabelle eingefügt.

Syntax

Page 588: Programmieren Einer Microsoft SQL Server 2000-Datenbank

22 Unterrichtseinheit 11: Implementieren von Triggern

In diesem Beispiel wird verhindert, dass ein Benutzer die EmployeeID-Spalte in der Employees-Tabelle ändert.

USE Northwind GOCREATE TRIGGER Employee_Update ON Employees FOR UPDATE ASIF UPDATE (EmployeeID) BEGIN TRANSACTION RAISERROR ('Transaction cannot be processed.\ ***** Employee ID number cannot be modified.', 10, 1) ROLLBACK TRANSACTION

Beispiel 1

Methodischer Hinweis Der umgekehrte Schräg-strich (\) in der RAISERROR-Anweisung ist ein Fortsetzungszeichen, das es ermöglicht, den gesamten Text der Fehler-meldung in einer Zeile anzuzeigen.

Page 589: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 11: Implementieren von Triggern 23

Funktionsweise eines INSTEAD OF-Triggers

Erstellen einer Sicht, die zwei oder mehr Tabellen verbindet

CREATE VIEW Customers ASSELECT * FROM CustomersMexUNIONSELECT * FROM CustomersGer

CREATE VIEW Customers ASSELECT * FROM CustomersMex

UNIONSELECT * FROM CustomersGer

CustomersMexCustomersMexCustomersMexCustomerIDCustomerID CompanyNameCompanyName CountryCountry PhonePhone ……

ANATRANTONCENTC

ANATRANTONCENTC

Ana Trujill…Antonio M…Centro Co…

Ana Trujill…Antonio M…Centro Co…

MexicoMexicoMexico

MexicoMexicoMexico

(5) 555-4729(5) 555-3932(5) 555-3392

(5) 555-4729(5) 555-3932(5) 555-3392

~~~~~~~~~

~~~~~~~~~

CustomersGerCustomersGerCustomersGerCustomerIDCustomerID CompanyNameCompanyName CountryCountry PhonePhone ……

ALFKIBLAUSDRACD

ALFKIBLAUSDRACD

Alfreds Fu…Blauer Se…Drachenb…

Alfreds Fu…Blauer Se…Drachenb…

GermanyGermanyGermany

GermanyGermanyGermany

030-00743210621-084600241-039123

030-00743210621-084600241-039123

~~~~~~~~~

~~~~~~~~~

INSTEAD OF-Trigger übergibt die Aktualisierung der Ursprungs-tabelle

CustomersCustomersCustomersCustomerIDCustomerID CompanyNameCompanyName CountryCountry PhonePhone ……

ALFKIANATRANTON

ALFKIANATRANTON

Alfreds Fu…Ana Trujill…Antonio M…

Alfreds Fu…Ana Trujill…Antonio M…

GermanyMexicoMexico

GermanyMexicoMexico

030-0074321(5) 555-4729(5) 555-3932

030-0074321(5) 555-4729(5) 555-3932

~~~~~~~~~

~~~~~~~~~

In der Sicht Customers ist das urprünglich Eingefügte nicht zu sehen

UPDATE wird für die Sicht erstellt

ALFKI Alfreds Fu… Germany 030-0074321 ~~~

ALFKI Alfreds Fu… Germany 030-0074321 ~~~

INSTEAD OF-Trigger können auf einer Tabelle odereiner Sicht definiert sein

Die den Trigger auslösende Aktion ist nicht zu sehen

Aktualisierungen sind auf Sichten möglich, die vorhernicht aktualisierbar waren

111

222

333

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Sie können einen INSTEAD OF-Trigger sowohl für Tabellen als auch für Sichten angeben. Dieser Trigger wird dann anstelle der ursprünglichen Trigger-aktion ausgeführt. Mit INSTEAD OF-Triggern wird die Anzahl der Aktualisie-rungstypen erhöht, die Sie für eine Sicht ausführen können. Jede Tabelle oder Sicht ist auf einen INSTEAD OF-Trigger für jede Triggeraktion (INSERT, UPDATE oder DELETE) beschränkt.

Sie können keinen INSTEAD OF-Trigger für Sichten erstellen, für die WITH CHECK OPTION definiert wurde.

ThemaGeben Sie ein Beispiel für einen INSTEAD OF-Trigger.

EinstiegMit einem INSTEAD OF-Trigger wird die ursprüng-liche Triggeraktion abge-brochen und stattdessen eine eigene Funktion aus-geführt.

KernpunkteVergleichen Sie einen INSTEAD OF-Trigger mit einem AFTER-Trigger.

Weisen Sie darauf hin, dass bei Verwendung eines INSTEAD OF-Triggers die ursprüngliche Triggeraktion (INSERT, UPDATE oder DELETE) nicht ausgeführt wird. Beachten Sie, dass Sie einen INSTEAD OF-Trigger für Tabellen und Sichten definieren können.

Page 590: Programmieren Einer Microsoft SQL Server 2000-Datenbank

24 Unterrichtseinheit 11: Implementieren von Triggern

In diesem Beispiel wird eine Tabelle mit Kunden in Deutschland und eine Tabelle mit Kunden in Mexiko erstellt. Ein für die Sicht definierter INSTEAD OF-Trigger leitet Aktualisierungen in die entsprechende zugrunde liegende Tabelle um. Die Einfügung in der CustomersGer-Tabelle erfolgt also anstelle(INSTEAD OF) der Einfügung in der Sicht.

Erstellen Sie zwei Tabellen mit Kundendaten:

SELECT * INTO CustomersGer FROM Customers WHERE Customers.Country = 'Germany' SELECT * INTO CustomersMex FROM Customers WHERE Customers.Country = 'Mexico' GO

Erstellen Sie eine Sicht dieser Daten:

CREATE VIEW CustomersView AS SELECT * FROM CustomersGer UNIONSELECT * FROM CustomersMex GO

Erstellen Sie einen INSTEAD OF-Trigger für die Sicht:

CREATE TRIGGER Customers_Update2 ON CustomersView INSTEAD OF UPDATE AS DECLARE @Country nvarchar(15) SET @Country = (SELECT Country FROM Inserted) IF @Country = 'Germany' BEGIN UPDATE CustomersGer SET CustomersGer.Phone = Inserted.Phone FROM CustomersGer JOIN Inserted ON CustomersGer.CustomerID = Inserted.CustomerID END ELSE IF @Country = 'Mexico' BEGIN UPDATE CustomersMex SET CustomersMex.Phone = Inserted.Phone FROM CustomersMex JOIN Inserted ON CustomersMex.CustomerID = Inserted.CustomerID END

Testen Sie den Trigger, indem Sie die Sicht aktualisieren:

UPDATE CustomersView SET Phone = ' 030-007xxxx' WHERE CustomerID = 'ALFKI' SELECT CustomerID, Phone FROM CustomersView WHERE CustomerID = 'ALFKI' SELECT CustomerID, Phone FROM CustomersGer WHERE CustomerID = 'ALFKI'

Beispiel

Methodischer Hinweis In diesem Beispiel werden die Tabellen CustomersGer und CustomersMex undanschließend wird eine Sicht mit Namen CustomersView erstellt.

Zeigen Sie, wie Aktualisie-rungen der Sicht fehlschla-gen. Erstellen Sie dann den Trigger, und zeigen Sie, wie die Aktualisierung durch den Trigger umgeleitet wird.

Wenn Kursteilnehmer fragen, warum dieses Skript scheinbar CustomersView aktualisiert hat, weisen Sie darauf hin, dass die Infor-mationen in der Sicht aus der CustomersGer-Tabelle stammen.

Page 591: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 11: Implementieren von Triggern 25

Funktionsweise von geschachtelten Triggern

UnitsInStock + UnitsOnOrder ist < ReorderLevel für ProductID 2

OrDe_UpdateOrDe_Update

Eingang einer Bestellung löst den OrDe_Update-Trigger aus

Führt eine UPDATE-Anweisung auf der Products-Tabelle aus

InStock_UpdateInStock_Update ProductsProductsProductsProductIDProductID UnitsInStockUnitsInStock …… ……

1

34

1

34

15106520

15106520

2 15

InStock_Update-Trigger wird ausgeführtNachricht wird gesendet

Order_DetailsOrder_DetailsOrder_DetailsOrderIDOrderID

105221052310524

105221052310524

ProductIDProductID

10417

10417

UnitPriceUnitPrice

31.009.6530.00

31.009.6530.00

QuantityQuantity

79

24

79

24

DiscountDiscount

0.20.150.0

0.20.150.0

10525 19.002 0.25

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Ein Trigger kann eine UPDATE-, INSERT- oder DELETE-Anweisung ent-halten, die sich auf eine andere Tabelle auswirkt. Wenn die Option für ge-schachtelte Trigger aktiviert ist, kann ein Trigger, durch den Änderungen an einer Tabelle vorgenommen werden, einen zweiten Trigger aktivieren, der wiederum einen dritten aktiviert, und so weiter. Die Schachtelungsfunktion wird bei der Installation aktiviert, kann jedoch mit Hilfe der gespeicherten Systemprozedur sp_configure deaktiviert und erneut aktiviert werden.

Trigger können bis zu 32 Ebenen tief geschachtelt werden. Wenn irgendein Trigger in einer geschachtelten Kette eine Endlosschleife verursacht, wird die Schachtelungsebene überschritten. Der Trigger wird nun beendet, und es wird ein Rollback der Transaktion durchgeführt. Mit Hilfe geschachtelter Trigger können Funktionen, wie z. B. das Speichern einer Sicherungskopie von Zeilen, die durch einen vorherigen Trigger beeinflusst wurden, ausgeführt werden. Beachten Sie bei der Verwendung geschachtelter Trigger die folgenden Aspekte:

� Standardmäßig ist die Konfigurationsoption für geschachtelte Trigger aktiviert.

� Ein geschachtelter Trigger wird nicht zweimal in der gleichen Triggertrans-aktion ausgelöst; ein Trigger ruft sich nicht selbst als Reaktion auf eine zweite, durch den Trigger bewirkte Aktualisierung der gleichen Tabelle auf. Wenn ein Trigger beispielsweise eine Tabelle ändert, die wiederum die ur-sprüngliche Triggertabelle ändert, wird der Trigger nicht erneut ausgelöst.

� Da es sich bei einem Trigger um eine Transaktion handelt, wird, wenn in einer Reihe geschachtelter Trigger auf einer beliebigen Ebene ein Fehler auftritt, die gesamte Aktion abgebrochen und für alle Datenänderungen ein Rollback ausgeführt. Sie sollten daher beim Testen Ihrer Trigger PRINT-Anweisungen einsetzen, damit Sie ermitteln können, wo der Fehler auf-getreten ist.

ThemaErläutern Sie die Verwen-dung geschachtelter Trigger.

EinstiegWie bereits erwähnt, können Trigger bis zu 32 Ebenen tief geschachtelt werden. Wenn die Option für ge-schachtelte Trigger aktiviert ist, kann ein Trigger, durch den eine Tabelle geändert wird, einen zweiten Trigger aktivieren, der wiederum einen dritten aktiviert, und so weiter.

Page 592: Programmieren Einer Microsoft SQL Server 2000-Datenbank

26 Unterrichtseinheit 11: Implementieren von Triggern

Überprüfen der Schachtelungsebene Bei jedem Auslösen eines geschachtelten Triggers wird die Schachtelungsebene erhöht. Unter SQL Server werden 32 Schachtelungsebenen unterstützt, es empfiehlt sich jedoch, die Anzahl der Schachtelungsebenen zu begrenzen, damit die höchste Schachtelungsebene nicht überschritten wird. Sie können die aktuellen Schachtelungsebenen mit Hilfe der Funktion @@NESTLEVEL anzeigen.

Verwenden der Schachtelungsfunktion Die Option für geschachtelte Trigger ist eine leistungsfähige Funktion, mit deren Unterstützung Sie die Datenintegrität innerhalb einer Datenbank aufrecht-erhalten können. Gelegentlich kann es jedoch sinnvoll sein, die Schachtelungs-funktion zu deaktivieren. Wenn die Option für geschachtelte Trigger deaktiviert ist, ruft ein Trigger, der eine andere Tabelle ändert, keinen der Trigger für die zweite Tabelle auf.

Deaktivieren Sie die Schachtelungsfunktion mit Hilfe der folgenden Anweisung:

sp_configure 'nested triggers', 0

Aus folgenden Gründen kann eine Deaktivierung der Schachtelungsfunktion sinnvoll sein:

� Das Entwerfen geschachtelter Trigger erfordert eine komplexe und gut ge-plante Struktur. Durch kaskadierende Änderungen können Daten unbeab-sichtigt geändert werden.

� Durch das Ändern von Daten an einer beliebigen Stelle in einer Reihe ge-schachtelter Trigger wird die Triggerkette ausgelöst. Obwohl Ihre Daten auf diese Weise wirkungsvoll geschützt werden, kann dies ein Problem dar-stellen, wenn Ihre Tabellen in einer bestimmten Reihenfolge aktualisiert werden müssen.

Sie können ein und dieselbe Funktionalität mit und ohne die Schachtelungs-funktion erstellen: Die Struktur der Trigger wird sich jedoch erheblich unter-scheiden. Beim Entwerfen geschachtelter Trigger sollte jeder einzelne Trigger ausschließlich die nächste Datenänderung auslösen - die Struktur sollte modular sein. Beim Entwerfen nicht geschachtelter Trigger sollte jeder einzelne Trigger sämtliche von Ihnen gewünschten Datenänderungen auslösen.

Methodischer Hinweis In einer Produktionsum-gebung, in der in der Regel keine Trigger eingesetzt werden, ist für Tests und zur Fehlerbehebung die Funk-tion @@NESTLEVEL nützlich.

Syntax

Page 593: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 11: Implementieren von Triggern 27

Das folgende Beispiel illustriert, wie das Vornehmen einer Bestellung bewirkt, dass der OrDe_Update-Trigger ausgeführt wird. Dieser Trigger führt eine UPDATE-Anweisung für die UnitsInStock-Spalte der Products-Tabelle durch. Wenn die Aktualisierung vorgenommen wird, wird der Products_Update-Trigger ausgelöst und vergleicht den neuen Wert des Lagerbestands plus den bestellten Warenbestand mit dem Mindestbestand. Wenn der Wert für Lagerbestand plus bestellte Ware unter den Mindestbestand fällt, wird eine Meldung ausgegeben, mit der der Einkäufer darauf hingewiesen wird, dass der Bestand aufgefüllt werden muss.

USE Northwind GOCREATE TRIGGER Products_Update ON Products FOR UPDATE ASIF UPDATE (UnitsInStock) IF (Products.UnitsInStock + Products.UnitsOnOrder) < Products.ReorderLevelBEGIN --sendet eine Nachricht zu der Einkaufsabteilung END

Beispiel

Page 594: Programmieren Einer Microsoft SQL Server 2000-Datenbank

28 Unterrichtseinheit 11: Implementieren von Triggern

Rekursive Trigger

� Rekursives Aktivieren eines Triggers� Typen rekursiver Trigger

� Direkte Rekursion tritt auf, wenn ein Trigger ausgelöst wird und eine Aktion ausführt, die das erneute Auslösen desselben Triggers verursacht

� Indirekte Rekursion tritt auf, wenn ein Trigger ausgelöst wird und eine Aktion durchführt, die dazu führt, dass ein Trigger für eine andere Tabelle ausgeführt wird

� Verwenden rekursiver Trigger

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Jeder Trigger kann eine UPDATE-, INSERT- oder DELETE-Anweisung enthalten, die dieselbe Tabelle oder eine andere Tabelle betrifft. Wenn die Option für rekursive Trigger aktiviert ist, kann sich ein Trigger, durch den Daten in einer Tabelle geändert werden, selbst noch einmal aktivieren, und so einen rekursiven Vorgang ausführen. Die Option für rekursive Trigger ist bei der Erstellung einer Datenbank standardmäßig deaktiviert, Sie können die Option jedoch mit Hilfe der Anweisung ALTER DATABASE aktivieren.

Rekursives Aktivieren eines Triggers Aktivieren Sie die Option für rekursive Trigger mit Hilfe der folgenden Anweisung:

ALTER DATABASE ClassNorthwind SET RECURSIVE_TRIGGERS ON

sp_dboption databasename, 'recursive triggers', True

Verwenden Sie die gespeicherte Systemprozedur sp_settriggerorder, um einen Trigger anzugeben, der als erster oder letzter AFTER-Trigger ausgelöst wird. Es gibt keine feste Reihenfolge, in der mehrere Trigger, die für ein bestimmtes Ereignis definiert sind, ausgeführt werden. Jeder Trigger sollte unabhängig sein.

Wenn die Option für geschachtelte Trigger deaktiviert ist, ist die Option für rekursive Trigger ebenfalls deaktiviert, unabhängig von der Datenbankeinstel-lung für rekursive Trigger.

Die Tabellen inserted und deleted für einen bestimmten Trigger enthalten Zeilen, die sich ausschließlich auf die UPDATE-, INSERT- bzw. DELETE-Anweisung bezieht, durch die der Trigger zuletzt aufgerufen wurde.

ThemaErläutern Sie die Verwen-dung rekursiver Trigger.

EinstiegWenn die Option für rekursive Trigger aktiviert ist, kann ein Trigger, durch den Daten in einer Tabelle geändert werden, einen zweiten Trigger aktivieren, der wiederum den ursprüng-lich aufgerufenen Trigger aktivieren kann, indem Daten in der ursprünglichen Tabelle geändert werden.

Syntax

Anmerkung

Page 595: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 11: Implementieren von Triggern 29

Die Rekursion von Triggern kann bis zu 32 Ebenen tief erfolgen. Wenn durch einen der Trigger in einer rekursiven Schleife eine Endlosschleife ausgelöst wird, wird die Schachtelungsebene überschritten, woraufhin der Trigger beendet und ein Rollback für die Transaktion durchgeführt wird.

Typen rekursiver Trigger Es werden zwei Rekursionstypen unterschieden:

� Direkte Rekursion, die auftritt, wenn ein Trigger ausgelöst wird und eine Aktion ausführt, die das erneute Auslösen desselben Triggers verursacht. Eine Anwendung aktualisiert z. B. die T1-Tabelle, wodurch der Trig1-Trigger ausgelöst wird. Trig1 aktualisiert die Tabelle T1 noch einmal, wodurch der Trigger Trig1 ein weiteres Mal ausgelöst wird.

� Die indirekte Rekursion, die auftritt, wenn ein Trigger ausgelöst wird und eine Aktion durchführt, die dazu führt, dass ein Trigger für eine andere Tabelle ausgeführt und daraufhin eine Aktualisierung der ursprünglichen Tabelle verursacht wird. Dadurch wird der ursprüngliche Trigger noch einmal ausgelöst. Eine Anwendung aktualisiert z. B. die T2-Tabelle, wodurch der Trig2-Trigger ausgelöst wird. Trig2 aktualisiert die Tabelle T3, wodurch der Trigger Trig3 ausgelöst wird. Trig3 wiederum aktualisiert die Tabelle T2,wodurch der Trigger Trig2 noch einmal ausgelöst wird.

Verwenden rekursiver Trigger Rekursive Trigger stellen eine komplexe Funktion dar, mit deren Hilfe Sie komplexe Beziehungen, wie z. B. auf sich selbst verweisende Beziehungen (auch als transitive Beziehungen bezeichnet) auflösen können. In diesen speziellen Situationen kann es sinnvoll sein, die Option für rekursive Trigger zu aktivieren.

Rekursive Trigger könnten sich als nützlich erweisen, wenn Sie folgende Auf-gaben erledigen müssen:

� Beibehalten der Anzahl von Berichtsspalten in der Employee-Tabelle, wobei die Tabelle eine Employee ID-Spalte und eine Manager ID-Spalte enthält. Nehmen Sie beispielsweise an, dass zwei Aktualisierungstrigger, tr_update_employee und tr_update_manager für die employee-Tabelle definiert sind. Die employee-Tabelle wird vom tr_update_employee-Trigger aktualisiert. Die Trigger tr_update_employee und tr_update_manager werden beide je einmal von einer UPDATE-Anweisung ausgelöst. Darüber hinaus wird durch die Ausführung von tr_update_employee die nochmalige Aus-führung von tr_update_employee (rekursiv) und tr_update_managerausgelöst.

� Verwalten eines Diagramms für Produktionsplanungsdaten, in dem eine implizierte Planungshierarchie vorhanden ist.

� Verwalten eines Fertigungsüberwachungssystems, bei dem untergeordnete Teile in Abhängigkeit von den übergeordneten Teilen verfolgt werden.

Methodischer Hinweis Weisen Sie darauf hin, dass das erste Beispiel nicht auf die Employees-Tabelle in der Northwind-Datenbank zutrifft bzw. sich nicht darauf bezieht.

Page 596: Programmieren Einer Microsoft SQL Server 2000-Datenbank

30 Unterrichtseinheit 11: Implementieren von Triggern

Beachten Sie vor der Verwendung rekursiver Trigger die folgenden Richtlinien:

� Rekursive Trigger sind komplex und müssen gut geplant und gründlich ge-testet werden. Für rekursive Trigger ist ein logischer Code für die Steuerung von Schleifen (Beendigungsprüfung) erforderlich. Andernfalls wird die Schachtelungsgrenze von 32 Ebenen überschritten.

� Die Triggerkette kann durch eine Datenänderung an einer beliebigen Stelle abgebrochen werden. Obwohl auf diese Weise komplexe Beziehungen verarbeitet werden können, kann dies ein Problem darstellen, wenn Ihre Tabellen in einer speziellen Reihenfolge aktualisiert werden müssen.

Sie können eine ähnliche Funktionalität auch ohne die Funktion für rekursive Trigger erstellen, die Struktur der Trigger wird jedoch völlig anders aussehen. Beim Entwerfen rekursiver Trigger muss jeder Trigger eine Bedingungsprüfung enthalten, um die rekursive Ausführung anzuhalten, wenn die Bedingung falsch wird. Beim Entwerfen nicht rekursiver Trigger muss jeder Trigger die voll-ständigen Programmschleifenstrukturen und -tests enthalten.

Page 597: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 11: Implementieren von Triggern 31

���� Beispiele für Trigger

� Erzwingen der Datenintegrität

� Durchsetzen von Geschäftsregeln

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Mit Triggern werden Datenintegrität und Geschäftsregeln durchgesetzt. Einige der von Triggern durchgeführten Aktionen können mit Hilfe von Einschränkun-gen ausgeführt werden. Für bestimmte Aktionen sollten Sie zunächst die Ver-wendung von Einschränkungen in Betracht ziehen. Trigger sind jedoch not-wendig, um unterschiedliche Grade der Entnormalisierung sowie Geschäfts-regeln durchzusetzen.

ThemaErläutern Sie, warum Trigger in SQL Server notwendig sind.

EinstiegMit Triggern werden Daten-integrität und Geschäfts-regeln durchgesetzt.

Page 598: Programmieren Einer Microsoft SQL Server 2000-Datenbank

32 Unterrichtseinheit 11: Implementieren von Triggern

Erzwingen der Datenintegrität

CREATE TRIGGER BackOrderList_DeleteON Products FOR UPDATE

ASIF (SELECT BO.ProductID FROM BackOrders AS BO JOIN

Inserted AS I ON BO.ProductID = I.Product_ID) > 0

BEGINDELETE BO FROM BackOrders AS BOINNER JOIN Inserted AS ION BO.ProductID = I.ProductID

END

CREATE TRIGGER BackOrderList_DeleteON Products FOR UPDATE

ASIF (SELECT BO.ProductID FROM BackOrders AS BO JOIN

Inserted AS I ON BO.ProductID = I.Product_ID) > 0

BEGINDELETE BO FROM BackOrders AS BOINNER JOIN Inserted AS ION BO.ProductID = I.ProductID

END

ProductsProductsProductsProductIDProductID UnitsInStockUnitsInStock …… ……

1

34

1

34

15106520

15106520

2 15 AktualisierungAktualisierung

BackOrdersBackOrdersBackOrdersProductIDProductID UnitsOnOrderUnitsOnOrder ……

1123

1123

151065

151065

2 15 Trigger löscht ZeileTrigger löscht Zeile

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Trigger können zur Aufrechterhaltung der Datenintegrität verwenden werden, indem Änderungen an verknüpften Tabellen in der gesamten Datenbank kas-kadiert werden.

Das folgende Beispiel zeigt, wie mit einem Trigger die Datenintegrität für die BackOrders-Tabelle aufrecht gehalten wird. Mit dem Trigger BackOrderList_delete wird die Liste der Produkte in der BackOrders-Tabelle verwaltet. Wenn Produkte eingehen, löscht der UPDATE-Trigger für die Products-Tabelle Datensätze aus der BackOrders-Tabelle.

CREATE TRIGGER BackOrderList_Delete ON Products FOR UPDATE ASIF (SELECT BO.ProductID FROM BackOrders AS BO JOIN Inserted AS I ON BO.ProductID = I.Product_ID ) > 0 BEGIN DELETE BO FROM BackOrders AS BO INNER JOIN Inserted AS I ON BO.ProductID = I.ProductID END

ThemaZeigen Sie anhand eines Beispiels, wie die Daten-integrität mit Hilfe von Triggern durchgesetzt wird.

EinstiegTrigger können zur Aufrechterhaltung der Datenintegrität verwenden werden, indem Änderungen an verknüpften Tabellen in der gesamten Datenbank kaskadiert werden.

Beispiel

Weitere Informationen Dieses Beispiel ist hypothetisch. Es gibt keine BackOrders-Tabelle in der Northwind-Datenbank.

Page 599: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 11: Implementieren von Triggern 33

Durchsetzen von Geschäftsregeln

ProductsProductsProductsProductIDProductID UnitsInStockUnitsInStock …… ……

1234

1234

15106520

15106520

Produkte mit ausstehenden Bestellungen können nicht gelöscht werden

IF (Select Count (*) FROM [Order Details] INNER JOIN deleted ON [Order Details].ProductID = deleted.ProductID) > 0

ROLLBACK TRANSACTION

IF (Select Count (*) FROM [Order Details] INNER JOIN deleted ON [Order Details].ProductID = deleted.ProductID) > 0

ROLLBACK TRANSACTION

DELETE-Anweisung auf der Product-Tabelle ausgeführt

Triggercode überprüftdie Order Details-Tabelle

Order DetailsOrder DetailsOrder DetailsOrderIDOrderID

10522105231052410525

10522105231052410525

ProductIDProductID

102

417

102

417

UnitPriceUnitPrice

31.0019.009.6530.00

31.0019.009.6530.00

QuantityQuantity

79

24

79

24

DiscountDiscount

0.20.150.0

0.20.150.0

9

'Transaction cannot be processed''This product has order history'

'Transaction cannot be processed''This product has order history'

Rollback derTransaktion

ProductsProductsProductsProductIDProductID UnitsInStockUnitsInStock …… ……

1

34

1

34

15106520

15106520

2 0

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Sie können mit Hilfe von Triggern Geschäftsregeln durchsetzen, die für die CHECK-Einschränkung zu komplex sind. Hierzu gehört das Prüfen des Status von Zeilen in anderen Tabellen.

Sie möchten beispielsweise sicherstellen, dass die ausstehenden Überziehungs-gebühren der Mitglieder bezahlt sind, bevor sie die Mitgliedschaft beenden können.

In diesem Beispiel wird ein Trigger erstellt, der ermittelt, ob ein Produkt über eine Bestellhistorie verfügt. Falls ja, wird ein Rollback der DELETE-Aktion durchgeführt, und der Trigger gibt eine benutzerdefinierte Fehlermeldung zurück.

Use Northwind GOCREATE TRIGGER Product_Delete ON Products FOR DELETE ASIF (Select Count (*) FROM [Order Details] INNER JOIN deleted ON [Order Details].ProductID = Deleted.ProductID ) > 0 BEGIN RAISERROR('Transaction cannot be processed. \ This product has order history.', 16, 1) ROLLBACK TRANSACTION END

ThemaZeigen Sie anhand eines Beispiels, wie Geschäfts-regeln durchgesetzt werden.

EinstiegTrigger können auch zum Durchsetzen bestimmter Geschäftsregeln, wie z. B. „Keine Produkte mit einer Bestellhistorie löschen“, ver-wendet werden.

Beispiel

Page 600: Programmieren Einer Microsoft SQL Server 2000-Datenbank

34 Unterrichtseinheit 11: Implementieren von Triggern

Leistungsaspekte

� Trigger arbeiten schnell, da die „inserted“- und „deleted“-Tabellen im Cache gespeichert sind

� Ausführungszeit wird bestimmt durch:

� Die Anzahl der referenzierten Tabellen

� Die Anzahl der betroffenen Zeilen

� Die in einem Trigger enthaltenen Aktionen sind implizit Teil einer Transaktion

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Die folgenden Leistungsaspekte sollten bei der Verwendung von Triggern berücksichtigt werden.

� Trigger arbeiten schnell, da die inserted- und deleted-Tabellen im Cache gespeichert sind. Die inserted- und deleted-Tabellen befinden sich immer im Arbeitsspeicher anstatt auf einer Festplatte, da es sich um logische Tabellen handelt, die in der Regel sehr klein sind.

� Die Anzahl der Tabellen, auf die verwiesen wird, und die Anzahl der betroffenen Zeilen bestimmt die Ausführungszeit. Die für das Aufrufen eines Triggers benötigte Zeit ist minimal. Der größte Teil der Ausführungszeit wird durch Verweise auf andere Tabellen (die ent-weder im Arbeitsspeicher oder auf einer Festplatte gespeichert sind) und das Ändern von Daten in Anspruch genommen, wenn diese Vorgänge durch die Triggerdefinition aufgerufen werden.

� Die in einem Trigger enthaltenen Aktionen sind implizit Teil einer Trans-aktion. Sobald ein Trigger definiert ist, ist die Benutzeraktion (eine INSERT-, UPDATE- oder DELETE-Anweisung) für die Tabelle, durch die der Trigger ausgeführt wird, zusammen mit dem Trigger selbst immer implizit Teil einer Transaktion. Wenn eine ROLLBACK TRANSACTION-Anwei-sung angetroffen wird, wird ein Rollback für die gesamte Transaktion aus-geführt. Wenn das Triggerskript nach der ROLLBACK TRANSACTION-Anweisung weitere Anweisungen enthält, werden diese ausgeführt. Daher kann es notwendig sein, eine RETURN-Klausel in einer IF-Anweisung zu verwenden, um die Verarbeitung anderer Anweisungen zu verhindern.

ThemaStellen Sie die Leistungs-aspekte bei der Verwen-dung von Triggern vor.

EinstiegDie folgenden Leistungs-aspekte sollten bei der Verwendung von Triggern berücksichtigt werden.

Page 601: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 11: Implementieren von Triggern 35

Empfohlene Methoden

Halten Sie Triggerdefinitionen so einfach wie möglichHalten Sie Triggerdefinitionen so einfach wie möglich

Verwenden Sie ROLLBACK-Anweisungen nur selten in TriggernVerwenden Sie ROLLBACK-Anweisungen nur selten in Triggern

Verwenden Sie Trigger nur dann, wenn es notwendig istVerwenden Sie Trigger nur dann, wenn es notwendig ist

Fügen Sie Anweisungen zur Beendigungsprüfung der Rekursionin Definitionen für rekursive Trigger einFügen Sie Anweisungen zur Beendigungsprüfung der Rekursionin Definitionen für rekursive Trigger ein

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Die im Folgenden empfohlenen Methoden sollen Ihnen bei der Verwaltung Ihrer Datenbanken behilflich sein:

� Verwenden Sie Trigger nur dann, wenn es notwendig ist. Ziehen Sie die Verwendung einer Einschränkung in Betracht, bevor Sie auf einen Trigger zurückgreifen.

� Halten Sie Triggerdefinitionen so einfach wie möglich. Die meiste Zeit, die für die Verarbeitung eines Triggers benötigt wird, wird für das Verweisen auf Tabellen und das Ändern von Daten aufgewendet. Da es sich bei Triggern im Grunde genommen um Transaktionen handelt, werden Sperren aufrechterhalten, bis die Transaktion beendet ist.

� Fügen Sie Anweisungen zur Beendigungsprüfung der Rekursion in Defini-tionen für rekursive Trigger ein. Dadurch wird verhindert, dass der Trigger in einer Endlosschleife stecken bleibt.

� Verwenden Sie ROLLBACK-Anweisungen nur selten in Triggern. Wenn Sie ein Rollback für einen Trigger ausführen, müssen sämtliche Änderun-gen, die bis zu diesem Punkt durchgeführt wurden, von SQL Server wieder rückgängig gemacht werden.

Zusätzliche Informationen zu den folgenden Themen erhalten Sie in der SQL Server-Onlinedokumentation.

Thema Suchbegriff

CREATE TRIGGER "create trigger"

ALTER TRIGGER "alter trigger"

DROP TRIGGER "drop trigger"

Erstellen eines Triggers "Erstellen eines Triggers"

Programmieren von Triggern "Programmieren von Triggern"

ThemaGeben Sie eine Übersicht über die empfohlenen Methoden zur Verwendung von Triggern.

EinstiegDie folgenden Vorschläge enthalten die empfohlenen Methoden zur Verwendung von Triggern.

Page 602: Programmieren Einer Microsoft SQL Server 2000-Datenbank

36 Unterrichtseinheit 11: Implementieren von Triggern

Übungseinheit A: Erstellen von Triggern

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

LernzieleAm Ende dieser Übungseinheit werden Sie in der Lage sein, die folgenden Aufgaben auszuführen:

� Erstellen von Triggern zur Aufrechterhaltung der Datenintegrität. � Erstellen von Triggern zum Durchsetzen komplexer Geschäftsregeln.

VoraussetzungenUm diese Übungseinheit zu bearbeiten, benötigen Sie Folgendes:

� Die Skriptdateien für diese Übungseinheit, die sich in C:\Moc\2328A\Labfiles\L11 befinden.

� Die Antwortdateien für diese Übungseinheit, die sich in C:\Moc\2328A\Labfiles\L11\Answers befinden.

Einrichten der ÜbungseinheitUm diese Übungseinheit zu bearbeiten, ist eine der folgenden Aktionen erforderlich:

� Bearbeiten der vorherigen Übungseinheit. � Ausführen der Batchdatei C:\Moc\2328A\Batches\Restore11.cmd.

Mit dieser Befehlsdatei wird die ClassNorthwind-Datenbank wieder in den Zustand zurückversetzt, der für diese Übungseinheit erforderlich ist.

ThemaGeben Sie eine Einführung in die Übungseinheit.

EinstiegIn dieser Übungseinheit erstellen Sie Trigger und testen diese.

Erläutern Sie die Lernziele der Übungseinheit.

Page 603: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 11: Implementieren von Triggern 37

Weitere Informationen Sollten Sie beim Ausführen von Dateien Hilfe benötigen, suchen Sie in der Hilfe von SQL Query Analyzer nach „Ausführen einer Abfrage“.

Daneben sind die folgenden Informationsquellen verfügbar:

� Das Northwind-Datenbankschema. � Die Microsoft SQL Server-Onlinedokumentation.

SzenarioDer Aufbau des Schulungsraumes soll die Organisation des weltweit agieren-den Handelsunternehmens Northwind Traders widerspiegeln. Das Unternehmen hat den fiktiven Domänennamen nwtraders.msft. Der primäre DNS-Server für nwtraders.msft ist der Kursleitercomputer, dessen IP-Adresse (Internetproto-koll) 192.168.x.200 lautet (wobei x die zugewiesene Schulungsraumnummer ist). Der Name des Kursleitercomputers ist London.

Die folgende Tabelle stellt den Benutzernamen, den Computernamen und die IP-Adresse für jeden Kursteilnehmercomputer in der fiktiven Domäne nwtraders.msft bereit. Suchen Sie den Ihrem Computer zugewiesenen Benutzernamen und notieren Sie ihn.

Benutzername Computername IP-Adresse

SQLAdmin1 Vancouver 192.168.x.1SQLAdmin2 Denver 192.168.x.2SQLAdmin3 Perth 192.168.x.3SQLAdmin4 Brisbane 192.168.x.4SQLAdmin5 Lisbon 192.168.x.5SQLAdmin6 Bonn 192.168.x.6SQLAdmin7 Lima 192.168.x.7SQLAdmin8 Santiago 192.168.x.8SQLAdmin9 Bangalore 192.168.x.9SQLAdmin10 Singapore 192.168.x.10SQLAdmin11 Casablanca 192.168.x.11SQLAdmin12 Tunis 192.168.x.12SQLAdmin13 Acapulco 192.168.x.13SQLAdmin14 Miami 192.168.x.14SQLAdmin15 Auckland 192.168.x.15SQLAdmin16 Suva 192.168.x.16SQLAdmin17 Stockholm 192.168.x.17SQLAdmin18 Moscow 192.168.x.18SQLAdmin19 Caracas 192.168.x.19SQLAdmin20 Montevideo 192.168.x.20SQLAdmin21 Manila 192.168.x.21SQLAdmin22 Tokyo 192.168.x.22SQLAdmin23 Khartoum 192.168.x.23SQLAdmin24 Nairobi 192.168.x.24

Veranschlagte Zeit für die Übungseinheit: 30 Minuten

Page 604: Programmieren Einer Microsoft SQL Server 2000-Datenbank

38 Unterrichtseinheit 11: Implementieren von Triggern

Übung 1 Erstellen von Triggern

In dieser Übung führen Sie ein Skript aus, durch das ein Trigger erstellt wird. Nachdem der Trigger erstellt ist, testen Sie ihn, um zu überprüfen, ob er funktioniert.

� So erstellen Sie einen Trigger Mit diesem Verfahren erstellen Sie einen Trigger, indem Sie eine Skriptdatei ausführen.1. Melden Sie sich mit Hilfe der Informationen in der folgenden Tabelle an der

Schulungsraumdomäne nwtraders an.

Option Eingabe

Benutzername SQLAdminx (wobei x die Ihrem Computernamen zugewiesene Nummer ist, wie in der Schulungsraumdomäne nwtraders.msftfestgelegt)

Kennwort password

2. Öffnen Sie SQL Query Analyzer und melden Sie sich gegebenenfalls mit Microsoft Windows®-Authentifizierung am (lokalen) Server an. Sie sind berechtigt, sich an SQL Server anzumelden und SQL Server zu verwalten, da Sie als SQLAdminx angemeldet und damit Mitglied der lokalen Administratorgruppe von Microsoft Windows 2000 sind. Alle Mitglieder dieser Gruppe werden automatisch der sysadmin-Rolle von SQL Server zugeordnet.

3. Klicken Sie in der Liste DB auf ClassNorthwind.4. Öffnen Sie die Skriptdatei C:\Moc\2328A\Labfiles\OrdDetInsert.sql, und

prüfen Sie sie. Durch dieses Skript wird ein Trigger für die Tabelle Order Details erstellt. Der Trigger aktualisiert die Spalte UnitsInStock der Products-Tabelle immer dann, wenn eine Zeile in die Order Details-Tabelle eingefügt wird (immer wenn ein Auftrag eingeht).

5. Führen Sie C:\Moc\2328A\Labfiles\L11\OrdDetInsert.sql aus.6. Führen Sie die gespeicherte Systemprozedur sp_helptrigger für die Order

Details-Tabelle in der ClassNorthwind-Datenbank aus, um zu ermitteln, ob der Trigger erstellt wurde.

Page 605: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 11: Implementieren von Triggern 39

� So testen Sie den Trigger Mit diesem Verfahren testen Sie den soeben erstellten Trigger, indem Sie eine Zeile in die Order Details-Tabelle einfügen. 1. Führen Sie die folgende SELECT-Anweisung aus, um eine Zeile in der

Products-Tabelle auszuwählen und so die Anzahl der am Lager befindlichen Einheiten zu ermitteln: SELECT * FROM Products WHERE ProductID = 22

Die UnitsInStock-Spalte sollte den Wert 104 enthalten. Wenn in dieser Spalte ein anderer Wert angegeben wird, machen Sie sich eine entsprechende Notiz.

2. Fügen Sie eine Zeile in die Order Details-Tabelle ein, mit der 50 Einheiten von Produkt 22 bestellt werden. Ihre INSERT-Anweisung sieht ähnlich der Folgenden aus: INSERT [Order Details] (OrderID, ProductID, UnitPrice, Quantity, Discount) VALUES (11077, 22, 21.00, 50, 0.0) GO

3. Fragen Sie die Products-Tabelle ab, um zu prüfen, dass der Wert in der UnitsInStock-Spalte für die angegebene ProductID auf 54 geändert wurde.

Page 606: Programmieren Einer Microsoft SQL Server 2000-Datenbank

40 Unterrichtseinheit 11: Implementieren von Triggern

Übung 2 Erstellen eines Triggers zur Aktualisierung abgeleiteter Daten

In dieser Übung erstellen Sie zwei neue Tabellen (ohne PRIMARY- und FOREIGN KEY-Einschränkungen) und anschließend einen Trigger für die NewCategories-Tabelle, um die Integrität in der NewProducts.Discontinued-Spalte durchzusetzen. C:\Moc\2328A\Labfiles\L11\Answers\CategoryDelete.sql enthält ein voll-ständiges Skript für diese Übung.

� So erstellen Sie einen Trigger zur Aktualisierung abgeleiteter Daten In diesem Verfahren erstellen Sie zwei neue Tabellen mit Namen NewCategories und NewProducts. Für keine der beiden sind PRIMARY- und FOREIGN KEY-Einschränkungen definiert. Anschließend erstellen Sie einen Trigger für die NewCategories-Tabelle. Mit diesem Trigger wird die Discontinued-Spalte in der NewProducts-Tabelle immer dann aktualisiert, wenn eine Kategorie gelöscht wird (immer wenn ein Datensatz aus der NewCategories-Tabelle gelöscht wird). Alle betroffenen Produkte werden als 1 markiert, um anzuzeigen, dass sie nicht weiter geführt werden. Führen Sie C:\Moc\2328A\Labfiles\L11\CategoryDelete.sql aus, und nehmen Sie die entsprechenden Änderungen vor. 1. Geben Sie die folgende Abfrage ein, und führen Sie sie aus, um zwei neue

Tabellen mit Namen NewCategories und NewProducts zu erstellen. USE ClassNorthwind GO--This creates a NewCategories table SELECT * INTO NewCategories FROM Categories --This creates a NewProducts table SELECT * INTO NewProducts FROM Products GO

2. Geben Sie die folgende Abfrage ein, und führen Sie sie aus, um einen Trigger für die NewCategories-Tabelle zu erstellen. Mit diesem Trigger wird die Discontinued-Spalte der NewProducts-Tabelle auf 1 aktualisiert, wenn das übergeordnete Verzeichnis eines Produkts gelöscht wird (wenn eine Zeile aus der NewCategories-Tabelle gelöscht wird). CREATE TRIGGER Category_Delete ON NewCategories FOR DELETE AS UPDATE P SET Discontinued = 1 FROM NewProducts AS P INNER JOIN Deleted AS d ON P.CategoryID = D.CategoryID

Page 607: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 11: Implementieren von Triggern 41

3. Geben Sie die folgende SELECT-Anweisung ein, und führen Sie sie aus, mit der die NewProducts-Tabelle abgefragt wird, um die Werte für die nicht weiter geführten Produkte (Discontinued-Spalte) in CategorieID 7 zuermitteln. SELECT ProductID, CategoryID, Discontinued FROM NewProducts WHERE CategoryID = 7

4. Erstellen Sie eine DELETE-Anweisung, durch die eine Zeile aus der NewCategories-Tabelle entfernt wird, und überprüfen Sie anschließend, ob der Trigger korrekt ausgeführt wird. Sind diese Trigger zur Aufrechterhaltung der Datenintegrität in der ClassNorthwind-Datenbank erforderlich? Begründung? Ja. Mit dem Kaskadieren von referenzieller Integrität könnten die entsprechenden Produkte zwar auch aus der „NewProducts“-Tabelle entfernt werden, ein Trigger ist jedoch die beste Möglichkeit zum Implementieren einer komplexeren Aktion wie beispielsweise dem Belassen der Datensätze in „NewProducts“, während die „Discontinued“-Spalte aktualisiert wird. ____________________________________________________________

____________________________________________________________

Page 608: Programmieren Einer Microsoft SQL Server 2000-Datenbank

42 Unterrichtseinheit 11: Implementieren von Triggern

Übung 3 Erstellen eines Triggers zur Durchsetzung einer komplexen Geschäftsregel

In dieser Übung erstellen Sie einen DELETE-Trigger für die NewProducts-Tabelle. Mit diesem Trigger wird ermittelt, ob in der Order Details-Tabelle eine Bestellhistorie vorliegt, bevor der Trigger Löschvorgänge in der NewProducts-Tabelle zulässt.

� So erstellen Sie einen Trigger für die „NewProducts“-Tabelle In diesem Verfahren verwenden Sie die in der vorherigen Übung erstellte NewProducts-Tabelle. Sie erstellen einen Trigger, mit dem ermittelt wird, ob ein Bestellhistorie für ein Produkt existiert, das gelöscht werden soll. Wenn das Produkt noch nie bestellt wurde, kann es gelöscht werden. Wenn das Produkt über eine Bestellhistorie verfügt, wird ein Rollback für den Löschvorgang in der NewProducts-Tabelle durchgeführt, und der Trigger gibt eine benutzer-definierte Fehlermeldung aus. C:\Moc\2328A\Labfiles\L11\Answers\BusinessRule.sql enthält ein voll-ständiges Skript für diese Übung. 1. Sie erstellen einen DELETE-Trigger für die NewProducts-Tabelle, mit dem

ermittelt wird, ob eine Bestellhistorie für ein Produkt existiert, das andern-falls gelöscht werden soll. Wenn in der Order Details-Tabelle Datensätze für dieses Produkt vorhanden sind, wird eine Meldung angezeigt und ein Rollback ausgeführt.

2. Löschen Sie Produkt 6 aus der NewProducts-Tabelle, um den Trigger zu testen. Answers\BusinessRule.sql ist das vollständige Skript für diesen Schritt. Wurde der Trigger ausgelöst? Begründung? Ja. Für das Produkt, das aus der „NewProducts“-Tabelle gelöscht wurde, befinden sich Bestellungen in der „Order Details“-Tabelle. Der Trigger hat die Löschung verhindert und gibt eine Fehlermeldung aus. ____________________________________________________________

____________________________________________________________

Page 609: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 11: Implementieren von Triggern 43

Übung 4 Prüfen der Auslösungsreihenfolge von Einschränkungen und Triggern

In dieser Übung ändern Sie die Anweisung aus der vorherigen Übung, um die Auslösungsreihenfolge von Einschränkungen und Triggern zu prüfen. C:\Moc\2328A\Labfiles\L11\Answers\BusinessRule.sql enthält ein voll-ständiges Skript für diese Übung.

� So ändern Sie den Trigger aus der vorherigen Übung 1. Erstellen Sie einen Trigger für die Products-Tabelle ähnlich demjenigen,

den Sie in der vorherigen Übung erstellt haben, und nennen Sie ihn Product_Delete2.Erinnern Sie sich, dass in der vorherigen Übung ein DELETE-Trigger mit Namen Product_Delete für die NewProducts-Tabelle erstellt wurde. CREATE TRIGGER Product_Delete2 ON Products FOR DELETE ASIF (Select Count (*) FROM [Order Details] INNER JOIN deleted ON [Order Details].ProductID = Deleted.ProductID ) > 0 BEGIN RAISERROR('Transaction cannot be processed. This Product still has a history of orders.', 16, 1) ROLLBACK TRANSACTION END

2. Testen Sie den Trigger. Wurde der Trigger ausgelöst? Begründung? Nein. Die PRIMARY KEY-Einschränkung hat verhindert, dass dieser Trigger ausgelöst wurde. ____________________________________________________________

____________________________________________________________

Page 610: Programmieren Einer Microsoft SQL Server 2000-Datenbank

44 Unterrichtseinheit 11: Implementieren von Triggern

Lernzielkontrolle

� Einführung in Trigger

� Definieren von Triggern

� Funktionsweise von Triggern

� Beispiele für Trigger

� Leistungsaspekte

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

1. Welche Schlüsselwerte müssen sich in der Spaltendefinition befinden, wenn der Leiter der Lagerhaltungskontrolle in der INSERT-Anweisung keinen Wert für die Products.ProductID-Spalte angibt? Die Spalte muss NULL-Werte zulassen oder muss, wenn keine NULL-Werte zulässig sind, eine DEFAULT-Einschränkung enthalten. ____________________________________________________________

____________________________________________________________

2. Wenn die Products-Tabelle eine PRIMARY KEY-Einschränkung für die ProductID-Spalte enthält, würde ein Trigger dann funktionieren? Begründung? Nein. Einschränkungen werden vor dem Ändern (Einfügen) von Daten verarbeitet. Eine PRIMARY KEY-Einschränkung lässt keine NULL-Werte zu, die INSERT-Anweisung würde daher nicht ausgeführt werden. ____________________________________________________________

____________________________________________________________

ThemaVertiefen Sie die Lernziele dieser Unterrichtseinheit, indem Sie die Kernpunkte wiederholen.

EinstiegDie Fragen zur Lernziel-kontrolle beziehen sich auf die Schlüsselkonzepte, die Inhalt dieser Unterrichts-einheit sind.

Gehen Sie anhand dieser Fragen die Themen der Unterrichtseinheit durch.

Klären Sie offene Fragen der Kursteilnehmer, bevor Sie fortfahren.

Page 611: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 11: Implementieren von Triggern 45

3. Wie müssen Sie vorgehen, damit ein Trigger ausgeführt werden kann? Sie könnten eine Standardaktion verwenden, durch die eine temporäre ProductID-Nummer als Platzhalter eingefügt wird, und könnten dann den korrekten Wert durch den Trigger zuweisen lassen. Die temporäre ProductID-Nummer müsste ein Wert außerhalb des Bereichs möglicher ProductID-Nummern sein. Beispielsweise wäre 9999999 eine gute ProductID-Nummer, da es unwahrscheinlich ist, dass sich mehr als 9.999.999 Produkte im Warenbestand befinden. Eine andere Möglichkeit bestünde darin, die PRIMARY KEY-Ein-schränkung zu löschen. Sie müssten diese ersetzen, indem Sie einen zusätzlichen Trigger zur Aufrechterhaltung und Überprüfung der referenziellen Integrität für die „ProductID“-Spalte erstellen. Sie müssten möglicherweise auch einen eindeutigen Index für die „ProductID“-Spalte erstellen. ____________________________________________________________

____________________________________________________________

Page 612: Programmieren Einer Microsoft SQL Server 2000-Datenbank

2 Unterrichtseinheit 11: Implementieren von Triggern

This page is intentionally left blank.

Page 613: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 12: Programmieren für mehrere Server

Inhalt

Übersicht 1

Einführung in verteilte Abfragen 2

Ausführen einer Ad-hoc-Abfrage für eine Remotedatenquelle 4

Einrichten einer Verbindungsserver- umgebung 7

Ausführen einer Abfrage auf einem Verbindungsserver 18

Ausführen einer gespeicherten Prozedur auf einem Verbindungsserver 23

Verwalten von verteilten Transaktionen 24

Ändern von Daten auf einem Verbindungsserver 25

Verwenden partitionierter Sichten 27

Empfohlene Methoden 34

Übungseinheit A: Verwenden von verteilten Daten 36

Lernzielkontrolle 48

Page 614: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Die in diesen Unterlagen enthaltenen Angaben und Daten können ohne vorherige Ankündigung geändert werden. Die in diesen Unterlagen genannten Firmen, Produkte, Menschen, Charaktere und/oder Daten sind frei erfunden und sollen keine wirklichen Individuen, Gesellschaften, Produkte oder Veranstaltungen darstellen, soweit nichts anderes angegeben ist. Die Benutzer/innen sind verpflichtet, sich an alle anwendbaren Urheberrechtsgesetze zu halten. Ohne ausdrückliche schriftliche Erlaubnis der Microsoft Corporation darf kein Teil dieser Unterlagen für irgendwelche Zwecke vervielfältigt oder übertragen werden, unabhängig davon, auf welche Art und Weise oder mit welchen Mitteln, elektronisch oder mechanisch, dies geschieht. Wenn auf dieses Dokument nur auf elektronischem Wege zugegriffen werden kann, sind Sie hiermit berechtigt, eine (1) Kopie zum persönlichen Gebrauch auszudrucken.

Microsoft Corporation kann Inhaber von Patenten oder Patentanträgen, Marken, Urheberrechten oder anderen gewerblichen Schutzrechten sein, die den Inhalt dieses Dokuments betreffen. Die Bereitstellung dieses Dokuments gewährt keinerlei Lizenzrechte an diesen Patenten, Marken, Urheberrechten oder anderen gewerblichen Schutzrechten, es sei denn, dies wurde ausdrücklich durch einen schriftlichen Lizenzvertrag mit der Microsoft Corporation vereinbart.

2000 Microsoft Corporation. Alle Rechte vorbehalten.

Microsoft, ActiveX, BackOffice, MS-DOS, PowerPoint, Visual Basic, Visual C++, Visual Studio, Windows und Windows NT sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern.

Andere in diesem Dokument aufgeführte Produkt- und Firmennamen sind möglicherweise Marken der jeweiligen Eigentümer.

Project Lead: Rich Rose Instructional Designers: Rich Rose, Cheryl Hoople, Marilyn McGill Instructional Software Design Engineers: Karl Dehmer, Carl Raebler, Rick Byham Technical Lead: Karl Dehmer Subject Matter Experts: Karl Dehmer, Carl Raebler, Rick Byham Graphic Artist: Kirsten Larson (Independent Contractor) Editing Manager: Lynette Skinner Editor: Wendy Cleary Copy Editor: Edward McKillop (S&T Consulting) Production Manager: Miracle Davis Production Coordinator: Jenny Boe Production Support: Lori Walker (S&T Consulting) Test Manager: Sid Benavente Courseware Testing: TestingTesting123 Classroom Automation: Lorrin Smith-Bates Creative Director, Media/Sim Services: David Mahlmann Web Development Lead: Lisa Pease CD Build Specialist: Julie Challenger Online Support: David Myka (S&T Consulting) Localization Manager: Rick Terek Operations Coordinator: John Williams Manufacturing Support: Laura King; Kathy Hershey Lead Product Manager, Release Management: Bo Galford Lead Product Manager, Data Base: Margo Crandall Group Manager, Courseware Infrastructure: David Bramble Group Product Manager, Content Development: Dean Murray General Manager: Robert Stewart

Page 615: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 12: Programmieren für mehrere Server iii

Hinweise für den Kursleiter Diese Unterrichtseinheit gibt den Kursteilnehmern eine Einführung in das Programmieren für mehrere Server.

Zunächst wird beschrieben, wie eine Ad-hoc-Abfrage für eine Remotedaten-quelle ausgeführt wird. Anschließend wird beschrieben, wie eine Verbindungs-serverumgebung eingerichtet wird, einschließlich der Einrichtung von Ver-bindungsservern und der Herstellung von Sicherheit zwischen Servern. Darüber hinaus wird erläutert, wie Verbindungsserver- und Pass-Through-Abfragen sowie gespeicherte Prozeduren auf einem Verbindungsserver ausgeführt, ver-teilte Daten geändert und verteilte Transaktionen verwaltet werden. Im letzten Abschnitt wird beschrieben, wie die Leistung durch die Verwendung partitio-nierter Sichten optimiert werden kann.

In der Übungseinheit richten die Kursteilnehmer eine Verbindungsumgebung ein, fragen Verbindungsdatenquellen ab, führen Pass-Through- und Ad-hoc-Abfragen sowie gespeicherte Remoteprozeduren aus und verwalten verteilte Transaktionen.

Am Ende dieser Unterrichtseinheit werden die Kursteilnehmer in der Lage sein, die folgenden Aufgaben auszuführen:

� Beschreiben verteilter Abfragen. � Erstellen von Ad-hoc-Abfragen, die auf Daten zugreifen, die in einer

Remotedatenquelle unter Microsoft® SQL Server™ 2000 oder einer OLE DB-Datenquelle gespeichert sind.

� Einrichten einer Verbindungsserverumgebung für den Zugriff auf Daten, die in einer Remotedatenquelle unter SQL Server 2000 oder einer OLE DB-Datenquelle gespeichert sind.

� Erstellen von Abfragen, die auf Daten eines Verbindungsservers zugreifen. � Ausführen von gespeicherten Prozeduren auf einem Remoteserver oder

einem Verbindungsserver. � Verwalten von verteilten Transaktionen. � Ändern verteilter Daten mit Hilfe von verteilten Transaktionen. � Verwenden partitionierter Sichten zur Leistungsverbesserung.

Unterlagen und Vorbereitung In diesem Abschnitt werden die Unterlagen und vorbereitenden Aufgaben erläutert, die nötig sind, um diese Unterrichtseinheit zu unterrichten.

Erforderliche Unterlagen Um diese Unterrichtseinheit zu unterrichten, benötigen Sie die Microsoft PowerPoint®-Datei 2328A_12.ppt.

Präsentation:60 Minuten

Übungseinheit:60 Minuten

Page 616: Programmieren Einer Microsoft SQL Server 2000-Datenbank

iv Unterrichtseinheit 12: Programmieren für mehrere Server

Vorbereitende Aufgaben Zur Vorbereitung dieser Unterrichtseinheit gehen Sie folgendermaßen vor:

� Lesen Sie alle Unterlagen für diese Unterrichtseinheit. � Arbeiten Sie die Übungseinheit durch.

Die Beispiele in dieser Unterrichtseinheit dienen lediglich als Referenz. Sie sind nicht ausführbar.

Strategie für die Unterrichtseinheit Verwenden Sie die folgende Strategie, um diese Unterrichtseinheit zu präsentieren:

� Einführung in verteilte Abfragen Beschreiben Sie verteilte Abfragen und wie mit ihnen auf Daten mehrerer heterogener Datenquellen, die auf demselben oder verschiedenen Computern gespeichert sein können, zugegriffen wird. Vergleichen Sie die beiden Techniken - Ad-hoc-Abfrage und Verbindungsserver-Abfrage - für den Zugriff von SQL Server auf eine OLE DB-Datenquelle, und erläutern Sie, wann sie verwendet werden. Zeigen Sie, wie der Ort der Verarbeitung einer verteilten Abfrage, der lokale Server oder ein Remoteserver, ange-geben wird.

� Ausführen einer Ad-hoc-Abfrage für eine Remotedatenquelle Beschreiben Sie, wann und wie die OPENROWSET-Funktion zum Aus-führen einer Ad-hoc-Abfrage für eine Remotedatenquelle verwendet wird.

� Einrichten einer Verbindungsserverumgebung Erläutern Sie die Vorteile der Einrichtung einer Umgebung mit Verbindungsservern. In dieser Umgebung können Sie steuern, wo die Ab-frage ausgeführt wird (lokal oder remote). Verbindungsserver ermöglichen eine flexiblere Sicherheitsumgebung für den Zugriff auf Remotedaten. Sie haben die Möglichkeit, Benutzeranmeldeinformationen an den Verbin-dungsserver zu übergeben oder lokale SQL Server-Konten bzw. Microsoft Windows® 2000-Gruppen Konten oder Gruppen auf dem Verbindungs-server zuzuordnen.

� Ausführen einer Abfrage auf einem Verbindungsserver Weisen Sie die Kursteilnehmer auf die vierteiligen Namen hin, die zum Ab-fragen verknüpfter Daten erforderlich sind. Erläutern Sie kurz, warum be-stimmte Transact-SQL-Anweisungen und -Aktionen auf Verbindungs-servern nicht ausgeführt werden können. Beschreiben Sie ausführlich, wann und wie Verbindungsserver-Abfragen und Pass-Through-Abfragen ausge-führt werden.

� Ausführen einer gespeicherten Prozedur auf einem Verbindungsserver Weisen Sie darauf hin, dass gespeicherte Prozeduren auf Verbingungs-servern ausgeführt werden können.

Wichtig

Page 617: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 12: Programmieren für mehrere Server v

� Verwalten von verteilten Transaktionen Weisen Sie die Kursteilnehmer darauf hin, dass sie verteilte Anwendungen mit Hilfe integrierter und benutzerdefinierter Komponenten, die einge-kapselte Geschäftslogik enthalten, erstellen können. Komponenten können die von den Windows 2000-Komponentendiensten bereitgestellten Dienste verwenden.

� Ändern von Daten auf einem Verbindungsserver Weisen Sie darauf hin, dass Änderungen, die in mehreren Datenbanken konsistent sein müssen, in einer verteilten Transaktion ausgeführt werden sollten. Verwenden Sie die BEGIN DISTRIBUTED TRANSACTION-Anweisung mit einer entsprechenden COMMIT- oder ROLLBACK-An-weisung.

� Verwenden partitionierter Sichten Erläutern Sie, dass partitionierte Sichten die Leistung durch Verteilen der Verarbeitung auf mehrere Server verbessern können.

AnpassungsinformationenDieser Abschnitt beschreibt die Anforderungen zum Einrichten der Übungs-einheiten für eine Unterrichtseinheit sowie die Konfigurationsänderungen, die während der Übungseinheiten an den Kursteilnehmercomputern vorgenommen werden. Diese Informationen sollen Ihnen beim Replizieren oder Anpassen der Microsoft Official Curriculum-Courseware (MOC) helfen.

Die Übungseinheit in dieser Unterrichtseinheit hängt auch von der Schulungsraumkonfiguration ab, die im Abschnitt „Anpassungsinformationen“ am Ende des Dokuments Handbuch für das Einrichten von Schulungs-computern für Kurs 2328A, Programmieren einer Microsoft SQL Server 2000-Datenbank, angegeben ist.

Einrichten der Übungseinheit Im folgenden Abschnitt werden die Anforderung zum Einrichten der Übungs-einheit in dieser Unterrichtseinheit beschrieben.

Anforderung zum Einrichten der Übungseinheit Für die Übungseinheit in dieser Unterrichtseinheit muss sich die ClassNorthwind-Datenbank in dem für die Übungseinheit erforderlichen Zustand befinden. Um die Kursteilnehmercomputer so vorzubereiten, dass sie diese Anforderung erfüllen, führen Sie eine der folgenden Aktionen aus:

� Bearbeiten der vorhergehenden Übungseinheit. � Ausführen der Batchdatei C:\Moc\2328A\Batches\Restore12.cmd.

Wenn dieser Kurs angepasst wurde, müssen Kursteilnehmer die Batchdatei C:\Moc\2328A\Batches\Restore12.cmd ausführen, damit sicherge-stellt ist, dass die Übungseinheit ordnungsgemäß durchgeführt werden kann.

Wichtig

Achtung

Page 618: Programmieren Einer Microsoft SQL Server 2000-Datenbank

vi Unterrichtseinheit 12: Programmieren für mehrere Server

Ergebnisse der Übungseinheit Auf den Kursteilnehmercomputern gibt es keine Konfigurationsänderungen, die die Replikation oder die Anpassung betreffen.

Page 619: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 12: Programmieren für mehrere Server 1

Übersicht� Einführung in verteilte Abfragen

� Ausführen einer Ad-hoc-Abfrage für eine Remotedatenquelle

� Einrichten einer Verbindungsserverumgebung

� Ausführen einer Abfrage auf einem Verbindungsserver

� Ausführen einer gespeicherten Prozedur auf einem Verbindungsserver

� Verwalten von verteilten Transaktionen

� Ändern von Daten auf einem Verbindungsserver

� Verwenden partitionierter Sichten

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Diese Unterrichtseinheit gibt eine Einführung in das Programmieren für meh-rere Server. Es wird beschrieben, wie eine Ad-hoc-Abfrage für eine Remote-datenquelle ausgeführt wird. Anschließend wird beschrieben, wie eine Verbin-dungsserverumgebung eingerichtet wird, einschließlich der Einrichtung von Verbindungsservern und der Herstellung von Sicherheit zwischen Servern. Darüber hinaus wird erläutert, wie Verbindungsserver- und Pass-Through-Ab-fragen auf einem Verbindungsserver sowie gespeicherte Prozeduren auf einem Verbindungsserver ausgeführt, verteilte Daten geändert und verteilte Trans-aktionen verwaltet werden. Im letzten Abschnitt wird beschrieben, wie die Leis-tung durch die Verwendung partitionierter Sichten optimiert werden kann.

Am Ende dieser Unterrichtseinheit werden Sie in der Lage sein, die folgenden Aufgaben auszuführen:

� Beschreiben verteilter Abfragen. � Erstellen von Ad-hoc-Abfragen, die auf Daten zugreifen, die in einer

Remotedatenquelle unter Microsoft® SQL Server™ 2000 oder einer OLE DB-Datenquelle gespeichert sind.

� Einrichten einer Verbindungsserverumgebung für den Zugriff auf Daten, die in einer Remotedatenquelle unter SQL Server 2000 oder einer OLE DB-Datenquelle gespeichert sind.

� Erstellen von Abfragen, die auf Daten eines Verbindungsservers zugreifen. � Ausführen von gespeicherten Prozeduren auf einem Remoteserver oder

einem Verbindungsserver. � Verwalten von verteilten Transaktionen. � Ändern verteilter Daten mit Hilfe von verteilten Transaktionen. � Verwenden partitionierter Sichten zur Leistungsverbesserung.

ThemaGeben Sie eine Übersicht über die Themen und Lern-ziele dieser Unterrichts-einheit.

EinstiegIn dieser Unterrichtseinheit erhalten Sie Informationen zum Programmieren für mehrere Server mit Hilfe von verteilten Abfragen, verteilten Transaktionen und partitionierten Sichten.

Page 620: Programmieren Einer Microsoft SQL Server 2000-Datenbank

2 Unterrichtseinheit 12: Programmieren für mehrere Server

Einführung in verteilte Abfragen

� Zugreifen auf Remotedaten

� Ad-hoc-Abfrage

� Verbindungsserverabfrage

� Angeben des Verarbeitungsortes für verteilte Abfragen

� Lokaler Server mit SQL Server

� OLE DB-Remotedatenquelle (Pass-Through-Abfrage )

� Überprüfen von Verbindungseinstellungen

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Durch verteilte Abfragen wird auf Daten mehrerer heterogener Datenquellen zugegriffen, die auf einem lokalen oder auf einem Remotecomputer gespeichert sind. SQL Server unterstützt verteilte Abfragen mit Hilfe von Microsoft OLE DB-Provider.

Verteilte Abfragen ermöglichen SQL Server-Benutzern den Zugriff auf:

� Verteilte Daten, die auf mehreren Computern mit SQL Server gespeichert sind.

� Heterogene Daten, die in verschiedenen relationalen und nicht relationalen Datenquellen gespeichert sind und für die entweder ein OLE DB-Provider oder ein ODBC-Treiber (Open Database Connectivity) vorhanden ist.

Zugreifen auf Remotedaten Für den Zugriff auf OLE DB-Datenquellen über SQL Server stehen Ihnen zwei Techniken zur Verfügung:

� Ad-hoc-Abfrage Wenn Sie auf Remotedaten zugreifen möchten, in Zukunft jedoch voraus-sichtlich keine weiteren Zugriffe auf die Datenquelle erfolgen werden, kön-nen Sie mit Hilfe der OPENROWSET- oder OPENDATASOURCE-Funk-tion eine Ad-hoc-Abfrage erstellen.

� Verbindungsserverabfrage Um wiederholt auf Remotedaten zuzugreifen, können Sie einen Verbin-dungsserver und einen vierteiligen Objektnamen verwenden. Ein Verbin-dungsserver ist eine OLE DB-Datenquelle, die bereits auf dem lokalen Server mit SQL Server registriert ist. Wenn auf diese verwiesen wird, weiß der lokale Server, wo die Remotedaten und -objekte zu finden sind. Mit Hilfe von Verbindungsservern lassen sich SQL Server-übergreifende Verknüpfungen und andere Abfragen auf effiziente Weise bereitstellen, wenn Sie bereits im Voraus wissen, dass bestimmte Datenquellen zur Verfügung stehen müssen.

ThemaGeben Sie eine Übersicht über verteilte Abfragen.

EinstiegDurch verteilte Abfragen wird auf Daten mehrerer heterogener Datenquellen zugegriffen, die auf dem lokalen oder auf dem Remotecomputer gespeichert sind.

Page 621: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 12: Programmieren für mehrere Server 3

Angeben des Verarbeitungsortes für verteilte Abfragen Beim Abfragen einer OLE DB-Datenquelle können Sie angeben, ob die Abfrage lokal oder auf einem Remoteserver verarbeitet werden soll.

� Lokaler Server mit SQL Server Bei Verbindungsservern werden verteilte Abfragen von SQL Server standardmäßig auf dem lokalen Server verarbeitet.

� OLE DB-Remotedatenquelle Sie können die OPENQUERY-Funktion für Verbindungsserver verwenden, um anzugeben, dass die Verarbeitung auf dem Remoteserver ausgeführt wird. Eine solche Abfrage wird als Pass-Through-Abfrage bezeichnet. Wenn Sie mit Hilfe der OPENROWSET-Funktion eine Ad-hoc-Abfrage für eine Remotedatenquelle ausführen, wird die Abfrage ebenfalls auf dem Remotecomputer verarbeitet.

Überprüfen von Verbindungseinstellungen Bei jeder Sitzung, während der verteilte Abfragen ausgegeben werden, müssen die Optionen ANSI_NULLS und ANSI_WARNINGS aktiviert sein. Wenn Sie verteilte Abfragen mit Hilfe von ODBC oder SQL Server Query Analyzer aus-führen, sind diese Optionen standardmäßig aktiviert. Wenn Sie das osql-Befehlszeilen-Dienstprogramm verwenden, müssen Sie diese Optionen explizit aktivieren.

Page 622: Programmieren Einer Microsoft SQL Server 2000-Datenbank

4 Unterrichtseinheit 12: Programmieren für mehrere Server

Ausführen einer Ad-hoc-Abfrage für eine Remote-datenquelle

� Verwenden Sie die OPENROWSET-Funktion, wenn Sie voraussichtlich nur gelegentlich auf die Datenquellen zugreifen werden

� Verwenden Sie die OPENROWSET-Funktion, um Zugriff auf Remotedaten, ohne dass ein Verbindungsserver eingerichtet werden muss, zu erhalten

SELECT a.* FROM OPENROWSET('SQLOLEDB', 'LONDON1'; 'newcustomer';'mypassword','SELECT ProductID, UnitPriceFROM Northwind.dbo.Products ORDER BY UnitPrice')AS a

SELECT a.* FROM OPENROWSET('SQLOLEDB', 'LONDON1'; 'newcustomer';'mypassword','SELECT ProductID, UnitPriceFROM Northwind.dbo.Products ORDER BY UnitPrice')AS a

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Mit Hilfe eines OLE DB-Providers können Sie ad hoc auf Daten von Remote-ressourcen zugreifen. Die OPENROWSET-Funktion ermöglicht es Ihnen, eine Verbindung zu einer Remotequelle herzustellen und auf Daten dieser Quelle zuzugreifen, ohne dass ein Verbindungsserver eingerichtet werden muss. Ver-wenden Sie die OPENROWSET-Funktion für solche Datenquellen, auf die Sie in Zukunft voraussichtlich nur gelegentlich zugreifen werden.

XOPENROWSET('provider_name'{'data -source'; 'user_id' ; 'password' | 'provider_string'}, {[catalog.][schema.]object | 'query'})

In der folgenden Tabelle sind die Parameter der OPENROWSET-Funktion beschrieben.

Parameter Beschreibung

provider_name Eindeutiger, benutzerfreundlicher Name für den OLE DB-Provider, der dieser Datenquelle entspricht.

data_source Der durch den OLE DB-Provider ausgewertete Name der Daten-quelle.

user_id Benutzername, der an den angegebenen OLE DB-Provider über-mittelt wird.

password Kennwort, das an den OLE DB-Provider übermittelt wird.

provider_string OLE DB-Provider-spezifische Verbindungszeichenfolge, über die eine eindeutige Datenquelle identifiziert wird.

catalog Katalog oder Datenbank, in dem/der sich das Objekt befindet.

schema Schema oder Besitzer eines Objekts.

ThemaBeschreiben Sie, wie eine Ad-hoc-Abfrage für eine Remotedatenquelle ausge-führt wird.

EinstiegMit Hilfe eines OLE DB-Providers können Sie ad hoc auf Daten von Remote-ressourcen zugreifen.

Page 623: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 12: Programmieren für mehrere Server 5

(Fortsetzung) Parameter Beschreibung

object Eindeutiger Name des Objekts, das verarbeitet wird.

query Zeichenfolge mit einer Abfrage, die an den Provider gesendet und von diesem ausgeführt werden soll. Wenn anstatt eines Remote-objektnamens eine Abfrage angegeben wird, wird die Abfrage als Pass-Through-Abfrage ausgeführt.

In der folgenden Tabelle sind einige typische OLE DB-Providernamen auf-geführt. Eine vollständigere Liste mit OLE DB-Providernamen für verschie-dene Datenquellen finden Sie in der SQL Server-Onlinedokumentation.

Produkt Providername

SQL Server N'SQLOLEDB'

Microsoft OLE DB-Provider für Access (Jet)

'Microsoft.Jet.OLEDB.4.0'

Microsoft OLE DB-Provider für Oracle

'MSDAORA'

data_source ist der SQL*Net-Aliasname für die Oracle-Datenbank, die als Verbindungsserver hinzugefügt werden soll.

OLE DB-Provider für ODBC (Unter Verwendung des data_source-Parameters)

Der provider_name lautet 'MSDASQL' und die data_source lautet 'LocalServer'.

OLE DB-Provider für ODBC (Unter Verwendung des provider_string-Parameters)

Der provider_name lautet 'MSDASQL' und der provider_string lautet DRIVER={SQL Server} SERVER=servernameUID=login;PWD=password;'

Data Transformation Services (DTS)

DTSPackageDSO

Microsoft-Verzeichnisdienste ADSDSOObject

Microsoft-Indexdienst MSIDXS

Beachten Sie die folgenden Aspekte und Richtlinien, wenn Sie bei der Aus-führung von Abfragen die OPENROWSET-Funktion verwenden:

� Sie müssen Katalog- und Schemanamen bereitstellen, wenn von der Daten-quelle mehrere Kataloge und Schemata (bei SQL Server Datenbank- und Objektbesitzer) unterstützt werden.

� Über die an den OLE DB-Provider übermittelte user-id werden die der Verbindung zugeordneten Berechtigungen bestimmt.

� Anstelle eines Tabellennamens kann in der FROM-Klausel einer SELECT-Anweisung die OPENROWSET-Funktion verwendet werden.

Page 624: Programmieren Einer Microsoft SQL Server 2000-Datenbank

6 Unterrichtseinheit 12: Programmieren für mehrere Server

In diesem Beispiel wird über den systemeigenen OLE DB-Provider für SQL Server auf Informationen in der Northwind-Datenbank auf dem Server mit SQL Server „London1“ zugegriffen. Alle Verbindungsinformationen sowie die zu verarbeitende Abfrage sind in den Argumenten der OPENROWSET-Funktion enthalten. Für die Anmeldung an dem Remoteserver wird das newcustomer-Benutzerkonto verwendet.

SELECT a.* FROM OPENROWSET('SQLOLEDB', 'LONDON1'; 'newcustomer'; 'mypassword','SELECT ProductID, UnitPrice FROM Northwind.dbo.Products ORDER BY UnitPrice') AS a

In diesem Beispiel wird über den OLE DB-Provider für Microsoft Access (Jet) auf die Orders-Tabelle in der Northwind-Datenbank, die sich in einer Access-Remotedatenbank befindet, zugegriffen.

SELECT a.* FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0' 'C:\MSOffice\Access\Samples\Northwind.mdb';'newcustomer'; 'mypassword', Orders) AS a

In diesem Beispiel wird die Orders-Tabelle in der Northwind-Datenbank, die sich in einer Access-Remotedatenbank befindet, mit der Customers-Tabelle in der Northwind-Datenbank auf dem lokalen Server mit SQL Server verknüpft.

USE Northwind SELECT cust.* ord.* FROM Customers as cust JOIN OPENROWSET('Microsoft.Jet.OLEDB.4.0''C:\MSOffice\Access\Samples\Northwind.mdb'';'newcustomer'; 'mypassword', Orders) AS ord On cust.customerid = ord.customerid

Beispiel 1

Beispiel 2

Beispiel 3

Page 625: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 12: Programmieren für mehrere Server 7

���� Einrichten einer Verbindungsserverumgebung

Andere DatenquellenRemoteservermit SQL Server

� SQL Server erlaubtden Zugriff auf andereDatenquellen

� Remoteserver mussmit dem lokalenComputer mit SQLServer verbundensein

Lokaler Server mit SQL Server

Remoteservermit SQL Server

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Um mit Daten aus einer Remotedatenquelle von SQL Server oder einer anderen OLE DB-Datenquelle arbeiten zu können, müssen Sie einen Verbindungsserver einrichten. Ein Verbindungsserver ist eine OLE DB-Datenquelle, die bereits auf dem lokalen Server mit SQL Server registriert ist. Wenn auf diese verwiesen wird, weiß der lokale Server, wo die Remotedaten und -objekte zu finden sind.

Vorteile von Verbindungsservern Verbindungsserver ermöglichen das Erstellen SQL Server-übergreifender Ver-knüpfungen und anderer Abfragen, wenn Sie bereits im Voraus wissen, dass bestimmte Datenquellen zur Verfügung stehen sollen.

Mit Hilfe eines Verbindungsservers können Sie Transact-SQL-Anweisungen direkt an eine Remoteinstanz von SQL Server senden. Diese Aktionen können als Teil einer verteilten Transaktion ausgeführt werden. Beachten Sie bei der Verwendung von Verbindungsservern die folgenden Aspekte und Richtlinien:

� Sie können auf verteilte Daten zugreifen, die auf mehreren Servern mit SQL Server gespeichert sind, und Sie können auf heterogene Daten zu-greifen, die in verschiedenen relationalen und nicht relationalen Daten-quellen gespeichert sind.

� Es kann eine andere Datenquelle als SQL Server als Verbindungsserver definiert werden, wenn für diese Quelle ein OLE DB-Provider vorhanden ist.

� Wenn Sie regelmäßig auf Informationen zugreifen, die sich auf einem anderen Computer mit SQL Server befinden, sollten Sie diesen Remote-server auf Ihrem lokalen SQL Server-Computer als Verbindungsserver definieren.

� Informationen über Verbindungsserver finden Sie in der sysservers-Systemtabelle.

ThemaBeschreiben Sie die Vorteile einer verteilten Umgebung, und erläutern Sie die zum Einrichten einer solchen Umgebung erforderlichen Schritte.

EinstiegUm mit Daten aus einer Remotedatenquelle von SQL Server oder einer anderen OLE DB-Daten-quelle arbeiten zu können, müssen Sie einen Verbin-dungsserver einrichten.

Page 626: Programmieren Einer Microsoft SQL Server 2000-Datenbank

8 Unterrichtseinheit 12: Programmieren für mehrere Server

Einrichten von Verbindungsservern Um Verbindungsserver einzurichten, müssen Sie zunächst eine Verbindung mit einer Remotedatenquelle herstellen und dann die Sicherheit zwischen den Servern einrichten.

Page 627: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 12: Programmieren für mehrere Server 9

Herstellen einer Verbindung mit einer Remotedatenquelle

� Herstellen einer Verbindung mit einem Remoteservermit SQL Server

� Herstellen einer Verbindung mit einer OLE DB-Datenquelle

EXEC sp_addlinkedserver @server = 'AccountingServer', @svrproduct = 'SQL Server'

EXEC sp_addlinkedserver @server = 'AccountingServer', @svrproduct = 'SQL Server'

EXEC sp_addlinkedserver @server = 'OracleFinance', @svrproduct = 'Oracle',@provider = 'MSDAORA', @datasrc = 'OracleDB'

EXEC sp_addlinkedserver @server = 'OracleFinance', @svrproduct = 'Oracle',@provider = 'MSDAORA', @datasrc = 'OracleDB'

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Um Transact-SQL-Anweisungen auf einem Remoteserver mit SQL Server oder für eine OLE DB-Datenquelle auszuführen, müssen Sie eine Verbindung mit dem Server oder der Datenquelle herstellen.

Sie können eine Verbindung mit dem Remoteserver mit SQL Server mit Hilfe von SQL Server Enterprise Manager oder der gespeicherten Systemprozedur sp_addlinkedserver herstellen. Mit der gespeicherten Systemprozedur sp_addlinkedserver wird ein Remoteserver mit SQL Server auf dem lokalen Computer definiert und der OLE DB-Provider angegeben.

sp_addlinkedserver [ @server = ] 'server' [ , [ @srvproduct = ] 'product_name' ] [ , [ @provider = ] 'provider_name' ] [ , [ @datasrc = ] 'data_source' ] [ , [ @location = ] 'location' ] [ , [ @provstr = ] 'provider_string' ] [ , [ @catalog = ] 'catalog' ]

Die gespeicherte Systemprozedur sp_addserver ist abwärtskompatibel, Sie sollten jedoch sp_addlinkedserver verwenden.

In der folgenden Tabelle sind die Parameter der gespeicherten Systemprozedur sp_addlinkedserver beschrieben.

Parameter Beschreibung

@server Name des zu erstellenden Verbindungsservers.

@svrproduct Produktname der OLE DB-Datenquelle.

@provider Eindeutiger, benutzerfreundlicher Name für den OLE DB-Provider, der dieser Datenquelle entspricht.

@datasrc Durch den OLE DB-Provider ausgewerteter Name der Datenquelle.

@location Durch den OLE DB-Provider ausgewerteter Speicherort der Datenquelle.

ThemaBeschreiben Sie, wie eine Verbindung mit einem Remoteserver oder einer OLE DB-Datenquelle hergestellt wird.

EinstiegUm Transact-SQL-Anwei-sungen auf einem Remote-server mit SQ Server oder für eine OLE DB-Daten-quelle auszuführen, müssen Sie eine Verbindung mit dem Server oder der Daten-quelle herstellen.

Methodischer Hinweis Führen Sie vor, wie mit Hilfe von SQL Server Enterprise Manager eine Verbindung mit einer Remotedaten-quelle hergestellt wird.

Syntax

Page 628: Programmieren Einer Microsoft SQL Server 2000-Datenbank

10 Unterrichtseinheit 12: Programmieren für mehrere Server

(Fortsetzung) Parameter Beschreibung

@provstr OLE DB-Provider-spezifische Verbindungszeichenfolge, über die eine eindeutige Datenquelle identifiziert wird.

@catalog Katalog, der beim Herstellen der Verbindung mit dem OLE DB-Provider verwendet wird.

Herstellen einer Verbindung mit einem Remoteserver mit SQL Server Wenn Sie eine Verbindung mit einem Server mit SQL Server herstellen möch-ten, müssen Sie lediglich die Parameter @srvproduct und @server angeben.Die Parameter @provider, @datasrc, @location, @provstr und @catalogmüssen nicht angegeben werden. Es wird automatisch der OLE DB-Provider von SQL Server (N'SQLOLEDB') verwendet.

In diesem Beispiel wird AccountingServer, ein Computer mit SQL Server, der Liste der Verbindungsserver, die auf dem lokalen SQL Server-Computer zur Verfügung stehen, hinzugefügt.

EXEC sp_addlinkedserver 'AccountingServer', 'SQL Server'

Herstellen einer Verbindung mit einer OLE DB-Datenquelle Wenn Sie eine Verbindung mit einer anderen Datenquelle als SQL Server herstellen möchten, müssen Sie beim Erstellen eines Verbindungsservers sowohl die Parameter @provider, @datasrc, @location, @provstr und @catalog als auch die Parameter @srvproduct und @server angeben.

In diesem Beispiel wird der Oracle-Server „OracleFinance“ der Liste der Ver-bindungsserver, die auf dem lokalen SQL Server-Computer zur Verfügung stehen, hinzugefügt. In diesem Beispiel wird vorausgesetzt, dass ein SQL*Net-Alias von OracleDB erstellt wurde. Dieser Alias wird für den @datasrc-Parameter verwendet.

EXEC sp_addlinkedserver 'OracleFinance', 'Oracle', 'MSDAORA', 'OracleDB'

Beispiel 1

Beispiel 2

Page 629: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 12: Programmieren für mehrere Server 11

Einrichten der Sicherheit für Verbindungsserver

� Der lokale Server muss sich im Namen des Benutzers am Remoteserver mit SQL Server anmelden

� Wenn das Anmeldekonto des Benutzers auf beiden Servern vorhanden ist, kann es zur Anmeldung am Remoteserververwendet werden

� Mit Hilfe von „sp_addlinkedsrvlogin“ können Sie Anmelde-konten und Kennwörter zwischen Servern zuordnen

� Mit Hilfe von Security Account Delegation können Sie sich mit mehreren Servern und einer Authentifizierung verbinden

� Ohne Security Delegation müssen Sie die Verbindung von einem lokalen Anmeldekonto zu einem Anmeldekonto auf dem Verbindungsserver einrichten

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Sie müssen gegebenenfalls die Sicherheit zwischen dem lokalen Server und einem Remoteserver einrichten. Beachten Sie beim Einrichten der Sicherheit zwischen lokalen Servern und Remoteservern mit SQL Server die folgenden Aspekte:

� Wenn sich ein Benutzer am lokalen Server mit SQL Server anmeldet und eine verteilte Abfrage ausführt, meldet sich der lokale Server mit SQL Server im Namen des Benutzers am Remoteserver mit SQL Server an.

� Wenn das Anmeldekonto und das Kennwort des Benutzers sowohl auf dem lokalen Server als auch auf dem Remoteserver mit SQL Server vorhanden sind, kann der lokale Server mit SQL Server die Anmeldeinformationen des Benutzers zur Anmeldung am Remoteserver mit SQL Server verwenden. Es ist zweckmäßig, die Sicherheit auf diese Weise einzurichten, wenn von bei-den Servern Domänenkonten verwendet werden.

� Mit Hilfe der gespeicherten Systemprozedur sp_addlinkedsrvlogin können Sie Anmeldekonten und Kennwörter zwischen lokalen Servern und Remote-servern mit SQL Server zuordnen. Wenn Sie einem Remoteanmeldekonto ein lokales Konto zuordnen, ist es nicht erforderlich, dass Sie auf dem Remoteserver mit SQL Server für jeden Benutzer ein Anmeldekonto und ein Kennwort erstellen. Ein Benutzer kann sich beispielsweise an einer Clientanwendung anmelden, die auf einen lokalen Server mit SQL Server zugreift. Der lokale Server mit SQL Server greift anschließend im Namen des Benutzers auf den Verbin-dungsserver zu und verwendet dazu für alle Endbenutzer ein einziges An-meldekonto. Das Anmeldekonto auf dem Verbindungsserver, dem das lokale Anmeldekonto zugeordnet ist, besitzt die Berechtigung für den Zu-griff auf eine bestimmte Tabelle.

ThemaBeschreiben Sie, wie die Sicherheit zwischen Ver-bindungsservern einge-richtet wird.

EinstiegSie müssen gegebenenfalls die Sicherheit zwischen dem lokalen Server und einem Remoteserver einrichten.

Page 630: Programmieren Einer Microsoft SQL Server 2000-Datenbank

12 Unterrichtseinheit 12: Programmieren für mehrere Server

� Es ist möglich, Verbindungen mit mehreren Servern herzustellen und bei jedem Serverwechsel die Authentifizierungs-Anmeldeinformationen des ursprünglichen Clients beizubehalten Dies wird als Delegieren des Sicher-heitskontos bezeichnet. Um diese Delegierung nutzen zu können, müssen alle Server unter Microsoft Windows® 2000 ausgeführt werden und Provider verwenden, die SSPI (Security Support Provider Interface) ein-setzen. Außerdem müssen Sie den Active Directory™-Verzeichnisdienst verwenden.

Weiter Informationen zum Delegieren von Sicherheitskonten finden Sie in der Windows 2000-Dokumentation.

� Wenn der Verbindungsserver das Delegieren von Sicherheitskonten nicht unterstützt, müssen Sie eine lokale Anmeldezuordnung zwischen einem Anmeldekonto für die Windows-Authentifizierung und einem Anmelde-konto auf dem Verbindungsserver einrichten. Sie müssen eine Kontozuord-nung einrichten, um eine Kommunikation über Verbindungsserver zu er-möglichen.

sp_addlinkedsrvlogin [ @rmtsrvname = ] 'rmtsrvname' [ , [ @useself = ] 'useself' ] [ , [ @locallogin = ] 'locallogin' ] [ , [ @rmtuser = ] 'rmtuser' ] [ , [ @rmtpassword = ] 'rmtpassword'

In der folgenden Tabelle sind die Parameter der gespeicherten Systemprozedur sp_addlinkedsrvlogin aufgelistet.

Parameter Beschreibung

@rmtsrvname Name eines Verbindungsservers, auf den sich die Benutzernamen-zuordnung bezieht.

@useself Bestimmt, ob von den SQL Server-Anmeldekonten die eigenen Anmeldeinformationen oder die Werte der Argumente @rmtuserund @rmtpassword verwendet werden, um eine Verbindung mit dem Server herzustellen, der über das Argument @rmtsrvnameangegeben wurde. Für ein Anmeldekonto für die Windows-Authen-tifizierung ist der Wert TRUE für @useself ungültig.

@locallogin Ein optionales Anmeldekonto auf dem lokalen Server. Falls dieser Parameter verwendet wird, muss @locallogin bereits auf dem lokalen Server vorhanden sein. Wenn dieser Wert NULL ist, werden alle Anmeldekonten auf dem lokalen Server mit SQL Server dem mit @rmtuser angegebenen Konto auf dem Remoteserver zugeordnet.

@rmtuser Der optionale Benutzername für die Verbindung mit @rmtsrvname, wenn der Wert für @useself FALSE ist.

@rmtpassword Das optionale Kennwort, das @rmtuser zugeordnet ist.

Anmerkung

Syntax

Page 631: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 12: Programmieren für mehrere Server 13

In diesem Beispiel kann ein Benutzer, der sich mit dem Anmeldekonto AccountWriter an dem lokalen Server mit SQL Server anmeldet, über die Anmeldeinformationen des Anmeldekontos rmtAccountWriter auf Remote-daten auf dem Server mit SQL Server „AccountingServer“ zugreifen.

EXEC sp_addlinkedsrvlogin @rmtsrvname = 'AccountingServer', @useself = 'false', @locallogin = 'Accountwriter', @rmtuser = 'rmtAccountWriter', @rmtpassword = 'financepass'

In diesem Beispiel wird die Sicherheit zwischen einem lokalen Server mit SQL Server und einem Verbindungsserver mit SQL Server eingerichtet. Be-nutzer des lokalen Servers mit SQL Server, die auf Remotedaten auf dem Verbindungsserver „AccountingServer“ zugreifen, sind über das Benutzerkonto AccountingServer/allcustomers am Remoteserver mit SQL Server ange-meldet.

EXEC sp_addlinkedsrvlogin @rmtsrvname = 'AccountingServer', @useself = 'false', @rmtuser= 'allcustomers'

Beispiel 1

Beispiel 2

Page 632: Programmieren Einer Microsoft SQL Server 2000-Datenbank

14 Unterrichtseinheit 12: Programmieren für mehrere Server

Konfigurieren von Optionen für Verbindungsserver

� Kompatibel mit Sortierung

� Name der Sortierung und Remotesortierung verwenden

� Datenzugriff

� RPC und RPC-Ausgabe

� Verzögerte Schemagültigkeitsprüfung

USE master

EXEC sp_serveroption 'AccountingServer',

'collation compatible', true

USE master

EXEC sp_serveroption 'AccountingServer',

'collation compatible', true

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Mit Hilfe der gespeicherten Systemprozedur sp_serveroption können Sie Optionen für Verbindungsserver festlegen. Die sp_serveroption-Prozedur kann nur von Mitgliedern der sysadmin-Serverrolle zum Einstellen von Server-optionen verwendet werden.

sp_serveroption ['server'] [, 'option_name'] [, 'option_value']

Die folgenden Optionen wirken sich auf Verbindungsserver aus.

Kompatibel mit Sortierung Diese Option wirkt sich auf die Ausführungsleistung einer verteilten Abfrage für Verbindungsserver aus. Wenn für diese Option true festgelegt ist, geht SQL Server davon aus, dass alle Spalten und Zeichensätze auf dem Remote-server mit dem Zeichensatz und der Sortierung des lokalen Servers kompatibel sind. Dies ermöglicht SQL Server, Vergleiche für Zeichenspalten an den Provider zu senden. Wenn diese Option nicht aktiviert ist, muss SQL Server alle Zeilen an den lokalen Server zurückgeben, um Vergleiche in Zeichen-spalten durchzuführen.

Diese Option sollte nur dann aktiviert werden, wenn die Datenquelle, die den Verbindungsserver darstellt, denselben Zeichensatz und dieselbe Sortierung besitzt wie der lokale Server.

In diesem Beispiel wird der Verbindungsserver „AccountingServer“ so kon-figuriert, dass er mit der Sortierung des lokalen Servers mit SQL Server kom-patibel ist.

USE master EXEC sp_serveroption 'AccountingServer', 'collation compatible', true

ThemaBeschreiben Sie, wie die Sicherheit zwischen Verbin-dungsservern eingerichtet wird.

EinstiegSie müssen gegebenenfalls die Sicherheit zwischen dem lokalen Server und einem Remoteserver einrichten.

Syntax

Beispiel

Page 633: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 12: Programmieren für mehrere Server 15

„Name der Sortierung“ und „Remotesortierung verwenden“ Die folgenden beiden Optionen werden oft gemeinsam verwendet.

Diese Option gibt den Namen der Sortierung an, die von der Remotedatenquelle verwendet wird, wenn Remotesortierung verwendenauf true gesetzt ist und die Datenquelle keine SQL Server-Datenquelle ist. Für diese Option gelten folgende Bedingungen:

� Der Name muss eine von SQL Server unterstützte Sortierung sein. � Verwenden Sie diese Option, wenn Sie auf eine andere OLE DB-Daten-

quelle als SQL Server zugreifen und diese Datenquelle eine Sortierung besitzt, die mit einer der SQL Server-Sortierungen übereinstimmt.

� Der Verbindungsserver muss eine einzelne Sortierung unterstützen, die für alle Spalten in diesem Server verwendet wird.

Diese Option bestimmt, ob SQL Server die Sor-tierung einer Remotespalte oder eines lokalen Servers verwendet.

� Wenn true festgelegt ist, wird für SQL Server-Datenquellen die Sortierung der Remotespalten und für Datenquellen, die keine SQL Server-Daten-quellen sind, die in collation name angegebene Sortierung verwendet.

� Wenn false festgelegt ist, verwenden verteilte Abfragen immer die Stan-dardsortierung des lokalen Servers. Der Standardwert ist false.

DatenzugriffDiese Option aktiviert und deaktiviert einen Verbindungsserver für Zugriffe über verteilte Abfragen. Sie können die Option nur für sysserver-Einträge verwenden, die mit sp_addlinkedserver hinzugefügt werden.

In diesem Beispiel wird der Remoteserver „AccountingServer“ für den Daten-zugriff konfiguriert und die Verwendung dieses Servers als Verbindungsserver ermöglicht.

USE master EXEC sp_serveroption 'AccountingServer', 'data access', true

„RPC“ und „RPC-Ausgabe“ Die Option RPC ermöglicht RPCs (Remote Procedure Calls) von einem ange-gebenen Server. Die Option RPC-Ausgabe ermöglicht RPCs an einen ange-gebenen Verbindungsserver.

Verzögerte Schemagültigkeitsprüfung Diese Option bestimmt, ob das Schema von Remotetabellen überprüft wird. Wenn true festgelegt wird, wird das Schema von Remotetabellen am Anfang der Abfrage nicht von SQL Server überprüft. Eine Verzögerung der Schema-überprüfung kann die Leistung verbessern.

Name der Sortierung

Remotesortierung verwenden

Beispiel

Page 634: Programmieren Einer Microsoft SQL Server 2000-Datenbank

16 Unterrichtseinheit 12: Programmieren für mehrere Server

Abrufen von Informationen über Verbindungsserver

GespeicherteSystemprozedur

GespeicherteGespeicherteSystemprozedurSystemprozedur

sp_linkedserverssp_linkedservers

sp_catalogssp_catalogs

sp_indexessp_indexes

sp_primarykeyssp_primarykeys

sp_foreignkeyssp_foreignkeys

sp_tables_exsp_tables_ex

sp_columns_exsp_columns_ex

RückgabeRückgabeRückgabe

Liste der Verbindungsserver, die auf dem lokalenServer definiert sind

Liste der Verbindungsserver, die auf dem lokalenServer definiert sind

Liste der Kataloge und Beschreibungen zu einembestimmten Verbindungsserver

Liste der Kataloge und Beschreibungen zu einembestimmten Verbindungsserver

Indexinformationen zu der angegebenen RemotetabelleIndexinformationen zu der angegebenen Remotetabelle

Primäre Schlüsselspalten, und zwar eine Zeile proSchlüsselspalte, für die angegebene Tabelle

Primäre Schlüsselspalten, und zwar eine Zeile proSchlüsselspalte, für die angegebene Tabelle

Fremdschlüssel, die in der angegebenenRemotetabelle definiert sind

Fremdschlüssel, die in der angegebenenRemotetabelle definiert sind

Tabelleninformationen aus Tabellen des angegebenenVerbindungsservers

Tabelleninformationen aus Tabellen des angegebenenVerbindungsservers

Spalteninformationen, entweder für alle Spalten oderEine bestimmte Spalte für verbundene Tabellen

Spalteninformationen, entweder für alle Spalten oderEine bestimmte Spalte für verbundene Tabellen

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Informationen über Verbindungsserver können Sie mit Hilfe von SQL Server Enterprise Manager, aber auch mit Hilfe der folgenden gespeicherten Proze-duren sammeln.

Von dieser gespeicherten Systemprozedur wird eine Liste der Verbindungsserver, die auf dem lokalen Server definiert sind, zurück-gegeben.

Von dieser gespeicherten Systemprozedur wird eine Liste der Kataloge und Beschreibungen zu einem bestimmten Verbindungsserver zurückgegeben. Bei Remoteservern mit SQL Server ist dies eine Liste der verfügbaren Datenbanken.

Von dieser gespeicherten Systemprozedur werden Indexinfor-mationen zu der angegebenen Remotetabelle zurückgegeben.

sp_indexes {'table_server'} [, 'table_name'] [, 'table_schema'][, 'table_catalog'][, 'index'] [, 'is_unique']

In diesem Beispiel werden alle Indexinformationen aus der Employees-Tabelle der Northwind-Datenbank zurückgegeben, die auf dem Server „Cairo“ ge-speichert ist.

USE master EXEC sp_indexes 'CAIRO', 'Employees', 'dbo', 'Northwind', NULL, 0

Von dieser gespeicherten Systemprozedur werden die primären Schlüsselspalten, und zwar eine Zeile pro Schlüsselspalte, für die angegebene Tabelle zurückgegeben.

Von dieser gespeicherten Systemprozedur werden die Fremd-schlüssel zurückgegeben, die in der angegebenen Remotetabelle definiert sind.

ThemaBeschreiben Sie, wie Infor-mationen über Verbindungs-server gesammelt werden.

EinstiegInformationen über Verbin-dungsserver können Sie über SQL Server Enterprise Manager, aber auch über die folgenden gespeicherten Prozeduren abrufen.

sp_linkedservers

sp_catalogs

sp_indexes

Syntax

Beispiel

sp_primarykeys

sp_foreignkeys

Page 635: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 12: Programmieren für mehrere Server 17

Diese gespeicherte Systemprozedur ist eine Version von sp_tables, die bei Remotedatenquellen verwendet wird. Von dieser Prozedur werden Tabelleninformationen aus Tabellen, die auf dem angegebenen Verbindungsserver gespeichert sind, zurückgegeben.

sp_tables_ex {'table_server'} [, 'table_name'] [, 'table_schema'][, 'table_catalog'] [, 'table_type']

Dies ist eine Version von sp_columns für Verbindungsserver. Von dieser gespeicherten Systemprozedur werden die Spalteninformationen, entweder für alle Spalten oder eine bestimmte Spalte, für die angegebene Tabelle auf dem Verbindungsserver zurückgegeben. Wenn eine Spalte ange-geben ist, werden nur Informationen zu dieser speziellen Spalte zurückgegeben.

sp_columns_ex {'table_server'} [, 'table_name'] [, 'table_schema'][, 'table_catalog'] [, 'column']

sp_tables_ex

Syntax

sp_columns_ex

Syntax

Page 636: Programmieren Einer Microsoft SQL Server 2000-Datenbank

18 Unterrichtseinheit 12: Programmieren für mehrere Server

���� Ausführen einer Abfrage auf einem Verbindungs-server

� Arbeiten mit Verbindungsservern

� Ausführen von Verbindungsserverabfragen

� Ausführen von Pass-Through-Abfragen

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Mit SQL Server kann eine verteilte Abfrage lokal auf dem lokalen Server oder remote auf einem Verbindungsserver verarbeitet werden.

ThemaGeben Sie eine Übersicht über die Art der Ausführung einer Abfrage auf einem Verbindungsserver.

EinstiegMit SQL Server kann eine verteilte Abfrage lokal auf dem lokalen Server oder remote auf einem Verbin-dungsserver verarbeitet werden.

Page 637: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 12: Programmieren für mehrere Server 19

Arbeiten mit Verbindungsservern

� Optimieren von Remoteabfragen durch SQL Server

� Verweisen auf Objekte, die auf Verbindungsservern gespeichert sind

� Zulässige Transact-SQL-Anweisungen

� SELECT, INSERT, UPDATE, DELETE

� Nicht zulässige Transact-SQL-Anweisungen

� CREATE, ALTER, DROP

� ORDER BY auf Remotetabellen mit großen Objekten

� READTEXT, WRITETEXT, UPDATETEXT

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Mit verteilten Abfragen kann auf Daten mehrerer Datenquellen, z. B. OLE DB-Provider und andere Server mit SQL Server, zugegriffen werden.

Optimieren von Remoteabfragen durch SQL Server SQL Server versucht, die Auswertung verteilter Abfragen an die OLE DB-Provider zu delegieren. SQL Server extrahiert diejenigen syntaktischen Elemente aus der ursprünglichen verteilten Abfrage, die nur auf die Remote-tabellen in der Datenquelle des Providers zugreifen, und führt dann die redu-zierte Abfrage auf dem Provider aus. Durch dieses Verfahren wird die Anzahl der Zeilen, die vom Provider zurückgegeben werden, reduziert und dem Provider die Möglichkeit gegeben, seine Indizes zur Auswertung der Abfrage zu verwenden.

Verweisen auf Objekte, die auf Verbindungsservern gespeichert sind Beim Ausführen verteilter Abfragen müssen Sie für den Verweis auf die Ver-bindungsobjekte vierteilige Namen verwenden, die das folgende Format be-sitzen: linked-server-name.catalog-name.schema-name.object-name

Die folgende Tabelle enthält eine Beschreibung dieser Parameter:

Parameter Beschreibung

linked-server-name Der netzwerkweite Name eines Verbindungsservers.

catalog-name Der Name einer Datenbank.

schema-name Die Sammlung von Objekten, die sich im Besitz eines bestimmten Benutzers befinden - der Name entspricht dem des Objektbesitzers.

object-name Verweist auf die Tabelle, auf die Sie zugreifen möchten.

ThemaBeschreiben Sie, wie auf Daten in Tabellen zuge-griffen wird, die auf einem Verbindungsserver ge-speichert sind.

EinstiegSie können mehrere Daten-quellen in eine Abfrage einschließen.

Page 638: Programmieren Einer Microsoft SQL Server 2000-Datenbank

20 Unterrichtseinheit 12: Programmieren für mehrere Server

Um beispielsweise auf die Orders-Tabelle zu verweisen, die sich im Besitz der database owner (dbo)-Rolle in der Northwind-Datenbank auf dem Verbin-dungsserver „Corpserver“ befindet, verwenden Sie in Ihrer Abfrage den vier-teiligen Namen corpserver.Northwind.dbo.Orders.

Zulässige Transact-SQL-Anweisungen Wenn Sie einen Verbindungsserver mit SQL Server verwenden, können Sie folgende Transact-SQL-Anweisungen auf Verbindungsdaten ausführen:

� SELECT-Anweisung mit einer WHERE-Klausel oder einer JOIN-Klausel � INSERT-, UPDATE- und DELETE-Anweisungen

Nicht zulässige Transact-SQL-Anweisungen Bei der Verwendung eines Verbindungsservers mit SQL Server ist Folgendes nicht zulässig:

� Verwenden von CREATE-, ALTER- oder DROP-Anweisungen auf Verbin-dungsservern. Sie können daher keine CREATE TABLE-Anweisung ausführen, die eine SELECT INTO-Anweisung enthält. Sie können jedoch Verbindungsdaten als Quelle für Tabellen verwenden, die mit der SELECT INTO-Anweisung auf dem lokalen Server erstellt werden.

� Einschließen einer ORDER BY-Klausel in eine SELECT-Anweisung, wenn die Auswahlliste der SELECT-Anweisung eine umfangreiche Objektspalte aus einer Verbindungstabelle enthält.

� Verwenden von READTEXT-, WRITETEXT- und UPDATETEXT-An-weisungen.

Methodischer Hinweis Betonen Sie, dass dies nur eine unvollständige Liste ist.

Page 639: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 12: Programmieren für mehrere Server 21

Ausführen von Verbindungsserverabfragen

� Verwenden von voll gekennzeichneten Namen beim Verweisen auf Objekte auf Verbindungsservern

SELECT CompanyName FROM AccountingServer.NorthwindRemote.dbo.Suppliers

SELECT CompanyName FROM AccountingServer.NorthwindRemote.dbo.Suppliers

SELECT CompanyName, PhoneINTO PhoneListFROM AccountingServer.NorthwindRemote.dbo.Suppliers

SELECT CompanyName, PhoneINTO PhoneListFROM AccountingServer.NorthwindRemote.dbo.Suppliers

Beispiel 1

Beispiel 3

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Beim Abfragen eines Verbindungsservers sollten Sie für den Verweis auf Objekte die voll gekennzeichneten, vierteiligen Objektnamen verwenden.

In diesem Beispiel werden die Firmennamen aus der Suppliers-Tabelle in der NorthwindRemote-Datenbank abgerufen, die auf dem Verbindungsserver „AccountingServer“ gespeichert ist.

SELECT CompanyNameFROM AccountingServer.NorthwindRemote.dbo.Suppliers

In diesem Beispiel wird die Suppliers-Tabelle in der NorthwindRemote-Datenbank, die auf dem Verbindungsserver gespeichert ist, mit der Products-Tabelle auf dem lokalen Server mit SQL Server verknüpft.

SELECT ProductName, CompanyName FROM Products p JOIN AccountingServer.NorthwindRemote.dbo.SuppliersON p.supplierid = s.supplierid

In diesem Beispiel werden Daten aus einer Tabelle auf einem Verbindungs-server mit SQL Server mit Hilfe einer SELECT INTO-Anweisung erstellt und in eine permanente Tabelle auf dem lokalen Server mit SQL Server übertragen. Wenn Sie dieses Beispiel ausführen möchten, müssen Sie die SELECT INTO/BULK COPY-Datenbankoption aktivieren.

SELECT CompanyName, Phone INTO PhoneList FROM AccountingServer.NorthwindRemote.dbo.Suppliers

ThemaBeschreiben Sie, wie ein Verbindungsserver abge-fragt wird.

EinstiegBeim Abfragen eines Ver-bindungsservers sollten Sie für den Verweis auf Objekte die voll gekennzeichneten, vierteiligen Objektnamen verwenden.

Beispiel 1

Beispiel 2

Beispiel 3

Page 640: Programmieren Einer Microsoft SQL Server 2000-Datenbank

22 Unterrichtseinheit 12: Programmieren für mehrere Server

Ausführen von Pass-Through-Abfragen

� Verwenden der OPENQUERY-Funktion, um Pass-Through-Abfragen auf Verbindungsservern auszuführen

� Verwenden der OPENQUERY-Funktion in einer SELECT-Anweisung anstelle eines Tabellennamens

� Verwenden des Ergebnisses einer OPENQUERY-Funktion als Zieltabelle einer INSERT-, UPDATE- oder DELETE-Anweisung

SELECT * FROM OPENQUERY(AsiaServer, 'SELECT ProductID, RoyaltyFROM Northwind.dbo.ProductInfo')

SELECT * FROM OPENQUERY(AsiaServer, 'SELECT ProductID, RoyaltyFROM Northwind.dbo.ProductInfo')

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Beim Abfragen eines Verbindungsservers können Sie angeben, dass SQL Server eine Pass-Through-Abfrage ausführen soll. Verwenden Sie die OPENQUERY-Funktion, um Pass-Through-Abfragen auf einem Verbindungs-server auszuführen.

OPENQUERY (linked_server, 'query')

Beachten Sie die folgenden Aspekte, wenn Sie Pass-Through-Abfragen mit Hilfe der OPENQUERY-Funktion ausführen:

� Sie können das Ergebnis der OPENQUERY-Funktion mit einer SELECT-Anweisung anstelle eines Tabellennamens verwenden.

� Sie können das Ergebnis der OPENQUERY-Funktion als Zieltabelle einer INSERT-, UPDATE- oder DELETE-Anweisung verwenden, wenn diese Aktionen vom OLE DB-Provider für die Datenquelle unterstützt werden.

In diesem Beispiel wird mit Hilfe der OPENQUERY-Funktion eine SELECT-Anweisung auf dem Verbindungsserver „AsiaServer“ verarbeitet und das Er-gebnis an den lokalen Server mit SQL Server zurückgegeben. Gehen Sie davon aus, dass „AsiaServer“ bereits als Verbindungsserver eingerichtet und die Sicherheit hergestellt wurde.

SELECT * FROM OPENQUERY(AsiaServer, 'SELECT ProductID, Royalty FROM Northwind.dbo.ProductInfo')

In diesem Beispiel werden mit Hilfe der OPENQUERY-Funktion nicht mehr im Lieferprogramm enthaltene Produkte aus der Northwind.Products-Tabelle auf dem Verbindungsserver „AsiaServer“ gelöscht. Die gesamte Verarbeitung der DELETE-Anweisung wird auf dem Verbindungsserver „AsiaServer“ aus-geführt.

DELETE FROM OPENQUERY(AsiaServer, 'Northwind.dbo.Products') WHERE Discontinued = 1

ThemaBeschreiben Sie, wie Pass-Through-Abfragen auf einem Verbindungsserver ausgeführt werden.

EinstiegBeim Abfragen eines Ver-bindungsservers können Sie angeben, dass SQL Server eine Pass-Through-Abfrage ausführen soll.

Syntax

Beispiel 1

Beispiel 2

Page 641: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 12: Programmieren für mehrere Server 23

Ausführen einer gespeicherten Prozedur auf einem Verbindungsserver

Benutzer

LokalerServer Aufruf einer

gespeicherten Prozedur

Parameter und Ausgabe

Verbindungs-server

EXEC accounting.master.dbo.sp_helpntgroupEXEC accounting.master.dbo.sp_helpntgroup

Verarbeitung von gespeicherten

Prozeduren

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Ein Client, der mit einem Server mit SQL Server verbunden ist, kann über gespeicherte Prozeduren auf einem Verbindungsserver eine gespeicherte Proze-dur auf einem anderen Server mit SQL Server ausführen, ohne dass eine Client-verbindung mit diesem Server hergestellt werden muss.

� Der Server, mit dem der Client verbunden ist, akzeptiert die Clientanfrage und sendet sie an den Verbindungsserver. Die EXECUTE-Anweisung muss den Namen des Verbindungsservers als Teil der Syntax enthalten.

� Der Verbindungsserver verarbeitet die Anforderung und gibt alle Ergebnisse an den ursprünglichen Server zurück, der diese Ergebnisse wiederum an den Client weiterleitet.

� Anforderungen für das Ausführen gespeicherter Prozeduren auf einem Ver-bindungsserver können sowohl von Anwendungen auf dem Client als auch von Anwendungen auf dem Server initiiert werden.

EXECUTE servername.dbname.owner. procedure_name

Mit der folgenden Batchdatei wird die gespeicherte Systemprozedur sp_helpntgroup auf dem Remoteserver „Accounting“ ausgeführt. Die ge-speicherte Systemprozedur listet die Windows 2000-Gruppen auf und gibt die Datenbanken an, auf die die Gruppen zugreifen können.

EXEC accounting.master.dbo.sp_helpntgroup

ThemaBeschreiben Sie, wie eine gespeicherte Prozedur auf einem Remoteserver aus-geführt werden kann.

EinstiegEs ist möglich, eine ge-speicherte Prozedur auf einem Verbindungsserver auszuführen.

Syntax

Beispiel

Page 642: Programmieren Einer Microsoft SQL Server 2000-Datenbank

24 Unterrichtseinheit 12: Programmieren für mehrere Server

Verwalten von verteilten Transaktionen

� Verwalten von verteilten Transaktionen mit MS DTC

� Verwalten von verteilten Transaktionen über die Komponentendienste

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Mit verteilten Transaktionen werden Aktivitäten auf mehreren Ressourcen als eine einzelne Arbeitseinheit koordiniert. SQL Server unterstützt verteilte Transaktionen, die es Benutzern ermöglichen, mehrere SQL Server-Daten-banken und andere Datenquellen zu aktualisieren. Sie haben auch die Mög-lichkeit, verteilte Transaktionen zwischen Komponenten mit Hilfe der Windows 2000-Komponentendienste zu koordinieren.

Verwalten von verteilten Transaktionen mit MS DTC MS DTC (Microsoft Distributed Transaction Coordinator) koordiniert die Aus-führung des Commits für eine verteilte Transaktion über alle Server, die an der Transaktion beteiligt sind. Diese Server können neben Komponenten der mitt-leren Ebene auch SQL Server einschließen.

Sie können MS DTC mit Hilfe einer gespeicherten SQL Server-Prozedur ver-wenden, um Transaktionen über mehrere SQL Server-Computer hinweg oder zwischen einem Server mit SQL Server und Verbindungsservern zu koordi-nieren.

Sie können Remotecomputer mit SQL Server in eine verteilte Transaktion auf-nehmen. Eine gespeicherte Prozedur gibt eine BEGIN DISTRIBUTED TRANSACTION-Anweisung aus und führt dann einen gespeicherten RPC (Remote Procedure Call) mit einem Verweis auf einen Remoteserver oder eine verteilte Abfrage mit einem Verweis auf einen Remote- oder Verbindungs-server aus.

Verwalten von verteilten Transaktionen über die KomponentendiensteVerwenden Sie die Komponentendienste zum Bereitstellen und Verwalten von verteilten Transaktionen. Der zugrunde liegende Mechanismus ist MS DTC. Komponenten der mittleren Ebene können an einer verteilten Transaktion teil-nehmen.

ThemaBeschreiben Sie, wie ver-teilte Transaktionen ver-waltet werden.

EinstiegMit verteilten Transaktionen werden Aktivitäten auf meh-reren Ressourcen als eine einzelne Arbeitseinheit koordiniert.

Page 643: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 12: Programmieren für mehrere Server 25

Ändern von Daten auf einem Verbindungsserver � Verteilte Transaktion ausführen durch:

� Ausführen von BEGIN DISTRIBUTED TRANSACTION

- ODER -

� Aufrufen einer API-Funktion von einem Client

� Bedenken Sie Folgendes:

� BEGIN DISTRIBUTED TRANSACTION-Anweisungen können nicht geschachtelt werden

� ROLLBACK TRANSACTION führt einen Rollback für die gesamte Transaktion aus

� Sicherungspunkte werden nicht unterstützt

� Aktivieren Sie die Sitzungsoption XACT_ABORT

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Wenn Sie Daten auf einem Verbindungsserver ändern möchten, müssen Sie eine verteilte Transaktion ausführen. Sie können eine BEGIN DISTRIBUTED TRANSACTION-Anweisung ausführen oder in einer Clientanwendung die API-Funktionen referenzieren.

BEGIN DISTRIBUTED TRANSACTION [transaction_name]

Im folgenden Beispiel wird ein Geldbetrag über eine verteilte Transaktion zwischen zwei Bankkonten, die sich auf verschiedenen Servern befinden, über-wiesen. Mit Hilfe der gespeicherten Prozedur withdraw auf dem lokalen Server wird Geld von einem Sparkonto abgehoben. Auf einem Verbindungsserver wird dann eine gespeicherte Prozedur mit dem Namen deposit ausgeführt, um das Geld auf ein Girokonto zu überweisen. Von dem Konto „1234“ auf dem lokalen Server werden einhundert Dollar abgehoben und auf das entsprechende Giro-konto auf dem Verbindungsserver „Centralserver“ überwiesen. Sowohl von der lokalen Datenbank als auch von der Verbindungsdatenbank wird ein Commit bzw. ein Rollback für die Transaktion durchgeführt.

SET XACT_ABORT ON BEGIN DISTRIBUTED TRANSACTIONEXEC Savingsdb.dbo.withdraw 1234, 100 EXEC Centralserver.Checkingdb.dbo.deposit 1234, 100

COMMIT TRAN

ThemaGeben Sie eine Übersicht über verteilte Transaktionen.

EinstiegWenn Sie Daten auf einem Verbindungsserver ändern möchten, können Sie eine verteilte Transaktion über die BEGIN DISTRIBUTED TRANSACTION-Anweisung ausführen.

Syntax

Beispiel

Page 644: Programmieren Einer Microsoft SQL Server 2000-Datenbank

26 Unterrichtseinheit 12: Programmieren für mehrere Server

Beachten Sie beim Ausführen von verteilten Transaktionen die folgenden Aspekte:

� BEGIN DISTRIBUTED TRANSACTION-Anweisungen können nicht ge-schachtelt werden. SQL Server erkennt solche Aufrufe, weist sie zurück und gibt eine Fehlermeldung aus.

� Mit einer ROLLBACK TRANSACTION-Anweisung wird ein Rollback für die gesamte verteilte Transaktion durchgeführt.

� Sicherungspunkte werden nicht unterstützt. Wenn SQL Server ein Rollback für eine verteilte Transaktion ausführt, erfolgt das Rollback für die gesamte Transaktion bis zum Beginn der verteilten Transaktion, wobei Sicherungs-punkte nicht beachtet werden.

� Bei der Ausführung von verteilten Transaktionen zwischen Verbindungs-servern müssen Sie die Sitzungsoption XACT_ABORT aktivieren. Wenn die Sitzungsoption XACT_ABORT aktiviert ist und bei der Ausführung der Transact-SQL-Anweisung ein Fehler auftritt, wird ein Rollback für die ge-samte Transaktion ausgeführt. Ist diese Option nicht aktiviert, wird ein Roll-back nur für die fehlerhafte Anweisung ausgeführt und die Verarbeitung der Transaktion fortgesetzt.

Page 645: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 12: Programmieren für mehrere Server 27

���� Verwenden partitionierter Sichten

� Verwenden von partitionierten Sichten

� Funktionsweise von partitionierten Sichten

� Implementieren von verteilten partitionierten Sichten

� Aspekte zum Partitionieren von Daten

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Partitionierte Sichten können die Leistung verbessern, indem sie die Verarbeitungsvorgänge auf mehrere Server verteilen.

ThemaGeben Sie eine Übersicht über die Verwendung parti-tionierter Sichten zur Leistungsverbesserung.

EinstiegPartitionierte Sichten kön-nen die Leistung ver-bessern, indem sie die Verarbeitung auf mehrere Server verteilen.

Page 646: Programmieren Einer Microsoft SQL Server 2000-Datenbank

28 Unterrichtseinheit 12: Programmieren für mehrere Server

Verwenden von partitionierten Sichten

� Skalierbarkeit� Einem einzelnen Server mehr Hardware hinzufügen� Arbeitsauslastung und Datenbank über mehrere

unabhängige Computer verteilen� Vorteile von partitionierten Sichten

� Ergebnisse aus verschiedenen Tabellen können wie eine einzige Tabelle angezeigt werden

� Datenspeicherort ist für die Anwendung transparent� Datenbank wird wie eine Einzelentität programmiert

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Bei zunehmender Arbeitsauslastung müssen Sie auf einfache Weise Ressourcen hinzufügen können.

SkalierbarkeitVerwenden Sie das Verfahren der Skalierbarkeit, um die Ressourcen eines Computers auszubauen, damit sie die Anforderungen einer zunehmenden Arbeitsauslastung langfristig erfüllen. Sie können Skalierbarkeit erreichen, indem Sie entweder in einem Einzelserver Hardware hinzufügen oder die Datenbank auf mehrere unabhängige Computer verteilen. Das Partitionieren der Arbeitsauslastung in einem Array eignet sich besonders für E-Commerce-Anwendungen, die sich durch ein sehr großes Wachstum auszeichnen.

Vorteile von partitionierten Sichten Mit Hilfe von Sichten können Sie Daten auf mehrere Datenbanken oder Instanzen von SQL Server verteilen. Die Verwendung von partitionierten Sichten hat folgende Vorteile:

� Die Ergebnisse einzelner Tabellen können zu einem einzigen Resultset zusammengefasst werden, das sich dem Benutzer wie eine einzelne Tabelle, eine partitionierte Sicht, darstellt.

� Der Speicherort der Daten ist für die Anwendung transparent. � Die Datenbank wird wie eine Einzelentität programmiert.

ThemaBeschreiben Sie die Ver-wendungsmöglichkeiten von verteilten partitionierten Sichten.

EinstiegBei zunehmender Arbeits-auslastung müssen Sie auf einfache Weise Ressourcen hinzufügen können.

Page 647: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 12: Programmieren für mehrere Server 29

Funktionsweise von partitionierten Sichten

Tabelle BTabelleTabelle BBBB ~~ ~~ ~~ ~~

~~ ~~ ~~ ~~

MitgliedServer 2

KundeKundeKundeAA ~~ ~~ ~~ ~~

~~ ~~ ~~ ~~

BB ~~ ~~ ~~ ~~

~~ ~~ ~~ ~~

MitgliedServer 1

CREATE VIEWCust_View

SELECT Table AUNION ALL

SELECT Table B

CREATE VIEWCust_View

SELECT Table AUNION ALL

SELECT Table B

PartitionierteSicht

Tabelle ATTabelleabelle AAAA ~~ ~~ ~~ ~~

~~ ~~ ~~ ~~

CREATE VIEWCust_View

SELECT Table AUNION ALL

SELECT Table B

CREATE VIEWCust_View

SELECT Table AUNION ALL

SELECT Table B

KundeKundeAA ~~ ~~ ~~ ~~

~~ ~~ ~~ ~~

BB ~~ ~~ ~~ ~~

~~ ~~ ~~ ~~

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Mit Hilfe partitionierter Sichten können Daten in einer großen Tabelle hori-zontal in kleinere Mitgliedstabellen partitioniert werden. Jede Mitgliedstabelle hat dasselbe Format wie die ursprüngliche Tabelle, enthält jedoch nur einen Teil der Zeilen. Ein Server mit einer Mitgliedstabelle wird als Mitgliedsserver bezeichnet. Jeder Mitgliedsserver enthält eine Mitgliedstabelle und eine ver-teilte partitionierte Sicht.

Eine Anwendung, die auf die partitionierte Sicht auf einem der Server verweist, erhält dieselben Ergebnisse, die sie auch erhalten würde, wenn auf den Servern eine vollständigen Kopie der ursprünglichen Tabelle verfügbar wäre.

Lokale und verteilte partitionierte Sichten Sie können partitionierte Sichten lokal auf einem Einzelserver oder in einer ver-teilten Umgebung auf mehreren Servern implementieren. Lokal partitionierte Sichten verweisen auf Mitgliedstabellen auf einem Server. Verteilte partitio-nierte Sichten verweisen auf Mitgliedstabellen auf mehreren Servern. Sie wer-den in den meisten Fällen verteilte partitionierte Sichten verwenden.

Die Abbildung zeigt die Customer-Tabelle, die nach Regionen partitioniert ist. Region A befindet sich auf Mitgliedsserver 1 und Region B auf Mitglieds-server 2. Auf jedem Server wird eine Sicht erstellt, mit deren Hilfe es möglich ist, die partitionierten Daten wie eine einzige Tabelle anzuzeigen. Diese Sicht wird als virtuelle Tabelle der ursprünglichen Tabelle angezeigt.

ThemaBeschreiben Sie die Funk-tionsweise von partitionier-ten Sichten.

EinstiegMit Hilfe partitionierter Sich-ten können Daten in einer großen Tabelle horizontal in kleinere Tabellen partitio-niert werden.

Page 648: Programmieren Einer Microsoft SQL Server 2000-Datenbank

30 Unterrichtseinheit 12: Programmieren für mehrere Server

Zum Implementieren partitionierter Sichten benötigte Features Zum Implementieren partitionierter Sichten werden bestimmte SQL Server-Features benötigt. Diese Features sind in der folgenden Tabelle beschrieben.

Feature Vorteil

Sichten Ermöglichen Benutzern die Anzeige aller partitionierten Tabellen als eine einzige Tabelle.

CHECK-Einschränkungen

Definieren und erzwingen die Integrität von Partitionen.

Verteilte Abfragen Dienen zum Abfragen und Aktualisieren partitionierter Daten.

INSTEAD OF-Trigger Verwalten Aktualisierungen von Sichten.

Page 649: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 12: Programmieren für mehrere Server 31

Implementieren von verteilten partitionierten Sichten

Einrichten von verteilten partitionierten Sichten:

� Erstellen mehrerer Datenbanken, jede auf einem anderen Mitgliedsserver

� Horizontales Partitionieren der Tabellen

� Erstellen von Verbindungsserverdefinitionen auf den einzelnen Mitgliedsservern

� Erstellen einer partitionierten Sicht auf jedem Mitglieds-server mit Hilfe des UNION ALL-Mengenoperators

111

222

333

444

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Zum Einrichten von verteilten partitionierten Sichten sind vier Schritte erforderlich.

1. Erstellen mehrerer Datenbanken, jede auf einem anderen Mitgliedsserver mit einer SQL Server-Instanz.

2. Horizontales Partitionieren der Tabellen durch Erstellen von Tabellen auf den einzelnen Mitgliedsservern.

3. Erstellen von Verbindungsserverdefinitionen auf den einzelnen Mitglieds-servern. Die Verbindungsserverdefinition wird zum Senden verteilter Ab-fragen an die einzelnen Mitgliedsserver verwendet.

4. Erstellen einer partitionierten Sicht auf jedem Mitgliedsserver mit Hilfe des UNION ALL-Mengenoperators, um alle Zeilen aus den einzelnen Mit-gliedsservertabellen zusammenzufassen. Alle Sichten sollten denselben Namen haben. Auf diese Weise können Ab-fragen, die auf den Namen der verteilten partitionierten Sicht verweisen, auf jedem Mitgliedsserver ausgeführt werden.

ThemaBeschreiben Sie die Schritte, die zum Imple-mentieren von verteilten partitionierten Sichten erforderlich sind.

EinstiegZum Einrichten von verteilten partitionierten Sichten sind vier Schritte erforderlich.

Page 650: Programmieren Einer Microsoft SQL Server 2000-Datenbank

32 Unterrichtseinheit 12: Programmieren für mehrere Server

Aspekte zum Partitionieren von Daten

� Aspekte zum Entwurf� Partitionieren der Daten, um verwandte Daten auf

demselben Server zu belassen� Minimieren von Zugriffszeit auf Daten auf anderen

Mitgliedsservern� Platzieren vollständiger Datensätze auf demselben

Mitgliedsserver� Abrufen der geeigneten Spalte, um die Partition zu

definieren� Methoden der Partitionierung� Regeln für die Partitionierung

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Das Partitionieren ist dann problemlos, wenn die Tabellen in der Datenbank so aufgebaut sind, dass sie in ähnliche Partitionen aufgeteilt werden können, wobei sich die meisten Zeilen, auf die eine SQL Server-Anweisung zugreift, auf demselben Mitgliedsserver befinden.

Aspekte zum Entwurf Für das Partitionieren sind die folgenden Aspekte zum Entwurf wichtig:

� Partitionieren der einzelnen Tabellen in der ursprünglichen Datenbank, sodass die meisten verwandten Daten auf einem Mitgliedsserver platziert werden.

� Minimieren von Anforderungen für Daten auf anderen Mitgliedsservern. Verteilte Abfragen sollten nur für maximal 20 Prozent der Daten erforderlich sein.

� Platzieren vollständiger Datensätze auf demselben Mitgliedsserver. Eine Partition sollte es ermöglichen, alle Zeilen auf demselben Mitgliedsserver zu platzieren wie die Zeilen mit den referenzierenden Fremdschlüsseln.

� Um die Arbeitsauslastung gleichmäßig zu verteilen, sollten Sie die Partitio-nierung für die Spalte definieren, über die die Daten am gleichmäßigsten auf die partitionierten Tabellen verteilt werden. Beispielsweise kann ein Primärschlüssel die beste Partitionierungsmethode sein, wenn Sie dabei einen Datenbereich für jede Tabelle angeben. In einigen Fällen kann es vorteilhafter sein, nach einer Spalte, die keinen Primärschlüssel enthält, z. B. die Region, zu partitionieren.

ThemaBeschreiben Sie einige der Aspekte, die beim Partitio-nieren von Daten zu be-rücksichtigen sind.

EinstiegEin guter Datenbankentwurf ist eine wichtige Voraus-setzung für das Partitio-nieren von Daten.

Page 651: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 12: Programmieren für mehrere Server 33

Methoden der Partitionierung Ihnen stehen verschiedene Methoden zur Verfügung, mit denen Sie Daten auf verschiedene Tabelle über alle Mitgliedsdatenbanken hinweg verteilen können. Folgende Punkte sollten Sie beachten:

� Partitionieren einiger Tabellen � Erstellen vollständiger Kopien anderer Tabellen in jeder Mitglieds-

datenbank. � Beibehalten einiger Tabellen in unverändertem Zustand auf dem

ursprünglichen Server.

Regeln für die Partitionierung Für die Partitionierung gelten folgende Regeln:

� Tabellen müssen dasselbe Format haben wie die ursprüngliche Tabelle. Tabellen müssen dieselbe Anzahl von Spalten mit denselben Attributen enthalten.

� Partitionsbereiche dürfen sich nicht überlagern. � Sie müssen den partitionierten Wertebereich für jede Mitgliedstabelle mit

Hilfe einer CHECK-Einschränkung erzwingen.

Page 652: Programmieren Einer Microsoft SQL Server 2000-Datenbank

34 Unterrichtseinheit 12: Programmieren für mehrere Server

Empfohlene Methoden

Richten Sie Verbindungsserver ein, um gespeicherte Prozedurenauf einem Remoteserver oder verteilte Abfragen auszuführenRichten Sie Verbindungsserver ein, um gespeicherte Prozedurenauf einem Remoteserver oder verteilte Abfragen auszuführen

Schränken Sie den Zugriff auf Verbindungsressourcen einSchränken Sie den Zugriff auf Verbindungsressourcen ein

Verwenden Sie Verbindungsserver für einen regelmäßigen Remote-datenzugriffVerwenden Sie Verbindungsserver für einen regelmäßigen Remote-datenzugriff

Vermeiden Sie das Einrichten doppelter Anmeldekonten aufverschiedenen ServernVermeiden Sie das Einrichten doppelter Anmeldekonten aufverschiedenen Servern

Verwenden Sie Ad-hoc-Abfragen für einen unregelmäßigen Remote-datenzugriffVerwenden Sie Ad-hoc-Abfragen für einen unregelmäßigen Remote-datenzugriff

Wählen Sie die geeignete Spalte zum Definieren der Partition ausWählen Sie die geeignete Spalte zum Definieren der Partition aus

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Die folgenden empfohlenen Methoden sollen Ihnen beim Programmieren für mehrere Server helfen:

� Verwenden Sie Verbindungsserver, wenn Sie voraussichtlich regelmäßig auf Remotedaten zugreifen werden.

� Verwenden Sie Ad-hoc-Abfragen, wenn in Zukunft voraussichtlich nur wenige Zugriffe auf eine Datenquelle erfolgen werden.

� Richten Sie eine Verbindungsserverumgebung ein, in der Sie entweder gespeicherte Prozeduren auf einem Remoteserver oder verteilte Abfragen ausführen.

� Schränken Sie den Zugriff auf Verbindungsressourcen mit Hilfe von An-wendungsrollen oder lokalen Konten ein, die den Konten auf dem Ver-bindungsserver zugeordnet sind.

� Vermeiden Sie das Einrichten doppelter Anmeldekonten auf verschiedenen Servern. Ordnen Sie Benutzerkonten auf einem Server nur einem einzelnen Konto auf dem Verbindungsserver zu (mit den entsprechenden Berechtigun-gen), um auf Daten auf dem Verbindungsserver zuzugreifen.

� Wählen Sie die geeignete Spalte zum Definieren der Partition aus.

ThemaFassen Sie Tipps und Techniken zum Optimieren der Programmierung für mehrere Server zusammen.

EinstiegVerwenden Sie die empfoh-lenen Methoden, um das Programmieren für mehrere Server zu optimieren.

Page 653: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 12: Programmieren für mehrere Server 35

Zusätzliche Informationen zu den folgenden Themen erhalten Sie in der SQL Server-Onlinedokumentation.

Thema Suchbegriff

OLE DB-Provider "Mit SQL Server getestete OLE DB-Provider"

Verbindungsserver sp_addlinkedserver

Verbindungsserver-Sicherheit sp_addlinkedsrvlogin

Pass-Through-Abfragen OPENQUERY

Ad-hoc-Abfragen OPENROWSET

Zulässige und nicht zulässige Transact-SQL-Anweisungen und -Aktionen

"Zugreifen auf externe Daten mit Hilfe verteilter Abfragen"

Einschränkungen für verteilte Abfragen

"externe Daten und Transact-SQL"

Page 654: Programmieren Einer Microsoft SQL Server 2000-Datenbank

36 Unterrichtseinheit 12: Programmieren für mehrere Server

Übungseinheit A: Verwenden von verteilten Daten

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

LernzieleAm Ende dieser Übungseinheit werden Sie in der Lage sein, die folgenden Aufgaben auszuführen:

� Einrichten eines Verbindungsservers und Herstellen der Sicherheit. � Abfragen von Daten auf einem Verbindungsserver. � Importieren von Daten von einem Verbindungsserver.

VoraussetzungenUm diese Übungseinheit zu bearbeiten, benötigen Sie Folgendes:

� Die Skriptdateien für diese Übungseinheit, die sich in C:\Moc\2328A\Labfiles\L12 befinden.

� Die Antwortdateien für diese Übungseinheit, die sich in C:\Moc\2328A\Labfiles\L12\Answers befinden.

Einrichten der ÜbungseinheitUm diese Übungseinheit zu bearbeiten, ist eine der folgenden Aktionen erforderlich:

� Bearbeiten der vorherigen Übungseinheit. � Ausführen der Batchdatei C:\Moc\2328A\Batches\Restore12.cmd.

Mit dieser Befehlsdatei wird die ClassNorthwind-Datenbank wieder in den Zustand zurückversetzt, der für diese Übungseinheit erforderlich ist.

ThemaGeben Sie eine Einführung in die Übungseinheit.

EinstiegIn dieser Übungseinheit richten Sie Verbindungs-server ein und fragen Remotedaten ab.

Erläutern Sie die Lernziele der Übungseinheit.

Page 655: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 12: Programmieren für mehrere Server 37

Weitere Informationen Sollten Sie beim Ausführen von Dateien Hilfe benötigen, suchen Sie in der Hilfe von SQL Query Analyzer nach „Ausführen einer Abfrage“.

Daneben sind die folgenden Informationsquellen verfügbar:

� Das Northwind-Datenbankschema. � Die Microsoft SQL Server-Onlinedokumentation.

SzenarioDer Aufbau des Schulungsraumes soll die Organisation des weltweit agieren-den Handelsunternehmens Northwind Traders widerspiegeln. Das Unternehmen hat den fiktiven Domänennamen nwtraders.msft. Der primäre DNS-Server für nwtraders.msft ist der Kursleitercomputer, dessen IP-Adresse (Internetproto-koll) 192.168.x.200 lautet (wobei x die zugewiesene Schulungsraumnummer ist). Der Name des Kursleitercomputers ist London.

Die folgende Tabelle stellt den Benutzernamen, den Computernamen und die IP-Adresse für jeden Kursteilnehmercomputer in der fiktiven Domäne nwtraders.msft bereit. Suchen Sie den Ihrem Computer zugewiesenen Benutzernamen und notieren Sie ihn.

Benutzername Computername IP-Adresse

SQLAdmin1 Vancouver 192.168.x.1SQLAdmin2 Denver 192.168.x.2SQLAdmin3 Perth 192.168.x.3SQLAdmin4 Brisbane 192.168.x.4SQLAdmin5 Lisbon 192.168.x.5SQLAdmin6 Bonn 192.168.x.6SQLAdmin7 Lima 192.168.x.7SQLAdmin8 Santiago 192.168.x.8SQLAdmin9 Bangalore 192.168.x.9SQLAdmin10 Singapore 192.168.x.10SQLAdmin11 Casablanca 192.168.x.11SQLAdmin12 Tunis 192.168.x.12SQLAdmin13 Acapulco 192.168.x.13SQLAdmin14 Miami 192.168.x.14SQLAdmin15 Auckland 192.168.x.15SQLAdmin16 Suva 192.168.x.16SQLAdmin17 Stockholm 192.168.x.17SQLAdmin18 Moscow 192.168.x.18SQLAdmin19 Caracas 192.168.x.19SQLAdmin20 Montevideo 192.168.x.20SQLAdmin21 Manila 192.168.x.21SQLAdmin22 Tokyo 192.168.x.22SQLAdmin23 Khartoum 192.168.x.23SQLAdmin24 Nairobi 192.168.x.24

Veranschlagte Zeit für die Übungseinheit: 60 Minuten

Page 656: Programmieren Einer Microsoft SQL Server 2000-Datenbank

38 Unterrichtseinheit 12: Programmieren für mehrere Server

Übung 1 Einrichten von Verbindungsservern

In dieser Übung arbeiten Sie mit einem anderen Kursteilnehmer zusammen. Sie richten Ihren lokalen Server mit SQL Server als Remotedatenquelle für Ihren Partner ein. Darüber hinaus stellen Sie eine Verbindung zum Server mit SQL Server Ihres Partners her und verwalten die Sicherheit für den Remote-datenzugriff.

� So erstellen Sie die „ProductInfo“-Tabelle auf Ihrem lokalen Server und füllen diese mit Daten

In diesem Verfahren erstellen Sie eine neue Tabelle in der ClassNorthwind-Datenbank. Diese Tabelle wird von Ihrem Partner verwendet. 1. Melden Sie sich an der Schulungsraumdomäne nwtraders mit Hilfe der

Informationen in der folgenden Tabelle an.

Option Eingabe

Benutzername SQLAdminx (wobei x die Ihrem Computernamen zugewiesene Nummer ist, wie in der Schulungsraumdomäne nwtraders.msftfestgelegt)

Kennwort password

2. Öffnen Sie SQL Query Analyzer, und melden Sie sich, wenn Sie dazu auf-gefordert werden, mittels Microsoft Windows®-Authentifizierung am (lokalen) Server an. Sie verfügen über die Berechtigung, sich bei SQL Server anzumelden und SQL Server zu verwalten, da Sie als SQLAdminx angemeldet sind und SQLAdminx ein Mitglied der lokalen Windows 2000-Gruppe Administ-ratoren ist. Alle Mitglieder dieser Gruppe werden automatisch der sysadmin-Rolle von SQL Server zugeordnet. Lassen Sie dieses Abfragefenster bis zum Ende der Übung geöffnet.

3. Öffnen Sie das Skript Labfiles\L12\RemoteTbl.sql, überprüfen Sie es, und führen Sie es aus. Dieses Skript erstellt die ProductInfo-Tabelle in der ClassNorthwind-Datenbank.

Page 657: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 12: Programmieren für mehrere Server 39

� So erstellen Sie Anmeldekonten für lokale und Remotebenutzer In diesem Verfahren erstellen Sie zwei neue Anmeldekonten: Das eine Konto verwendet Ihr Partner für die Verbindung mit Ihrem Server mit SQL Server, das andere Konto verwenden Sie für den Zugriff auf Verbindungsserver.

1. Öffnen Sie SQL Server Enterprise Manager. 2. Rufen Sie folgende Themen der SQL Server-Onlinedokumentation auf:

„Hinzufügen eines SQL Server-Benutzernamens (Enterprise Manager)“ und „Erteilen von Anmeldezugriff auf SQL Server für einen Windows NT-Be-nutzer oder eine Windows NT-Gruppe (Enterprise Manager)“.

3. Erstellen Sie mit Hilfe der Verfahren in der SQL Server-Onlinedokumen-tation und der Informationen in der folgenden Tabelle ein neues Anmelde-konto, das Remoteserver für den Zugriff auf Informationen auf dem lokalen Computer verwenden.

Option Eingabe

Benutzername NWInfoRemote

Authentifizierung SQL Server

Kennwort nwpassrmt

Standarddatenbank ClassNorthwind

Datenbankzugriff ClassNorthwind

In Datenbankrolle zulassen public

4. Erstellen Sie ein weiteres Anmeldekonto mit den folgenden Eigenschaften. Dieses lokale Konto wird dem Anmeldekonto NWInfoRemote auf dem Server mit SQL Server Ihres Partners zugeordnet.

Option Eingabe

Benutzername NWInfoLocal

Authentifizierung SQL Server

Kennwort nwpasslocal

Standarddatenbank ClassNorthwind

Datenbankzugriff ClassNorthwind

In Datenbankrolle zulassen public

� So erteilen Sie der „ProductInfo“-Tabelle die SELECT- und INSERT-Berechtigungen und der Prozedur „Sales By Year“ die EXECUTE-Berechtigung

In diesem Verfahren erteilen Sie der ProductInfo-Tabelle auf Ihrem lokalen SQL Server-Computer die Berechtigungen SELECT und INSERT für das Anmeldekonto NWInfoRemote. Dadurch erhalten Remotebenutzer die Mög-lichkeit, Daten aus der ProductInfo-Tabelle zu lesen und Daten in die Tabelle einzufügen. 1. Rufen Sie das folgende Thema der SQL Server-Onlinedokumentation auf:

„Erteilen von Berechtigungen für einen Benutzer, eine Gruppe oder eine Rolle für mehrere Objekte (Enterprise Manager)“.

Page 658: Programmieren Einer Microsoft SQL Server 2000-Datenbank

40 Unterrichtseinheit 12: Programmieren für mehrere Server

2. Erteilen Sie mit Hilfe der Verfahren in der SQL Server-Onlinedokumen-tation dem Benutzerkonto NWInfoRemote die Berechtigungen SELECT und INSERT für die ClassNorthwind.dbo.ProductInfo-Tabelle und die Berechtigung EXECUTE für die ClassNorthwind.dbo.SalesbyYer-Prozedur.

� So fügen Sie der „db_datareader“-Rolle für die „ClassNorthwind“-Datenbank das Anmeldekonto „NWInfoLocal“ hinzu

In diesem Verfahren fügen Sie der db_datareader-Rolle für die ClassNorthwind-Datenbank das Anmeldekonto NWInfoLocal hinzu. Die db_datareader-Rolle besitzt die SELECT-Berechtigung für alle Benutzer-tabellen in der Datenbank. Über diese Rolle erfolgt der Zugriff auf die lokale Kopie der ClassNorthwind-Datenbank. 1. Rufen Sie das folgende Thema der SQL Server-Onlinedokumentation auf:

„Hinzufügen eines Mitglieds zu einer SQL Server-Datenbankrolle (Enterprise Manager)“.

2. Fügen Sie mit Hilfe des Verfahrens in der SQL Server-Onlinedokumen-tation der db_datareader-Rolle für die ClassNorthwind-Datenbank das Anmeldekonto NWInfoLocal hinzu.

� So richten Sie einen Verbindungsserver ein In diesem Verfahren registrieren Sie den Computer Ihres Partners als Verbin-dungsserver auf Ihrem lokalen Server. 1. Wechseln Sie zu SQL Query Analyzer. 2. Öffnen Sie das Skript Labfiles\L12\MakeLink.sql.3. Ändern Sie das Skript, indem Sie servername durch den Namen des Servers

mit SQL Server Ihres Partners ersetzen. 4. Führen Sie das Skript aus.

� So richten Sie die Sicherheit zwischen Ihrem lokalen Computer und dem Verbindungsserver mit SQL Server ein

In diesem Verfahren ordnen Sie einem Anmeldekonto auf dem SQL Server-Computer Ihres Partners ein Anmeldekonto auf Ihrem lokalen SQL Server-Computer zu. 1. Öffnen Sie das Skript Labfiles\L12\MapToLnk.sql mit SQL Query

Analyzer. 2. Ändern Sie das Skript, indem Sie servername durch den Namen des Servers

mit SQL Server Ihres Partners ersetzen. 3. Führen Sie das Skript aus. 4. Schließen Sie SQL Query Analyzer.

Page 659: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 12: Programmieren für mehrere Server 41

Übung 2 Abfragen von Remotedaten

In dieser Übung erstellen Sie Abfragen, die auf Daten auf dem Verbindungs-server, den Sie in der vorhergehenden Übung eingerichtet haben, zugreifen. Anschließend führen Sie diese Abfragen aus. Sowohl Sie als auch Ihr Partner müssen Übung 1 ausgeführt haben, bevor Sie mit dieser Übung beginnen.

� So greifen Sie auf Remotedaten auf dem Verbindungsserver zu • In diesem Verfahren melden Sie sich mit Sicherheitsinformationen für

eine lokale Anwendung an Ihrem lokalen Server mit SQL Server an. Anschließend erstellen Sie eine einfache Abfrage, mit der Daten aus der ProductInfo-Tabelle in der Northwind-Datenbank auf dem Computer Ihres Partners abgerufen werden. \L12\Answers\LnkSelect.sql enthält ein fertiges Skript für dieses Verfahren.

� So konfigurieren Sie SQL Server für SQL Server-Authentifizierung Da alle Verbindungsserver die SQL Server-Authentifizierung verwenden, müssen sie so konfiguriert werden, dass sie sowohl SQL Server- als auch Windows-Authentifizierung ermöglichen. 1. Erweitern Sie die Servergruppe in SQL Server Enterprise Manager. 2. Klicken Sie mit der rechten Maustaste auf Ihren Server, und klicken Sie

anschließend auf Eigenschaften.3. Klicken Sie auf die Registerkarte Sicherheit.4. Klicken Sie unter Authentifizierung auf SQL Server und Windows.5. Beenden Sie SQL Server, und führen Sie einen Neustart durch.

� So melden Sie sich mittels SQL Server-Authentifizierung an Ihrem Server an

1. Zeigen Sie im Startmenü auf Programme, zeigen Sie auf Microsoft SQL Server, und klicken Sie dann auf Query Analyzer. Melden Sie sich am (lokalen) Server mittels SQL Server-Authentifizierung an. Stellen Sie als NWInfoLocal mit dem Kennwort nwpasslocal eine Verbindung her; diese Verbindung wird für alle Verfahren in dieser Übung verwendet.

2. Erstellen Sie eine Transact-SQL-Anweisung, mit der alle Spalten aus der Northwind.dbo.ProductInfo-Tabelle auf dem Verbindungsserver (dem Computer Ihres Partners) abgerufen werden, und führen Sie diese An-weisung aus. SELECT * FROM <servername>.ClassNorthwind.dbo.ProductInfo

Page 660: Programmieren Einer Microsoft SQL Server 2000-Datenbank

42 Unterrichtseinheit 12: Programmieren für mehrere Server

� So greifen Sie über eine Pass-Through-Abfrage auf Remotedaten zu In diesem Verfahren erstellen Sie eine Abfrage, mit der Daten mit Hilfe der OPENQUERY-Funktion aus der ProductInfo-Tabelle in der ClassNorthwind-Datenbank auf dem Computer Ihres Partners abgerufen werden. Die Abfrage wird als Pass-Through-Abfrage auf dem Remotecomputer verarbeitet. Die Datei \L12\Answers\PassThru.sql enthält ein fertiges Skript für dieses Verfahren. • Erstellen Sie eine Pass-Through-Abfrage, mit der die Spalten ProductID

und Royalty aus der Northwind.dbo.ProductInfo-Tabelle auf dem Verbindungsserver (dem Computer Ihres Partners) abgerufen werden, und führen Sie diese Abfrage aus. Verwenden Sie in der FROM-Klausel der SELECT-Anweisung die OPENQUERY-Funktion. SELECT * FROM OPENQUERY(<servername>, 'SELECT ProductID, Royalty FROM ClassNorthwind.dbo. ProductInfo')

� So verknüpfen Sie lokale Tabellen mit Remotetabellen In diesem Verfahren erstellen Sie eine Abfrage, mit der die lokale Kopie der ClassNorthwind.dbo.Products-Tabelle mit der ClassNorthwind.dbo.ProductInfo-Tabelle auf dem Computer Ihres Partners verknüpft wird. \L12\Answers\LnkJoin.sql enthält ein fertiges Skript für dieses Verfahren. • Schreiben Sie eine Transact-SQL-Anweisung, mit der die lokale Kopie der

ClassNorthwind.dbo.Products-Tabelle mit der ClassNorthwind.dbo.ProductInfo-Tabelle auf dem Verbindungsserver verknüpft wird. Verknüpfen Sie die Tabellen über die ProductID-Spalte. Nehmen Sie die Spalten ProductName, ProductID und ImportTax auf, und sortieren Sie die Ergebnisse anschließend nach ProductName.USE ClassNorthwind

SELECT ProductName, Products.ProductID, Royalty, ImportTax FROM Products JOIN <servername>.ClassNorthwind.dbo.ProductInfo CNWR ON Products.ProductID = CNWR.ProductID

� So fügen Sie der Datenbankbesitzerrolle das Anmeldekonto „NWInfoLocal“ hinzu

In diesem Verfahren fügen Sie der db_owner-Rolle für die ClassNorthwind-Datenbank das Anmeldekonto NWInfoLocal hinzu. Da das Anmeldekonto NWInfoLocal nun Mitglied der db_owner-Rolle ist, können über dieses Konto neue Tabellen in der ClassNorthwind-Datenbank erstellt werden. 1. Rufen Sie das folgende Thema der SQL Server-Onlinedokumentation auf:

„Hinzufügen eines Mitglieds zu einer SQL Server-Datenbankrolle (Enterprise Manager)“.

2. Fügen Sie mit Hilfe des Verfahrens in der SQL Server-Onlinedokumenta-tion der db_owner-Rolle für die ClassNorthwind-Datenbank das Anmelde-konto NWInfoLocal hinzu.

Page 661: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 12: Programmieren für mehrere Server 43

� So importieren Sie Daten von einem Verbindungsserver und erstellen eine neue lokale Tabelle

In diesem Verfahren erstellen Sie eine neue Tabelle auf Ihrem lokalen Server und füllen diese mit den Ergebnissen einer Abfrage auf Ihrem Verbindungs-server. \L12\Answers\LnkImport.sql enthält ein fertiges Skript für dieses Verfahren. 1. Wechseln Sie zu SQL Query Analyzer. 2. Erstellen Sie eine Transact-SQL-Anweisung, mit der die Spalten ProductID

und Royalty aus der ProductInfo-Tabelle auf dem Verbindungsserver ab-gerufen werden.

3. Ändern Sie die Anweisung so, dass eine neue lokale, permanente Tabelle mit dem Namen LocalProdInfo erstellt wird, in der die Ergebnisse der Ab-frage enthalten sind.

4. Prüfen Sie den Inhalt der LocalProdInfo-Tabelle. USE ClassNorthwind

SELECT ProductID,Royalty FROM <servername>.ClassNorthwind.dbo.ProductInfo

SELECT ProductID,Royalty INTO LocalProdInfo FROM <servername>.ClassNorthwind.dbo.ProductInfo

SELECT * FROM LocalProdInfo

� So führen Sie eine gespeicherte Prozedur auf einem Verbindungsserver aus

In diesem Verfahren führen Sie die gespeicherte Prozedur Sales by Year auf dem Verbindungsserver aus. \L12\Answers \RmtProc.sql enthält ein fertiges Skript für dieses Verfahren. 1. Erstellen Sie eine Transact-SQL-Anweisung, mit der die gespeicherte Pro-

zedur Sales by Year in der ClassNorthwind-Datenbank auf dem Verbin-dungsserver ausgeführt wird. Verwenden Sie hierzu einen voll gekennzeich-neten, vierteiligen Namen, und führen Sie die Anweisung aus. Erstellen Sie diese Abfrage mit Hilfe der Informationen in der folgenden Tabelle.

Parameter Eingabe

Anfangsdatum '1996'

Enddatum '1997'

2. Schließen Sie alle offenen Abfragefenster, und beenden Sie anschließend SQL Server Query Analyzer. EXECUTE <servername>.ClassNorthwind.dbo.[Sales by Year] '1996', '1997'

Page 662: Programmieren Einer Microsoft SQL Server 2000-Datenbank

44 Unterrichtseinheit 12: Programmieren für mehrere Server

� So greifen Sie über eine Ad-hoc-Abfrage auf Remotedaten zu In diesem Verfahren erstellen Sie eine Ad-hoc-Abfrage, mit der alle Spalten aus der ClassNorthwind.dbo.ProductInfo-Tabelle auf dem Remoteserver abge-rufen werden. Stellen Sie mit Hilfe der OPENROWSET-Funktion eine Ver-bindung mit der Remotedatenquelle her. \L12\Answers\Adhoc.sql enthält ein fertiges Skript für dieses Verfahren. 1. Öffnen Sie SQL Query Analyzer, und melden Sie sich, wenn Sie dazu

aufgefordert werden, mittels Microsoft Windows-Authentifizierung am (lokalen) Server an. Sie verfügen über die Berechtigung, sich bei SQL Server anzumelden und SQL Server zu verwalten, da Sie als SQLAdminx angemeldet sind und SQLAdminx ein Mitglied der lokalen Windows 2000-Gruppe Administ-ratoren ist. Alle Mitglieder dieser Gruppe werden automatisch der sysadmin-Rolle von SQL Server zugeordnet. Da Sie nicht das Benutzerkonto NWInfoLocal verwenden, kann der Server Ihres Partners über diese Verbindung nicht direkt als Verbindungsserver genutzt werden.

2. Erstellen Sie eine Transact-SQL-Anweisung, mit der die Spalten ProductIDund Royalty aus der ProductInfo-Tabelle auf dem Computer Ihres Partners abgerufen werden. Stellen Sie Verbindungsinformationen über die OPENROWSET-Funktion bereit. Erstellen Sie diese Abfrage mit Hilfe der Informationen in der folgenden Tabelle.

Parameter Eingabe

provider_name 'SQLOLEDB'

data_source <Servername> (Name des Computers Ihres Partners)

Benutzer-ID 'nwinforemote'

Kennwort 'nwpassrmt'

SELECT * FROM OPENROWSET('SQLOLEDB', '<servername>'; 'NWInfoRemote'; 'nwpassrmt','SELECT ProductID, Royalty FROM ClassNorthwind.dbo.ProductInfo')

3. Schließen Sie alle Verbindungen mit SQL Server Query Analyzer.

Page 663: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 12: Programmieren für mehrere Server 45

Wenn Sie noch Zeit haben:Verwalten verteilter Transaktionen

In dieser Übung erstellen Sie eine gespeicherte Prozedur, die in Verbindung mit verteilten Transaktionen verwendet werden soll. Sie überprüfen, ob der MS DTC-Dienst gestartet wurde. Sie erstellen Transact-SQL-Anweisungen innerhalb einer verteilten Transaktion, um eine hohe Datenkonsistenz zwischen den beiden Servern mit SQL Server sicherzustellen, und führen die Anweisun-gen anschließend aus.

� So erstellen Sie eine gespeicherte Prozedur für die Verwendung mit verteilten Transaktionen auf Ihrem lokalen Computer

In diesem Verfahren melden Sie sich als Mitglied der sysadmin-Rolle an Ihrem lokalen Server mit SQL Server an. Sie überprüfen ein Skript, mit dem die ge-speicherte Prozedur DeleteProductInfo erstellt und dem Anmeldekonto NWInfoRemote die EXECUTE-Berechtigung erteilt wird, und führen das Skript anschließend aus. Diese gespeicherte Prozedur wird später von Ihrem Partner verwendet, um Zeilen aus der ProductInfo-Tabelle auf Ihrem lokalen Computer zu löschen.

Sie und Ihr Partner müssen das vorhergehende Verfahren beendet haben, bevor Sie diese Übung fortsetzen.

1. Öffnen Sie SQL Query Analyzer, und melden Sie sich, wenn Sie dazu aufgefordert werden, mittels Microsoft Windows-Authentifizierung am (lokalen) Server an. Sie verfügen über die Berechtigung, sich bei SQL Server anzumelden und SQL Server zu verwalten, da Sie als SQLAdminx angemeldet sind und SQLAdminx ein Mitglied der lokalen Windows 2000-Gruppe Administ-ratoren ist. Alle Mitglieder dieser Gruppe werden automatisch der sysadmin-Rolle von SQL Server zugeordnet.

2. Öffnen Sie das Skript Labfiles\L12\RemoteSP.sql, überprüfen Sie es, und führen Sie es aus. Dieses Skript erstellt die gespeicherte Prozedur DeleteProductInfo in der lokalen ClassNorthwind-Datenbank und erteilt dem Benutzerkonto NWInfoRemote die EXECUTE-Berechtigung. Diese gespeicherte Prozedur wird von Ihrem Partner verwendet, um Zeilen aus der ProductInfo-Tabelle auf Ihrem lokalen Computer zu löschen.

3. Schließen Sie SQL Query Analyzer.

� So starten Sie den MS DTC-Dienst In diesem Verfahren starten Sie den MS DTC-Dienst. 1. Öffnen Sie den SQL Server-Dienst-Manager. 2. Starten Sie den MS DTC-Dienst auf Ihrem lokalen Computer, falls dieser

noch nicht ausgeführt wird.

Wichtig

Page 664: Programmieren Einer Microsoft SQL Server 2000-Datenbank

46 Unterrichtseinheit 12: Programmieren für mehrere Server

� So führen Sie eine verteilte Transaktion zwischen dem lokalen Computer und einem Verbindungsserver aus

ClassNorthwind Traders verfügt über zwei Datenbankkopien, und zwar eine Kopie für jedes Lager. Alle Änderungen an einer Kopie sollen auch an der anderen Kopie vorgenommen werden. In diesem Verfahren fügen Sie Daten mit einer einzelnen Transaktion sowohl in Ihre lokale ProductInfo-Tabelle als auch in die ProductInfo-Tabelle auf dem Computer Ihres Partners ein. \L12\Answers \DistIns.sql enthält ein fertiges Skript für dieses Verfahren. 1. Zeigen Sie im Startmenü auf Programme, zeigen Sie auf Microsoft

SQL Server, und klicken Sie dann auf Query Analyzer. Melden Sie sich am (lokalen) Server mittels SQL Server-Authentifizierung an. Stellen Sie als NWInfoLocal mit dem Kennwort nwpasslocal eine Verbindung her.

2. Erstellen Sie eine Transact-SQL-Anweisung, mit der eine neue Zeile in die ProductInfo-Tabelle auf Ihrem lokalen Computer eingefügt wird. Wählen Sie eine Zeile aus der folgenden Tabelle aus. Ihr Partner sollte die andere Zeile auswählen.

ProductID Royalty ImportTax

55 3 .09

56 2 .08

3. Erstellen Sie eine Transact-SQL-Anweisung, mit der die von Ihnen ausge-wählte Zeile in die ClassNorthwind.dbo.ProductInfo-Tabelle auf dem Verbindungsserver (dem Computer Ihres Partners) eingefügt wird. Verwen-den Sie einen voll gekennzeichneten, vierteiligen Namen.

4. Schließen Sie die beiden Anweisungen in BEGIN DISTRIBUTED TRANSACTION und COMMIT TRANSACTION ein, und aktivieren Sie die Sitzungsoption XACT_ABORT.

5. Führen Sie die Transaktion aus. USE ClassNorthwind SET XACT_ABORT ON GO

BEGIN DISTRIBUTED TRANSACTION -- Insert to the liked server. INSERT INTO <servername>.ClassNorthwind.dbo.ProductInfo VALUES (55, 3, .09) INSERT INTO ClassNorthwind.dbo.ProductInfo VALUES (55, 3, .09) COMMIT TRANSACTION

6. Erstellen Sie Abfragen, und führen Sie diese aus, um zu überprüfen, ob die hinzugefügte Zeile in beiden Tabellen angezeigt wird. SELECT * FROM <servername>.ClassNorthwind.dbo.ProductInfo SELECT * FROM ClassNorthwind.dbo.ProductInfo

Page 665: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 12: Programmieren für mehrere Server 47

� So verwalten Sie verteilte Daten mit Hilfe einer gespeicherten Prozedur In diesem Verfahren überprüfen Sie ein Skript, mit dem die zuvor den ClassNorthwind.dbo.ProductInfo-Tabellen hinzugefügten Zeilen auf dem lokalen und dem Verbindungsserver gelöscht werden, und führen es aus. 1. Öffnen und überprüfen Sie das Skript Labfiles\L12\DistDel.sql mit SQL

Query Analyzer. Dieses Skript löscht die Zeile, die Sie der lokalen ProductInfo-Tabelle mit Hilfe einer Transact-SQL-Anweisung hinzugefügt haben. Die Zeile, die Sie in der ProductInfo-Tabelle auf dem Verbindungs-server eingefügt haben, wird durch eine gespeicherte Prozedur gelöscht. Diese Schritte werden als Transaktion durchgeführt.

2. Ändern Sie das Skript, sodass der Computer Ihres Partners als Verbindungs-server dient.

3. Ändern Sie das Skript, sodass die von Ihnen im vorhergehenden Verfahren hinzugefügte Product_id gelöscht wird.

4. Führen Sie das geänderte Skript Labfiles\L12\DistDel.sql aus. 5. Überprüfen Sie die Ausgabe, um sicherzustellen, dass die Zeilen gelöscht

wurden.

Page 666: Programmieren Einer Microsoft SQL Server 2000-Datenbank

48 Unterrichtseinheit 12: Programmieren für mehrere Server

Lernzielkontrolle� Einführung in verteilte Abfragen

� Ausführen einer Ad-hoc-Abfrage für eine Remotedatenquelle

� Einrichten einer Verbindungsserverumgebung

� Ausführen einer Abfrage auf einem Verbindungsserver

� Ausführen einer gespeicherten Prozedur auf einem Verbindungsserver

� Verwalten von verteilten Transaktionen

� Ändern von Daten auf einem Verbindungsserver

� Verwenden partitionierter Sichten

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Sie besitzen ein Mailauftragsunternehmen mit zwei Lagerstandorten, einen in den USA und einen in Asien. In jedem Lager gibt es einen Server mit SQL Server, der über eine standortspezifische Kopie der Inventardatenbank verfügt. Die Server, mit den Namen „USsales“ und „Asiasales“, sind über ein WAN miteinander verbunden. Für die Geschäftsabwicklung ist es erforderlich, dass diese Datenbanken ständig aktuell und synchronisiert sind.

1. Welche Methode der Datenverteilung sollten Sie verwenden, um Änderun-gen von einem Server an den anderen weiterzugeben? Sie sollten zur Aktualisierung beider Datenbanken verteilte Transaktio-nen verwenden, da eine hohe Konsistenz erforderlich ist. Verwenden Sie keine Replikation, da die Datenbanken zu jedem Zeitpunkt syn-chronisiert sein müssen.

2. Ihr Büro befindet sich in den USA. Sie erstellen jeden Morgen einen Be-richt, der die Anzahl der vorrätigen Einheiten für die zehn am häufigsten verkauften Artikel aus jedem Lager ausweist. Auf welche Weise würden Sie diesen Bericht erstellen? Sie würden den Server „Asiasales“ als Verbindungsserver auf dem Computer „USsales“ registrieren und anschließend Abfragen auf dem Server „USsales“ erstellen und ausführen, wobei Sie für den Zugriff auf die Informationen auf dem Verbindungsserver voll gekennzeichnete, vierteilige Namen verwenden.

ThemaVertiefen Sie die Lernziele dieser Unterrichtseinheit, indem Sie die Kernpunkte wiederholen.

EinstiegDie Fragen zur Lernziel-kontrolle beziehen sich auf einige der Schlüsselkon-zepte, die Inhalt dieser Unterrichtseinheit sind.

Page 667: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 12: Programmieren für mehrere Server 49

3. Da Sie häufig Inventardaten zwischen den Lagern übertragen, müssen Sie die Datenbanken an beiden Standorten aktualisieren, sodass die Anzahl der vorrätigen Einheiten immer aktuell ist. Wie würden Sie vorgehen, um dieses Ziel zu erreichen? Sie würden verteilte Abfragen oder gespeicherte Prozeduren erstellen, um Inventardaten aus den einzelnen Datenbanken zu entnehmen bzw. den einzelnen Datenbanken hinzuzufügen. Anschließend würden Sie eine Abfrage erstellen, bei der diese Abfragen bzw. Aufrufe von gespei-cherten Prozeduren in einem Block zwischen den Anweisungen BEGIN DISTRIBUTED TRANSACTION und COMMIT TRANSACTION stehen. Durch die Verwendung verteilter Transaktionen wird sicher-gestellt, dass die Datenbanken synchronisiert werden.

4. Auf dem Server „Asiasales“ befindet sich außerdem eine Microsoft Access-Datenbank, die eine Zusammenfassung von Verkaufsdaten enthält. Sie möchten gelegentlich auf diese Daten zugreifen, um einen Bericht zu erstel-len, der die Daten aus der Inventardatenbank „USsales“ enthält. Wie würden Sie vorgehen, um die Daten aus beiden Quellen in Ihrem Bericht zu kom-binieren? Sie würden eine Abfrage erstellen, die mit Hilfe der OPENROWSET-Funktion auf Daten in der Access-Datenbank zugreift. Um den Bericht zu erstellen, würden Sie Tabellen in der Access-Datenbank mit Tabellen in der Datenbank des lokalen Servers mit SQL Server verknüpfen.

Page 668: Programmieren Einer Microsoft SQL Server 2000-Datenbank

2 Unterrichtseinheit 12: Programmieren für mehrere Server

This page is intentionally left blank.

Page 669: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 13: Optimieren der Abfrageleistung

Inhalt

Übersicht 1

Einführung zum Abfrageoptimierer 2

Abrufen von Ausführungsplan- informationen 13

Verwenden eines Indexes zum Abdecken einer Abfrage 25

Indizierungsstrategien 36

Außerkraftsetzen des Abfrageoptimierers 43

Empfohlene Methoden 50

Übungseinheit A: Optimieren der Abfrageleistung 52

Lernzielkontrolle 67

Page 670: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Die in diesen Unterlagen enthaltenen Angaben und Daten können ohne vorherige Ankündigung geändert werden. Die in diesen Unterlagen genannten Firmen, Produkte, Menschen, Charaktere und/oder Daten sind frei erfunden und sollen keine wirklichen Individuen, Gesellschaften, Produkte oder Veranstaltungen darstellen, soweit nichts anderes angegeben ist. Die Benutzer/innen sind verpflichtet, sich an alle anwendbaren Urheberrechtsgesetze zu halten. Ohne ausdrückliche schriftliche Erlaubnis der Microsoft Corporation darf kein Teil dieser Unterlagen für irgendwelche Zwecke vervielfältigt oder übertragen werden, unabhängig davon, auf welche Art und Weise oder mit welchen Mitteln, elektronisch oder mechanisch, dies geschieht. Wenn auf dieses Dokument nur auf elektronischem Wege zugegriffen werden kann, sind Sie hiermit berechtigt, eine (1) Kopie zum persönlichen Gebrauch auszudrucken.

Microsoft Corporation kann Inhaber von Patenten oder Patentanträgen, Marken, Urheberrechten oder anderen gewerblichen Schutzrechten sein, die den Inhalt dieses Dokuments betreffen. Die Bereitstellung dieses Dokuments gewährt keinerlei Lizenzrechte an diesen Patenten, Marken, Urheberrechten oder anderen gewerblichen Schutzrechten, es sei denn, dies wurde ausdrücklich durch einen schriftlichen Lizenzvertrag mit der Microsoft Corporation vereinbart.

2000 Microsoft Corporation. Alle Rechte vorbehalten.

Microsoft, ActiveX, BackOffice, MS-DOS, PowerPoint, Visual Basic, Visual C++, Visual Studio, Windows und Windows NT sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern.

Andere in diesem Dokument aufgeführte Produkt- und Firmennamen sind möglicherweise Marken der jeweiligen Eigentümer.

Project Lead: Rich Rose Instructional Designers: Rich Rose, Cheryl Hoople, Marilyn McGill Instructional Software Design Engineers: Karl Dehmer, Carl Raebler, Rick Byham Technical Lead: Karl Dehmer Subject Matter Experts: Karl Dehmer, Carl Raebler, Rick Byham Graphic Artist: Kirsten Larson (Independent Contractor) Editing Manager: Lynette Skinner Editor: Wendy Cleary Copy Editor: Edward McKillop (S&T Consulting) Production Manager: Miracle Davis Production Coordinator: Jenny Boe Production Support: Lori Walker (S&T Consulting) Test Manager: Sid Benavente Courseware Testing: TestingTesting123 Classroom Automation: Lorrin Smith-Bates Creative Director, Media/Sim Services: David Mahlmann Web Development Lead: Lisa Pease CD Build Specialist: Julie Challenger Online Support: David Myka (S&T Consulting) Localization Manager: Rick Terek Operations Coordinator: John Williams Manufacturing Support: Laura King; Kathy Hershey Lead Product Manager, Release Management: Bo Galford Lead Product Manager, Data Base: Margo Crandall Group Manager, Courseware Infrastructure: David Bramble Group Product Manager, Content Development: Dean Murray General Manager: Robert Stewart

Page 671: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 13: Optimieren der Abfrageleistung iii

Hinweise für den Kursleiter Diese Unterrichtseinheit vermittelt den Kursteilnehmern umfassende Kennt-nisse darüber, wie der Abfrageoptimierer arbeitet, um Abfragen zu optimieren, und wie Ausführungsplaninformationen abgerufen werden können. In der Unterrichtseinheit wird beschrieben, wie Indizes erstellt werden, die eine Ab-frage abdecken, welche Indizierungsstrategien implementiert werden können, um die Eingabe/Ausgabe (E/A) zu reduzieren, in welchen Situationen der Ab-frageoptimierer außer Kraft gesetzt werden sollte.

In der Übungseinheit verwenden die Kursteilnehmer den grafischen Ausfüh-rungsplan, sammeln Abfrageinformationen und zeigen die Ausgabe des Ab-frageoptimierers an. Darüber hinaus zeigen sie Indexinformationen an und verwenden diese Informationen, um sich zu vergegenwärtigen, wie der Ab-frageoptimierer Abfragen optimiert und Optimiererhinweise anwendet.

Am Ende dieser Unterrichtseinheit werden die Kursteilnehmer in der Lage sein, die folgenden Aufgaben auszuführen:

� Erläutern, welche Funktion der Abfrageoptimierer erfüllt und wie er sicher-stellt, dass Abfragen optimiert sind.

� Verwenden unterschiedlicher Methoden zum Abrufen von Ausführungs-planinformationen, sodass Sie in der Lage sind zu bestimmen, wie der Abfrageoptimierer eine Abfrage verarbeitet, und zu überprüfen, ob der effizienteste Ausführungsplan generiert wurde.

� Erstellen von Indizes, die Abfragen abdecken. � Identifizieren von Indizierungsstrategien, durch die die Anzahl von Seiten-

lesevorgängen reduziert wird. � Beurteilen, wann der Abfrageoptimierer außer Kraft gesetzt werden sollte.

Unterlagen und Vorbereitung In diesem Abschnitt werden die Unterlagen und vorbereitenden Aufgaben erläutert, die nötig sind, um diese Unterrichtseinheit zu unterrichten.

Erforderliche Unterlagen Um diese Unterrichtseinheit zu unterrichten, benötigen Sie folgende Unterlagen:

� Die Microsoft® PowerPoint®-Datei 2328A_13.ppt� Die Beispieldatei C:\Moc\2328A\Demo\D13_Ex.sql, die alle Beispiel-

skripts der Unterrichtseinheit enthält, soweit in der Unterrichtseinheit nichts anderes angegeben ist.

Vorbereitende Aufgaben Zur Vorbereitung dieser Unterrichtseinheit gehen Sie folgendermaßen vor:

� Lesen Sie alle Unterlagen für diese Unterrichtseinheit. � Arbeiten Sie die Übungseinheit durch.

Präsentation:90 Minuten

Übungseinheit:45 Minuten

Page 672: Programmieren Einer Microsoft SQL Server 2000-Datenbank

iv Unterrichtseinheit 13: Optimieren der Abfrageleistung

Strategie für die Unterrichtseinheit Verwenden Sie die folgende Strategie, um diese Unterrichtseinheit zu präsentieren:

� Einführung zum Abfrageoptimierer Geben Sie eine Einführung zum Abfrageoptimierer, und erläutern Sie, wie der Abfrageoptimierer die verfügbaren Informationen auswertet, um den besten Ausführungsplan zu ermitteln. Beschreiben Sie anschließend die Phasen und die Details der Abfrageoptimierung, und erläutern Sie, wie Ausführungspläne im Cache gespeichert werden. Beenden Sie diesen Abschnitt mit einer kurzen Einführung zur Abfrage-kontrolle, und erläutern Sie, wie die Abfragekontrolle konfiguriert werden kann, um zu verhindern, dass Abfragen mit langer Ausführungszeit ausge-führt werden und Systemressourcen beanspruchen.

� Abrufen von Ausführungsplaninformationen Beschreiben Sie die unterschiedlichen Möglichkeiten zum Anzeigen des vom Abfrageoptimierer generierten Ausführungsplanes, legen Sie den Schwerpunkt jedoch auf die grafische Anzeige des Ausführungsplanes.

� Verwenden eines Indexes zum Abdecken einer AbfrageErläutern Sie, wie eine Abfrage durch einen Index abgedeckt werden kann. Stellen Sie die Beispiele vor, durch die veranschaulicht wird, wie die Navigation innerhalb von Indexseiten eines Indexes erfolgen kann, der eine Abfrage abdeckt. Beschreiben Sie dann die Situationen, in denen der Ab-frageoptimierer einen Index zum Abdecken einer Abfrage verwenden kann, und erklären Sie, wie festgestellt werden kann, ob der Optimierer einen Index zum Abdecken einer Abfrage verwendet hat. Führen Sie abschließend Richtlinien für die Erstellung von Indizes auf, die Abfragen abdecken können.

� Indizierungsstrategien Beschreiben Sie die spezifischen Indizierungsstrategien für Abfragen, die Datenbereiche abrufen, und für die Zuweisung von Prioritäten bei Verwen-dung mehrerer Abfragen. Beenden Sie diesen Abschnitt, indem Sie Richt-linien für die Erstellung sinnvoller Indizes vorstellen.

� Außerkraftsetzen des Abfrageoptimierers Heben Sie hervor, wie wichtig es ist, weitere Alternativen in Erwägung zu ziehen, bevor die Entscheidung getroffen wird, den Abfrageoptimierer außer Kraft zu setzen. Geben Sie eine kurze Einführung zu Optimiererhinweisen, und weisen Sie darauf hin, dass Optimiererhinweise getestet und regelmäßig überprüft werden sollten.

Page 673: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 13: Optimieren der Abfrageleistung v

AnpassungsinformationenDieser Abschnitt beschreibt die Anforderungen zum Einrichten der Übungs-einheiten für eine Unterrichtseinheit sowie die Konfigurationsänderungen, die während der Übungseinheiten an den Kursteilnehmercomputern vorgenommen werden. Diese Informationen sollen Ihnen beim Replizieren oder Anpassen der Microsoft Official Curriculum-Courseware (MOC) helfen.

Die Übungseinheit in dieser Unterrichtseinheit hängt auch von der Schulungsraumkonfiguration ab, die im Abschnitt „Anpassungsinformationen“ am Ende des Dokuments Handbuch für das Einrichten von Schulungs-computern für Kurs 2328A, Programmieren einer Microsoft SQL Server 2000-Datenbank, angegeben ist.

Einrichten der Übungseinheit Der folgende Abschnitt beschreibt die Anforderungen zum Einrichten der Übungseinheit für diese Unterrichtseinheit.

Anforderung zum Einrichten der Übungseinheit Für die Übungseinheit dieser Unterrichtseinheit muss die ClassNorthwind-Datenbank den Zustand aufweisen, der für diese Übungseinheit erforderlich ist. Damit die Kursteilnehmercomputer diese Anforderungen erfüllen, müssen Sie eine der folgenden Aktionen ausführen:

� Bearbeiten der vorherigen Übungseinheit. � Ausführen der Batchdatei C:\Moc\2328A\Batches\Restore13.cmd.

Für die Übungseinheit ist es weiterhin erforderlich, dass die Kursteilnehmer die gespeicherte Prozedur index_cleanup erstellen, indem sie das Skript Index_cleanup.sql ausführen, das sich im Verzeichnis C:\Moc\2328A\Labfiles\L13 befindet.

Wenn dieser Kurs angepasst wurde, müssen die Kursteilnehmer die Batchdatei C:\Moc\2328A\Batches\Restore13.cmd ausführen, um sicherzu-stellen, dass die Übungseinheit ordnungsgemäß funktioniert.

Ergebnisse der Übungseinheit Auf den Kursteilnehmercomputern gibt es keine Konfigurationsänderungen, die die Replikation oder die Anpassung betreffen.

Wichtig

Achtung

Page 674: Programmieren Einer Microsoft SQL Server 2000-Datenbank

vi Unterrichtseinheit 13: Optimieren der Abfrageleistung

This page is intentionally left blank.

Page 675: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 13: Optimieren der Abfrageleistung 1

Übersicht

� Einführung zum Abfrageoptimierer

� Abrufen von Ausführungsplaninformationen

� Verwenden eines Indexes zum Abdecken einer Abfrage

� Indizierungsstrategien

� Außerkraftsetzen des Abfrageoptimierers

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

In dieser Unterrichtseinheit wird beschrieben, wie der Abfrageoptimierer Indizes und weitere Informationen verwendet, um die effizienteste Methode für den Datenzugriff zu ermitteln.

Am Ende dieser Unterrichtseinheit werden Sie in der Lage sein, die folgenden Aufgaben auszuführen:

� Erläutern, welche Funktion der Abfrageoptimierer erfüllt und wie er sicher-stellt, dass Abfragen optimiert sind.

� Verwenden unterschiedlicher Methoden zum Abrufen von Ausführungs-planinformationen, sodass Sie in der Lage sind zu bestimmen, wie der Abfrageoptimierer eine Abfrage verarbeitet, und zu überprüfen, ob der effizienteste Ausführungsplan generiert wurde.

� Erstellen von Indizes, die Abfragen abdecken. � Identifizieren von Indizierungsstrategien, durch die die Anzahl von Seiten-

lesevorgängen reduziert wird. � Beurteilen, wann der Abfrageoptimierer außer Kraft gesetzt werden sollte.

ThemaGeben Sie eine Übersicht über die Themen und Lern-ziele dieser Unterrichts-einheit.

EinstiegIn dieser Unterrichtseinheit erfahren Sie, wie der Abfrageoptimierer Indizes und weitere Informationen verwendet, um die effizien-teste Methode für den Datenzugriff zu ermitteln.

Page 676: Programmieren Einer Microsoft SQL Server 2000-Datenbank

2 Unterrichtseinheit 13: Optimieren der Abfrageleistung

���� Einführung zum Abfrageoptimierer

� Die Funktion des Abfrageoptimierers

� Verwenden der kostenorientierten Optimierung durch den Abfrageoptimierer

� Funktionsweise des Abfrageoptimierers

� Phasen der Abfrageoptimierung

� Zwischenspeichern des Ausführungsplanes

� Festlegen eines Kostenlimits

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Wenn Sie sich mit der Funktion vertraut machen, die der Abfrageoptimierer im Rahmen der Optimierung von Abfragen erfüllt, ist dies eine gute Vorbereitung für das Erstellen sinnvoller Indizes, das Schreiben effizienter Abfragen und die Optimierung von Abfragen, die eine schlechte Leistung aufweisen.

ThemaStellen Sie die Themen dieses Abschnitts vor.

EinstiegDieser Abschnitt beschäftigt sich mit dem Abfrage-optimierer und den Ver-fahren, die er zum Optimieren von Abfragen anwendet.

Page 677: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 13: Optimieren der Abfrageleistung 3

Die Funktion des Abfrageoptimierers

� Bestimmen des effizientesten Ausführungsplanes� Ermitteln, ob Indizes vorhanden sind, und Bewerten

ihres Nutzens für eine Abfrage� Bestimmen der Indizes und Spalten, die verwendet

werden können� Bestimmen der effektivsten Verarbeitungsstrategie� Durchführen einer kostenorientierten Bewertung von

Alternativen� Erstellen von Spaltenstatistiken

� Verwenden zusätzlicher Informationen� Erstellen eines Ausführungsplanes

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Der Abfrageoptimierer ist die Komponente, die für die Generierung des optimalen Ausführungsplanes für eine Abfrage zuständig ist.

Bestimmen des effizientesten Ausführungsplanes Der Abfrageoptimierer wertet jede Transact-SQL-Anweisung aus und ermittelt den effizientesten Ausführungsplan.

Der Abfrageoptimierer schätzt die E/A (Eingabe/Ausgabe), die für die Ver-arbeitung einer Abfrage erforderlich ist, indem er folgende Schritte ausführt:

� Ermitteln, ob Indizes vorhanden sind, und Bewerten ihres Nutzens für eine Abfrage.

� Bestimmen der Indizes und Spalten, die verwendet werden können, um die Anzahl der Zeilen zu reduzieren, die von der Abfrage untersucht werden. Durch die Verringerung der Anzahl der untersuchten Zeilen kann der Um-fang an E/A gesenkt werden. Dies ist das Ziel der Abfrageoptimierung.

� Bestimmen der effektivsten Strategie für die Verarbeitung von Ver-knüpfungsoperationen, z. B. der Reihenfolge, in der Tabellen verknüpft werden, und der zu verwendenden Verknüpfungsstrategie.

� Durchführen einer kostenorientierten Bewertung von Alternativen, um den effizientesten Plan für eine bestimmte Abfrage auswählen zu können.

� Erstellen von Spaltenstatistiken, um die Leistung der Abfrage zu verbessern.

ThemaGeben Sie eine Einführung zum Abfrageoptimierer.

EinstiegDer Abfrageoptimierer ist die Komponente, die für die Generierung des optimalen Ausführungsplanes für eine Abfrage zuständig ist.

Page 678: Programmieren Einer Microsoft SQL Server 2000-Datenbank

4 Unterrichtseinheit 13: Optimieren der Abfrageleistung

Verwenden zusätzlicher Informationen Der Abfrageoptimierer verwendet zusätzliche Informationen zu den zugrunde liegenden Daten und Speicherstrukturen, zur Dateigröße und zu Dateistruktur-typen. Darüber hinaus verwendet der Abfrageoptimierer eine Auswahl eigener interner Operationen, wie z. B. das Erstellen temporärer Indizes oder Tabellen im Arbeitsspeicher, um die Leistung von Abfragen zu verbessern.

Erstellen eines Ausführungsplanes Der Abfrageoptimierer erstellt einen Ausführungsplan, der die Abfolge der Schritte beschreibt, die zur Durchführung einer Abfrage erforderlich sind. Der Abfrageoptimierer optimiert den Vorgang des Suchens, Verknüpfens, Gruppierens und Sortierens von Zeilen.

Page 679: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 13: Optimieren der Abfrageleistung 5

Verwendung der kostenorientierten Optimierung durch den Abfrageoptimierer

� Begrenzen der Anzahl an Optimierungsplänen

� Kosten werden im Hinblick auf E/A und CPU-Ressourcen abgeschätzt

� Bestimmen der Abfrageverarbeitungszeit

� Verwenden von physischen Operatoren und Abfolge der Operationen

� Verwenden paralleler und serieller Verarbeitung

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Der Abfrageoptimierer ist ein kostenorientierter Optimierer, d. h., er bewertet jeden Ausführungsplan, indem er die jeweiligen Ausführungskosten schätzt.

Die Kostenschätzungen können nur so präzise sein wie die ver-fügbaren statistischen Daten zu den Spalten, Indizes und Tabellen.

Begrenzen der Anzahl an Optimierungsplänen Um die Ausführungszeit auf eine angemessene Länge zu beschränken, begrenzt der Abfrageoptimierer die Anzahl der von ihm berücksichtigten Optimierungs-pläne. Durch die Bewertung von Abfolgen der relationalen Operationen, die zur Erstellung des Resultsets erforderlich sind, ermittelt der Abfrageoptimierer einen Ausführungsplan, der im Hinblick auf E/A und Beanspruchung von CPU-Ressourcen die geringsten Kosten verursacht.

Bestimmen der Abfrageverarbeitungszeit Die Abfrageleistung wird bestimmt durch die physischen Operatoren, die der Abfrageoptimierer verwendet, und die Abfolge, in der die Operationen ver-arbeitet werden. Das Ziel ist die Reduzierung folgender Faktoren:

� Der Anzahl der zurückgegebenen Zeilen. � Der Anzahl der gelesenen Seiten. � Der insgesamt aufgewendeten Verarbeitungszeit, indem E/A und CPU-

Ressourcen minimiert werden, die für einen Ausführungsplan verwendet werden.

ThemaErläutern Sie die kosten-orientierte Optimierung.

EinstiegDer Abfrageoptimierer ist ein kostenorientierter Opti-mierer, d. h., er bewertet jeden Ausführungsplan, indem er die jeweiligen Kosten für die Ausführung schätzt.

Anmerkung

Page 680: Programmieren Einer Microsoft SQL Server 2000-Datenbank

6 Unterrichtseinheit 13: Optimieren der Abfrageleistung

Wenn der Abfrageoptimierer Abfragen optimiert, entscheidet er sich nicht für den Ausführungsplan mit der geringsten Ressourcenbeanspruchung, sondern vielmehr für den Ausführungsplan, der die Ergebnisse bei vertretbarer Ressourcenbeanspruchung am schnellsten an den Benutzer zurückgibt.

Wenn Microsoft® SQL Server™ 2000 über mehr als einen Pro-zessor verfügt, teilt der Abfrageoptimierer die Abfrage möglicherweise auf die Prozessoren auf. Abfragen mit langen Ausführungszeiten können normaler-weise von Plänen für die parallele Ausführung profitieren. Eine parallele Ab-frage kann jedoch insgesamt mehr Ressourcen beanspruchen als die serielle Verarbeitung einer Abfrage.

Anmerkung

Page 681: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 13: Optimieren der Abfrageleistung 7

Funktionsweise des Abfrageoptimierers

AnalyseprozessAnalyseprozess

StandardisierungsprozessStandardisierungsprozess

AbfrageoptimierungAbfrageoptimierung

KompilierungKompilierung

DatenbankzugriffsroutinenDatenbankzugriffsroutinen

Transact-SQLTransact-SQL

Result-set

Result-set

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Nachdem eine Abfrage gesendet wurde, werden mehrere Schritte durchlaufen, durch die die ursprüngliche Abfrage in ein Format transformiert wird, das der Abfrageoptimierer interpretieren kann.

Analyseprozess Der Analyseprozess überprüft die eingehende Abfrage im Hinblick auf korrekte Syntax und unterteilt die Syntax in Komponententeile, auf die das relationale Datenbankmodul antworten kann. Die Ausgabe dieses Schrittes ist eine analysierte Abfragestruktur.

StandardisierungsprozessDer Standardisierungsprozess transformiert eine Abfrage in ein für die Opti-mierung geeignetes Format. Werden redundante Syntaxklauseln ermittelt, so werden diese entfernt. Unterabfragen werden standardisiert, sofern dies möglich ist. Die Ausgabe dieses Schrittes ist eine standardisierte Abfragestruktur.

AbfrageoptimierungDer Vorgang, in dessen Verlauf aus mehreren möglichen Ausführungsplänen ein Plan ausgewählt wird, wird Optimierung genannt. Diese Phase setzt sich aus mehreren Schritten zusammen. Für die Kosten des Ausführungsplanes sind je-doch die folgenden Schritte am bedeutsamsten: Abfrageanalyse, Indexauswahl und Verknüpfungsauswahl.

KompilierungDie Abfrage wird zu ausführbarem Code kompiliert.

DatenbankzugriffsroutinenDer Abfrageoptimierer ermittelt, ob die Durchführung eines Tabellenscans oder die Verwendung eines verfügbaren Indexes die beste Methode für den Daten-zugriff darstellt. Anschließend wird die bessere Methode angewendet.

ThemaBeschreiben Sie, wie der Abfrageoptimierer eine Abfrage verarbeitet, nachdem sie an SQL Server gesendet wurde.

EinstiegNachdem eine Abfrage gesendet wurde, werden mehrere Schritte durchlaufen, durch die die ursprüngliche Abfrage in ein Format transformiert wird, das der Abfrageoptimierer interpretieren kann.

Methodischer Hinweis Erklären Sie, inwiefern die einzelnen Schritte dazu beitragen, dass die ursprüngliche Abfrage in ein Format transformiert wird, das der Abfrageoptimierer interpretieren kann.

Page 682: Programmieren Einer Microsoft SQL Server 2000-Datenbank

8 Unterrichtseinheit 13: Optimieren der Abfrageleistung

Phasen der Abfrageoptimierung

� Abfrageanalyse

� Identifiziert die Such- und Verknüpfungskriterien der Abfrage

� Indexauswahl

� Bestimmt, ob ein Index oder mehrere Indizes vorliegen

� Bewertet die Verwendbarkeit eines Indexes oder von Indizes

� Verknüpfungsauswahl

� Auswerten, welche Verknüpfungsstrategie verwendet werden soll

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Die Abfrageoptimierung besteht aus drei Phasen. Bei diesen Phasen handelt es sich nicht um voneinander getrennte Verarbeitungsschritte. Diese Unterteilung dient lediglich der besseren Darstellung der internen Aktivitäten des Abfrage-optimierers.

AbfrageanalyseDie erste Phase der Abfrageoptimierung wird als Abfrageanalyse bezeichnet. In dieser Phase identifiziert der Abfrageoptimierer die Such- und Verknüpfungs-kriterien der Abfrage. Durch eine Begrenzung der Suche minimiert der Ab-frageoptimierer die Anzahl der Zeilen, die verarbeitet werden. Indem die An-zahl der verarbeiteten Zeilen reduziert wird, wird die Anzahl der gelesenen Index- und Datenseiten verringert.

IndexauswahlDie Indexauswahl stellt die zweite Phase der Abfrageoptimierung dar. Während dieser Phase stellt der Abfrageoptimierer fest, ob für die identifizierten Klauseln ein Index vorliegt. Im Anschluss daran erfolgt eine Bewertung des Nutzens des Indexes oder der Indizes. Der Nutzen eines Indexes bemisst sich danach, wie viele Zeilen zurückgegeben werden. Diese Informationen werden den Index- oder den Spaltenstatistiken entnommen. Die Schätzung der Kosten der ver-schiedenen Zugriffsmethoden erfolgt anhand der Schätzung der logischen und physischen Lesevorgänge, die erforderlich sind, um die entsprechenden Zeilen zu finden.

Verknüpfungsauswahl Die Verknüpfungsauswahl stellt die dritte Phase der Abfrageoptimierung dar. Wenn eine Abfrage, die sich auf mehrere Tabellen bezieht, oder eine Selbst-verknüpfung vorliegt, erfolgt eine Bewertung der Verknüpfungsstrategie, die verwendet werden soll. Bei der Ermittlung der zu verwendenden Verknüp-fungsstrategie werden eine Reihe von Faktoren herangezogen: Selektivität, Dichte und Arbeitsspeicher, der zum Verarbeiten der Abfrage erforderlich ist.

ThemaStellen Sie die Phasen vor, die während der Abfrage-optimierung durchlaufen werden.

EinstiegDie Abfrageoptimierung besteht aus drei Phasen.

Page 683: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 13: Optimieren der Abfrageleistung 9

Zwischenspeichern des Ausführungsplanes

� Speichern eines Ausführungsplanes im Arbeitsspeicher� Eine Kopie für alle seriellen Ausführungen� Eine weitere Kopie für alle parallelen Ausführungen

� Verwenden eines Ausführungskontextes� Falls ein Ausführungsplan vorhanden ist, wird dieser

wiederverwendet� Falls kein Ausführungsplan vorhanden ist, generiert

SQL Server einen neuen Ausführungsplan� Erneutes Kompilieren von Ausführungsplänen

� Bestimmte Änderungen in einer Datenbank können dazu führen, dass ein Ausführungsplan ineffizient oder nicht mehr gültig ist

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

SQL Server verfügt über einen Arbeitsspeicherpool, in dem Ausführungspläne und Datenpuffer gespeichert werden. Der Prozentsatz des Pools, der entweder für Ausführungspläne oder für Datenpuffer reserviert wird, ändert sich dyna-misch in Abhängigkeit vom jeweiligen Systemstatus. Der Teil des Arbeits-speicherpools, der zum Speichern von Ausführungsplänen verwendet wird, wird Prozedurcache genannt.

Speichern eines Ausführungsplanes im Arbeitsspeicher Bei dem größten Teil des Ausführungsplanes handelt es sich um eine wieder-verwendbare, schreibgeschützte Datenstruktur, die von einer beliebigen Anzahl von Benutzern verwendet werden kann. Im Ausführungsplan wird kein Benutzerkontext gespeichert. Im Arbeitsspeicher befinden sich nie mehr als zwei Kopien des Ausführungsplanes:

� Eine Kopie für alle seriellen Ausführungen. � Eine weitere Kopie für alle parallelen Ausführungen.

Die parallele Kopie deckt alle parallelen Ausführungen ab, und zwar unab-hängig von ihrem Grad an Parallelität.

ThemaBeschreiben Sie, wie Aus-führungspläne im Cache verwaltet werden und wie die Reduzierung von er-neuten Plankompilierungen zu einer Verbesserung der Leistung beitragen kann.

EinstiegSQL Server verfügt über einen Arbeitsspeicherpool, in dem Ausführungspläne und Datenpuffer gespeichert werden.

Page 684: Programmieren Einer Microsoft SQL Server 2000-Datenbank

10 Unterrichtseinheit 13: Optimieren der Abfrageleistung

Verwenden eines Ausführungskontextes Jeder Benutzer, der eine Abfrage ausführt, verfügt über eine Datenstruktur mit Daten, die speziell für die jeweilige Ausführung gelten (z. B. Parameterwerte). Diese Datenstruktur wird als Ausführungskontext bezeichnet. Wenn eine Transact-SQL-Anweisung ausgeführt wird, scannt SQL Server den Prozedur-cache, um zu ermitteln, ob für diese Transact-SQL-Anweisung bereits ein Aus-führungsplan vorhanden ist.

� Falls ein Ausführungsplan vorhanden ist, wird dieser Plan von SQL Server wiederverwendet. Auf diese Weise wird der Aufwand des erneuten Kompilierens der Transact-SQL-Anweisung vermieden.

� Falls kein Ausführungsplan vorhanden ist, generiert SQL Server einen neuen Ausführungsplan für die Abfrage.

Erneutes Kompilieren von Ausführungsplänen Bestimmte Änderungen in einer Datenbank können dazu führen, dass ein Aus-führungsplan ineffizient oder nicht mehr gültig ist. Wenn SQL Server Änderun-gen feststellt, die dazu führen, dass ein Ausführungsplan ungültig wird, wird der Ausführungsplan als ungültig markiert. Für die nächste Verbindung, die die Abfrage ausführt, wird ein neuer Ausführungsplan kompiliert.

Sie können die Leistung verbessern, indem Sie die Anzahl der er-neuten Kompilierungen eines Planes reduzieren.

Folgende Faktoren können dazu beitragen, dass ein Ausführungsplan ungültig wird:

� Strukturelle Änderungen an einer Tabelle oder Sicht, auf die die Abfrage verweist (die Anweisungen ALTER TABLE und ALTER VIEW).

� Eine explizit durch eine Anweisung wie z. B. UPDATE STATISTICS oder automatisch durchgeführte Generierung neuer Verteilungsstatistiken.

� Löschen eines Indexes, der von dem Ausführungsplan verwendet wird. � Ein expliziter Aufruf der gespeicherten Systemprozedur sp_recompile.� Eine große Anzahl von Änderungen an Schlüsseln oder von INSERT- oder

DELETE-Anweisungen, die auf einer Tabelle ausgeführt werden, auf die die Abfrage verweist.

� Ein deutlicher Anstieg der Zeilenanzahl in der inserted- oder der deleted-Tabelle für Tabellen mit Triggern.

SQL Server verwendet einen Alterungsalgorithmus, um die Aus-führungspläne im Cache effizient zu verwalten. Hierbei werden Kosten und Verwendung des Ausführungsplanes bewertet.

Wichtig

Anmerkung

Page 685: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 13: Optimieren der Abfrageleistung 11

Festlegen eines Kostenlimits

� Angeben eines oberen Limits

� Verwenden der Abfragekontrolle, um die Ausführung von Abfragen zu verhindern, die lange laufen und Systemressourcen konsumieren

� Angeben von Verbindungslimits

� Verwenden der gespeicherten Systemprozedur sp_configure

� Ausführen derSET QUERY_GOVERNOR_COST_LIMIT-Anweisung

� Angeben von 0, um die Abfragekontrolle zu deaktivieren

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Sie können die Kosten der Ausführung einer Abfrage kontrollieren, indem Sie ein Kostenlimit festlegen. Der Begriff Abfragekosten bezieht sich auf die ge-schätzte Zeit in Sekunden, die bei einer bestimmten Hardwarekonfiguration für das Ausführen einer Abfrage benötigt wird.

Angeben eines oberen Limits Mit Hilfe der Option query governor cost limit können Sie verhindern, dass Abfragen mit langen Ausführungszeiten ausgeführt werden und System-ressourcen beanspruchen. Standardmäßig wird die Ausführung jeder Abfrage unabhängig von der Ausführungsdauer zugelassen. Die Abfragekontrolle ver-wendet einen geschätzten Kostenwert, um zu verhindern, dass Abfragen mit hohen Kosten überhaupt ausgeführt werden.

Obwohl der Konfigurationswert in Sekunden angegeben wird, bezieht er sich nicht wirklich auf die Zeit, sondern auf die tatsächlichen geschätzten Kosten der Abfrage. Sie können für die Abfrage, die ausgeführt werden soll, ein oberes Kostenlimit angeben.

Da die Abfragekontrolle auf der geschätzten Ausführungszeit und nicht auf der tatsächlich verstrichenen Zeit beruht, verursacht sie keinen Laufzeitaufwand. Wenn die geschätzten Kosten einer Abfrage das angegebene Kostenlimit über-steigen, verhindert die Abfragekontrolle, dass die Abfrage ausgeführt wird. Diese Vorgehensweise ist effizienter, als wenn eine Abfrage so lange ausge-führt würde, bis ein vorab definiertes Limit erreicht ist, und die Ausführung der Abfrage erst dann beendet würde.

ThemaGeben Sie eine Einführung zur Abfragekontrolle.

EinstiegSie können die Kosten der Ausführung einer Abfrage kontrollieren, indem Sie ein Kostenlimit festlegen.

Page 686: Programmieren Einer Microsoft SQL Server 2000-Datenbank

12 Unterrichtseinheit 13: Optimieren der Abfrageleistung

Angeben von Verbindungslimits Sie können Limits für alle Verbindungen oder auch nur für die Abfragen einer bestimmten Verbindung angeben. Um Kostenlimits der Abfragekontrolle anzu-wenden, können Sie folgendermaßen vorgehen:

� Verwenden der gespeicherten Prozedur sp_configure, um Limits auf alle Verbindungen anzuwenden. Sie können das Kostenlimit der Abfragekontrolle nur ändern, wenn die Option show advanced options auf 1 festgelegt ist. Diese Einstellung wird sofort wirksam. Sie müssen den Server nicht anhalten und neu starten.

� Ausführen der SET QUERY_GOVERNOR_COST_LIMIT-Anweisung, um Limits auf eine bestimmte Verbindung anzuwenden.

� Angeben von 0 (Standardeinstellung), um die Abfragekontrolle zu deakti-vieren. In diesem Fall werden alle Abfragen ohne Anwendung eines Limits ausgeführt.

Page 687: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 13: Optimieren der Abfrageleistung 13

���� Abrufen von Ausführungsplaninformationen

� Anzeigen der Ausgabe von STATISTICS-Anweisungen

� Anzeigen der Ausgabe von SHOWPLAN_ALL und SHOWPLAN_TEXT

� Grafisches Anzeigen des Ausführungsplanes

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Wenn der Abfrageoptimierer den besten Ausführungsplan ermittelt, wertet er die Informationen aus, die ihm zu diesem Zeitpunkt zur Verfügung stehen. Sie können Informationen zum Ausführungsplan abrufen, indem Sie die sysindexes-Tabelle abfragen. Darüber hinaus haben Sie die Möglichkeit, Infor-mationen abzurufen, indem Sie die STATISTICS-Anweisungen oder die SHOWPLAN-Anweisungen verwenden oder den Ausführungsplan grafisch anzeigen.

ThemaStellen Sie die Themen dieses Abschnitts vor.

EinstiegVerwenden Sie die folgenden Methoden, um Informationen zum Aus-führungsplan zu erhalten.

Page 688: Programmieren Einer Microsoft SQL Server 2000-Datenbank

14 Unterrichtseinheit 13: Optimieren der Abfrageleistung

Anzeigen der Ausgabe von STATISTICS-Anweisungen

AnweisungAnweisungAnweisung BeispielausgabeBeispielausgabeBeispielausgabe

STATISTICSTIME

STATISTICSTIME

STATISTICSPROFILE

STATISTICSPROFILE

STATISTICS IOSTATISTICS IO

Server-Ausführungszeiten:CPU-Zeit = 0 ms, verstrichene Zeit = 2 ms.

Server-Ausführungszeiten:CPU-Zeit = 0 ms, verstrichene Zeit = 2 ms.

Rows Executes StmtText StmtId…-----------------------------------------------47 1 SELECT * FROM [charge] 16

WHERE (([charge_amt]>=@1)...

Rows Executes StmtText StmtId…-----------------------------------------------47 1 SELECT * FROM [charge] 16

WHERE (([charge_amt]>=@1)...

Member-Tabelle. Scananzahl 1, logischeLesevorgänge 23, physische Lesevorgänge 0, Read-Ahead-Lesevorgänge 0.

Member-Tabelle. Scananzahl 1, logischeLesevorgänge 23, physische Lesevorgänge 0, Read-Ahead-Lesevorgänge 0.

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Mit Hilfe der Anweisungen STATISTICS IO, STATISTICS TIME und STATISTICS PROFILE können Sie Informationen abrufen, die Ihnen beim Diagnostizieren von Abfragen mit langen Ausführungszeiten helfen. Die Aus-gabe von STATISTICS-Anweisungen stellt Informationen zum eigentlichen Ausführungsplan bereit.

STATISTICS TIME ruft Informationen zur Anzahl der Millisekunden ab, die zum Analysieren, Kompilieren und Ausführen jeder Anweisung erforderlich sind.

STATISTICS PROFILE zeigt die Profilinformationen für eine Anweisung an. Wenn Sie eine Abfrage ausführen, werden die Ausgabe der SHOWPLAN_ALL-Anweisung und zwei weitere Spalten in das Resultset ein-gebunden. In der folgenden Tabelle sind die zusätzlichen Spalten aufgeführt.

Spalte Beschreibung

Rows Tatsächliche Anzahl der Zeilen, die jeder Operator erzeugt.

Executes Tatsächliche Anzahl der Ausführungen des Operators.

ThemaErläutern Sie, wie statis-tische Ausgaben mit Hilfe der STATISTICS-Anwei-sungen angezeigt werden können.

EinstiegMit Hilfe der Anweisungen STATISTICS IO, STATISTICS TIME und STATISTICS PROFILE können Sie Informationen abrufen, die Ihnen beim Diagnostizieren von Ab-fragen mit langen Ausfüh-rungszeiten helfen.

Page 689: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 13: Optimieren der Abfrageleistung 15

STATISTICS IO ruft Informationen zum Umfang der durch Abfragen erzeug-ten Seitenlesevorgänge ab. Die Ausgabe von STATISTICS IO schließt die Werte ein, die in der folgenden Tabelle aufgeführt sind.

Wert Beschreibung Weitere Informationen

Logische Lesevorgänge

Anzahl der aus dem Datencache gelesenen Seiten.

Der Zugriff auf alle Seiten erfolgt im Datencache. Wenn eine Seite nicht im Cache verfügbar ist, muss sie physisch vom Datenträger gelesen werden.

Physische Lesevorgänge

Anzahl der von der Festplatte gelesenen Seiten.

Dieser Wert ist immer kleiner oder gleich dem Wert für die logischen Lesevorgänge.

Im Folgenden ist die Methode für die Berechnung des Wertes der Cachetrefferquote aufgeführt:

Logische Lesevorgänge

Physische Lesevorgänge

Logische Lesevorgänge Cachetrefferquote =

-

Read-Ahead-Lesevorgänge

Anzahl der Seiten, die in den Cache geschrieben werden.

Wenn dieser Wert hoch ist, bedeutet dies, dass der Wert für physische Lesevorgänge niedriger und die Cachetrefferquote höher ist, als wenn Read-Ahead nicht aktiviert wäre.

Scananzahl Anzahl der Zugriffe auf die Tabelle. Für die äußeren Tabellen einer linken Verknüpfung sollte der Scanzähler immer den Wert 1 aufweisen. Für innere Tabellen wird die Anzahl der logischen Lesevorgänge durch den Scanzähler, multipliziert mit der Anzahl der Seiten, auf die bei jedem Scan zugegriffen wird, bestimmt.

Die SET-Anweisungen bleiben so lange für die Sitzung gültig, bis Sie die Option OFF angeben oder die Sitzung beenden. Anmerkung

Page 690: Programmieren Einer Microsoft SQL Server 2000-Datenbank

16 Unterrichtseinheit 13: Optimieren der Abfrageleistung

Anzeigen der Ausgabe von SHOWPLAN_ALL und SHOWPLAN_TEXT

� Struktur der Ausgabe der SHOWPLAN-Anweisung� Gibt Informationen in einem Satz von Zeilen zurück� Bildet eine hierarchische Struktur� Stellt Schritte dar, die vom Abfrageoptimierer

durchlaufen werden� Zeigt geschätzte Werte zur Optimierung einer Abfrage

an, nicht den tatsächlichen Ausführungsplan� Details der Ausführungsschritte� Unterschiede zwischen der Ausgabe von

SHOWPLAN_TEXT und SHOWPLAN_ALL

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Mit Hilfe der Anweisungen SET SHOWPLAN_TEXT und SET SHOWPLAN_ALL können Sie detaillierte Informationen zur Ausführung von Abfragen und zum Umfang der Ressourcen abrufen, die für die Verarbeitung der Abfrage erforderlich sind.

Struktur der Ausgabe der SHOWPLAN-Anweisung Für die Ausgabe der SHOWPLAN-Anweisung gilt Folgendes:

� Sie gibt Informationen in einem Satz von Zeilen zurück. � Sie bildet eine hierarchische Struktur. � Sie stellt die Schritte dar, die vom Abfrageoptimierer durchlaufen werden,

um die einzelnen Anweisungen auszuführen. � Sie zeigt geschätzte Werte zur Optimierung einer Abfrage an, nicht den

tatsächlichen Ausführungsplan. Die geschätzten Werte basieren auf vorhandenen Statistiken.

Details der Ausführungsschritte Jede in der Ausgabe widergespiegelte Anweisung enthält zuerst eine Zeile mit dem Text der Anweisung, auf die mehrere Zeilen mit den Details der Ausfüh-rungsschritte folgen. Die Details der Ausführungsschritte umfassen Folgendes:

� Welche Indizes werden mit welchen Tabellen verwendet. � Die Verknüpfungsreihenfolge der Tabellen. � Der gewählte Aktualisierungsmodus. � Arbeitstabellen und andere Strategien.

ThemaErläutern Sie die Verwen-dung der SHOWPLAN-Anweisungen.

EinstiegMit Hilfe der Anweisungen SET SHOWPLAN_TEXT und SET SHOWPLAN_ALL können Sie detaillierte Infor-mationen zur Ausführung von Abfragen und zum Umfang der Ressourcen abrufen, die für die Ver-arbeitung der Abfrage erforderlich sind.

Page 691: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 13: Optimieren der Abfrageleistung 17

Unterschiede zwischen der Ausgabe von SHOWPLAN_TEXT und SHOWPLAN_ALL Der Unterschied zwischen der Ausgabe von SHOWPLAN_TEXT und SHOWPLAN_ALL ist, dass die Ausgabe von SHOWPLAN_ALL weitere Informationen zurückgibt, z. B. geschätzte Zeilen, E/A, CPU und durch-schnittliche Zeilenlänge der Abfrage.

Die SET-Anweisungen bleiben so lange für die Sitzung gültig, bis Sie die Option OFF angeben oder die Sitzung beenden. Anmerkung

Page 692: Programmieren Einer Microsoft SQL Server 2000-Datenbank

18 Unterrichtseinheit 13: Optimieren der Abfrageleistung

���� Grafisches Anzeigen des Ausführungsplanes

� Elemente des grafischen Ausführungsplanes

� Lesen der Ausgabe des grafischen Ausführungsplanes

� Verwenden der Bookmark Lookup-Operation

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Mit Hilfe von SQL Query Analyzer können Sie einen Ausführungsplan mit farbiger Kennzeichnung anzeigen.

ThemaStellen Sie die Themen dieses Unterabschnitts vor.

EinstiegMit Hilfe von SQL Query Analyzer können Sie einen Ausführungsplan mit farbiger Kennzeichnung anzeigen.

Page 693: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 13: Optimieren der Abfrageleistung 19

Elemente des grafischen Ausführungsplanes

� Schritte sind die Arbeitseinheiten, die für die Verarbeitung einer Abfrage verwendet werden

� Schrittfolge ist die Reihenfolge, in der die Schritte verarbeitet werden

� Logische Operatoren beschreiben die relationale algebraische Operation, die für die Verarbeitung einer Anweisung verwendet wird

� Physische Operatoren beschreiben den Algorithmus, der für die physische Implementierung der Anweisungsverarbeitung verwendet wird

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Im grafischen Ausführungsplan, der die folgenden Elemente enthält, werden Symbole verwendet, um die Ausführung bestimmter Teile von Anweisungen und Abfragen darzustellen:

Schritte sind die Arbeitseinheiten, die für die Verarbeitung einer Abfrage verwendet werden.

Schrittfolge ist die Reihenfolge, in der die Schritte verarbeitet werden.

Logische Operatoren beschreiben die relationale algebraische Operation, die für die Verarbeitung einer Anweisung verwendet wird, z. B. Durchführen einer Aggregation. Der logische Operator entspricht üblicherweise dem physischen Operator. Nicht für alle Schritte, die für die Verarbeitung einer Abfrage ver-wendet werden, oder Aktualisierungsoperationen werden logische Operatoren eingesetzt.

Physische Operatoren beschreiben den Algorithmus, der für die physische Implementierung der Anweisungsverarbeitung verwendet wird, z. B. Scannen eines gruppierten Indexes. Für jeden Schritt im Rahmen einer Abfrage oder Aktualisierungsoperation ist ein physischer Operator erforderlich.

ThemaBenennen Sie die Elemente des grafischen Ausfüh-rungsplanes.

EinstiegIm grafischen Ausführungs-plan, der die folgenden Elemente enthält, werden Symbole verwendet, um die Ausführung bestimmter Teile von Anweisungen und Abfragen darzustellen.

Methodischer Hinweis Gehen Sie kurz auf die Symbole, die physischen Operatoren und die Be-schreibungen ein, die der Abfrageoptimierer ver-wendet. Eine Liste der physischen Operatoren folgt.

Page 694: Programmieren Einer Microsoft SQL Server 2000-Datenbank

20 Unterrichtseinheit 13: Optimieren der Abfrageleistung

In der folgenden Liste wird ein Teil der physischen Operatoren aufgeführt, die der Abfrageoptimierer verwendet, um die Algorithmen darzustellen.

Symbol Physischer Operator Operatorbeschreibung

Bookmark Lookup Dieser Operator verwendet ein Lesezeichen (Zeilen-ID oder Gruppierungs-schlüssel), um die zugehörige Zeile in der Tabelle oder im gruppierten Index zu suchen.

Filter Dieser Operator scannt die Eingabe und gibt nur die Zeilen zurück, die den in der Argument-Spalte enthaltenen Filterausdruck erfüllen.

Hash Match Dieser Operator erzeugt eine Hashtabelle, indem er für jede Zeile der Erstellungs-eingabe einen Hashwert berechnet.

Index Scan Dieser Operator ruft alle Zeilen aus dem in der Argument-Spalte angegebenen nicht gruppierten Index ab.

Index Seek Dieser Operator verwendet die Suchfunktionen der Indizes, um Zeilen aus einem nicht gruppierten Index abzurufen.

Merge Join Diese Operator führt alle Arten von Verknüpfungen aus (ausgenommen Selbst-verknüpfungen und CROSS JOINs), einschließlich UNIION-Operationen.

Nested Loops Dieser Operator führt, üblicherweise mit Hilfe eines Indexes, für jede Zeile der äußeren Tabelle eine Suche in der inneren Tabelle durch.

Sort Dieser Operator sortiert alle eingehenden Zeilen.

Table Scan Dieser Operator ruft alle Zeilen aus der in der Argument-Spalte angegebenen Tabelle ab.

Eine vollständige Auflistung der Symbole sowie weitere Informationen erhalten Sie, indem Sie in der SQL Server-Onlinedokumentation nach „Grafische Anzeige des Ausführungsplanes mithilfe von SQL Query Analyzer“ suchen.

Anmerkung

Page 695: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 13: Optimieren der Abfrageleistung 21

Lesen der Ausgabe des grafischen Ausführungsplanes Abfrageplan

SELECTKosten: 0%

Bookmark LookupKosten: 8%

Hash Match Root…Kosten: 28%

Member.corp_noKosten: 9%

Member.fnameKosten: 10%

FilterKosten: 0%

SchrittfolgeSchrittfolgeSchrittfolge

Index SeekScannt einen bestimmten Bereich von Zeilen von einem nicht gruppierten Index

Physische Operation:Logische Operation:Zeilenanzahl:Geschätzte Zeilenlänge:E/A-Kosten:CPU-Kosten:Anzahl der Ausführungen:Kosten:Teilbaumkosten:

Index SeekIndex Seek

41424

0.007060.000605

1.00.007675(6%)

0.00767

Argument:OBJECT: ([credit].[dbo].[member].[fname]), SEEK: ([member],[firstname] >=‘Rb’ AND [member],[firstname] <‘T’) ORDERED

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Die Ausgabe des grafischen Ausführungsplanes wird von rechts nach links und von oben nach unten gelesen. Jede Abfrage im Batch, die analysiert wird, wird angezeigt, einschließlich des prozentualen Kostenanteils der Abfrage an den Batchgesamtkosten.

Jeder Schritt kann einen oder mehrere zu verarbeitende Knoten umfassen. Der Begriff Knoten bezeichnet eine Operation, die der Abfrageoptimierer verwendet und die durch ein Symbol dargestellt wird.

Der Ausführungsplan kann mehrere Knoten für einen bestimmten Schritt ent-halten.

� Jeder Knoten steht in Beziehung zu einem übergeordneten Knoten. � Alle Knoten mit demselben übergeordneten Knoten werden in derselben

Spalte dargestellt. � Pfeile verbinden jeden Knoten mit seinem übergeordneten Knoten. � Rekursive Operationen werden mit dem Iterationssymbol dargestellt. � Operatoren werden als Symbole dargestellt, die sich auf einen bestimmten

übergeordneten Knoten beziehen. � Wenn der Batch mehrere Anweisungen enthält, werden mehrere Aus-

führungspläne gezeichnet.

ThemaErläutern Sie, wie die Aus-gabe des Ausführungs-planes gelesen werden muss.

EinstiegDie Ausgabe des grafischen Ausführungsplanes wird von rechts nach links und von oben nach unten gelesen. Jede Abfrage im Batch, die analysiert wird, wird ange-zeigt, einschließlich der prozentualen Kosten jeder Abfrage an den Gesamt-kosten des Batches.

Methodischer Hinweis Verwenden Sie SQL Query Analyzer, um die Option Ausführungsplan an-zeigen zu aktivieren, und führen Sie dann eine Ab-frage aus.

Positionieren Sie den Maus-zeiger in der Ausgabe des Ausführungsplanes auf einem Symbol, um weitere Informationen zu der jeweiligen Operation anzuzeigen.

Page 696: Programmieren Einer Microsoft SQL Server 2000-Datenbank

22 Unterrichtseinheit 13: Optimieren der Abfrageleistung

Anzeigen weiterer Informationen Wenn Sie den Mauszeiger auf einem Knoten (der durch ein Symbol dargestellt wird) platzieren, werden neben den Informationen, die in der folgenden Tabelle aufgeführt sind, detaillierte Informationen zu den physischen und logischen Operatoren angezeigt.

Messwerte Beschreibung

Zeilenanzahl Die Anzahl der Zeilen, die vom Operator zurückgegeben werden.

Geschätzte Zeilenlänge

Die geschätzte Länge der Zeile, die vom Operator zurück-gegeben wird.

E/A-Kosten Die geschätzten Kosten der gesamten E/A-Aktivität für die Operation. Dieser Wert sollte möglichst klein sein.

CPU-Kosten Die geschätzten Kosten der gesamten CPU-Aktivität für die Operation.

Anzahl der Ausführungen

Die Anzahl der Ausführungen der Operation während einer Abfrage.

Kosten Die Kosten, die der Abfrageoptimierer beim Ausführen der Operation verursacht, einschließlich der prozentualen Kosten dieser Operation an den Gesamtkosten der Abfrage.

Teilbaumkosten Die Gesamtkosten, die der Abfrageoptimierer beim Ausführen dieser Operation und aller in demselben Teilbaum vorher-gehenden Kosten verursacht.

Argument Die Prädikate und Parameter, die von der Abfrage verwendet werden.

Methodischer Hinweis Geben Sie eine kurze Be-schreibung der unterschied-lichen Arten von Detailinfor-mationen, die angezeigt werden.

Page 697: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 13: Optimieren der Abfrageleistung 23

Verwenden der Bookmark Lookup-Operation

� Analysieren des Abfrageplanes

� Üblicherweise verwendet, wenn alle anderen Schritte verarbeitet wurden

� Abrufen von Zeilen

� Zeilen-ID

� Gruppierungsschlüssel

� Untersuchen der Detailinformationen

� Ein Lesezeichen, mit dessen Hilfe die Zeile gesucht wird

� Bestimmen, wann der Bookmark Lookup-Operatorverwendet wird

� Abfragen, die IN-Klauseln oder den OR-Operator enthalten

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Bookmark Lookup ist ein interner Operator, der häufig vom Abfrageoptimierer verwendet wird. Wenn der Abfrageoptimierer Datensätze identifiziert, die mög-liche Kandidaten für das beabsichtigte Resultset darstellen, zeichnet er die Information, die die Zeilenpositionen kennzeichnet (ein Lesezeichen) auf und fährt mit Operationen fort, durch die die Suche präzisiert wird.

Wenn eine Zeile in die Suche eingeschlossen wird, verwendet SQL Server die Zeilenposition aus dem Lesezeichen, um die Zeile zu finden, indem der Ab-frageplan analysiert wird, Zeilen abgerufen, Detailinformationen untersucht werden und indem bestimmt wird, wann der Bookmark Lookup-Operator verwendet wird.

Analysieren des Abfrageplanes Im Abfrageplan verwendet der Abfrageoptimierer den Bookmark Lookup-Operator üblicherweise dann, wenn alle anderen Schritte verarbeitet wurden.

Abrufen von Zeilen Der Bookmark Lookup-Operator ruft alle entsprechenden Zeilen ab, indem er Folgendes verwendet:

� Eine Zeilen-ID (Row ID, RID), um die entsprechende Zeile in einem Heap zu finden.

� Den Gruppierungsschlüssel, um die entsprechende Zeile in einem grup-pierten Index zu finden.

ThemaBeschreiben Sie, wie der Abfrageoptimierer die Bookmark Lookup-Operation verwendet.

EinstiegBookmark Lookup ist ein interner Operator, der vom Abfrageoptimierer ver-wendet wird.

Page 698: Programmieren Einer Microsoft SQL Server 2000-Datenbank

24 Unterrichtseinheit 13: Optimieren der Abfrageleistung

Untersuchen der Detailinformationen Der Abfrageplan enthält folgende Details zum Bookmark Lookup-Operator:

� Ein Lesezeichen, mit dessen Hilfe die Zeile in der Tabelle oder im gruppierten Index gesucht wird.

� Den Namen der Tabelle oder des gruppierten Indexes, in der bzw. in dem die Zeile gesucht wird.

� Die WITH PREFETCH-Klausel, wenn der Abfrageoptimierer ermittelt hat, dass Read-Aheads die beste Methode darstellen, um Lesezeichen in der Tabelle oder im gruppierten Index zu suchen.

Bestimmen, wann der Bookmark Lookup-Operator verwendet wird Der Abfrageoptimierer verwendet den Bookmark Lookup-Operator üblicher-weise, um Abfragen zu verarbeiten, die die IN-Klausel und OR-Operatoren in der WHERE-Klausel enthalten.

Im folgenden Beispiel weist die member-Tabelle einen nicht gruppierten Index für die member_no-Spalte auf. Der Abfrageoptimierer verwendet einen Bookmark Lookup-Operator, um die entsprechenden Zeilen abzurufen.

USE credit SELECT * FROM member WHERE member_no IN (4567,8765,4321)

Beispiel

Page 699: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 13: Optimieren der Abfrageleistung 25

���� Verwenden eines Indexes zum Abdecken einer Abfrage

� Einführung zu Indizes, die eine Abfrage abdecken

� Suchen von Daten mit Hilfe von Indizes, die eine Abfrage abdecken

� Bestimmen, ob ein Index zum Abdecken einer Abfrage verwendet werden kann

� Ermitteln, ob ein Index zum Abdecken einer Abfrage verwendet wird

� Richtlinien für das Erstellen von Indizes, die eine Abfrage abdecken

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Sie können Indizes erstellen, die die Abfrage auflösen, ohne direkt auf die Datenseiten zugreifen zu müssen. Durch diese Strategie kann die Abfrage-leistung verbessert werden.

ThemaStellen Sie die Themen dieses Abschnitts vor.

EinstiegSie können Indizes erstel-len, die die Abfrage erfüllen, ohne direkt auf die Daten-seiten zugreifen zu müssen.

Page 700: Programmieren Einer Microsoft SQL Server 2000-Datenbank

26 Unterrichtseinheit 13: Optimieren der Abfrageleistung

Einführung zu Indizes, die eine Abfrage abdecken

� Nur nicht gruppierte Indizes decken Abfragen ab

� Indizes müssen alle Spalten enthalten, auf die in der Abfrage verwiesen wird

� Es ist kein Zugriff auf Datenseiten erforderlich

� Indizierte Sichten können Daten vorab aggregieren

� Indizes, die Abfragen abdecken, können Daten schnell abrufen

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Wenn Sie Indizes erstellen, empfiehlt es sich mitunter, einen Index zu erstellen, der die gängigsten Abfragen abdeckt, da auf diese Weise der Umfang an E/A reduziert werden kann.

Nur nicht gruppierte Indizes decken Abfragen ab Bei Indizes, die Abfragen abdecken, befinden sich alle zur Auflösung einer Abfrage erforderlichen Daten auf der Blattebene eines nicht gruppierten Indexes.

Indizes müssen alle Spalten enthalten, auf die in der Abfrage verwiesen wirdEin Index, der eine Abfrage abdeckt, muss alle Spalten enthalten, auf die in der SELECT-Anweisung verwiesen wird. Wenn ein gruppierter Index vorhanden ist, befinden sich die Felder des Gruppierungsschlüssels auf der Blattebene des nicht gruppierten Indexes und tragen zur Abdeckung der Abfrage bei.

Es ist kein Zugriff auf Datenseiten erforderlich Wenn eine Abfrage durch einen Index abgedeckt wird, greift der Abfrage-optimierer nicht auf die Datenseiten zu, da alle erforderlichen Daten im Index enthalten sind. Der Umfang an E/A wird erheblich reduziert.

Indizierte Sichten können Daten vorab aggregieren Wenn eine indizierte Sicht Spaltenwerte summiert, zählt oder den Mittelwert bildet, kann der Abfrageoptimierer diese Sicht verwenden, um beim Auflösen einer Abfrage gespeicherte Werte bereitzustellen. Indizierte Sichten, die Daten vorab aggregieren, können die Leistung beträchtlich steigern.

ThemaErläutern Sie das Konzept von Indizes, die eine Ab-frage abdecken.

EinstiegWenn Sie Indizes erstellen, empfiehlt es sich mitunter, einen Index zu erstellen, der die gängigsten Abfragen abdeckt, da auf diese Weise der Umfang an E/A reduziert werden kann.

Page 701: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 13: Optimieren der Abfrageleistung 27

Indizes, die Abfragen abdecken, können Daten schnell abrufen Das Erstellen von Indizes, die Abfragen abdecken, ist eine der schnellsten Methoden, um auf Daten zuzugreifen. Dies gilt insbesondere für eine Abfrage mit niedriger Selektivität. Durch einen Vergleich der Blattebenen der grup-pierten und nicht gruppierten Indizes werden die Vorteile von Indizes, die Abfragen abdecken, klar erkennbar.

Indextyp Inhalt der Blattebene

Gruppiert Ganze Zeile (die tatsächlichen Datenseiten)

Nicht gruppiert Schlüsselwert

Da Indexwerte üblicherweise kleiner sind als die tatsächlichen Zeilen, kann eine Indexseite mehr Schlüsselwerte als vollständige Zeilen speichern. Das Speichern von Schlüsselwerten erfordert weniger Seiten, wodurch der Umfang an E/A reduziert wird.

Page 702: Programmieren Einer Microsoft SQL Server 2000-Datenbank

28 Unterrichtseinheit 13: Optimieren der Abfrageleistung

���� Suchen von Daten mit Hilfe von Indizes, die eine Abfrage abdecken

� Beispiel für die Einzelseiten-Navigation

� Beispiel für die Teilscan-Navigation

� Beispiel für die Navigation mittels vollständigem Scan

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Wenn ein Index zum Abdecken einer Abfrage verwendet werden kann, ver-wendet der Abfrageoptimierer unterschiedliche Verfahren zum Navigieren auf der Blattebene. Das Abdecken einer Abfrage kann das Lesen einer Einzelseite, eines Bereichs von Seiten oder sämtlicher Seiten der Blattebene umfassen. Auf die Datenseiten selbst wird jedoch nie zugegriffen.

ThemaGeben Sie eine Übersicht über die Themen dieses Unterabschnitts.

EinstiegWenn ein Index zum Ab-decken einer Abfrage verwendet werden kann, verwendet der Abfrage-optimierer unterschiedliche Verfahren zum Navigieren auf der Blattebene.

Page 703: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 13: Optimieren der Abfrageleistung 29

Beispiel für die Einzelseiten-Navigation

IndexseitenNicht-

Blattebene

Blattebene(Schlüsselwert)

SELECT lastname, firstnameFROM memberWHERE lastname = 'Hall'

SELECT lastname, firstnameFROM memberWHERE lastname = 'Hall'

AkhtarAkhtarBarrBarrBarrBarrBormBormBuhlBuhl

SarahSarah……………………

GanioGanioHallHallHartHartJonesJonesJonesJones

JonJonDonDonSherriSherriAmyAmyBeverlyBeverly

Hall DonLangLangMartinMartinMartinMartinMartinMartinMorisMoris

EricEric……………………

Datenseiten

… …

AkhtarAkhtarLangLang…………

SarahSarahEricEric…………

AkhtarAkhtar……GanioGanio……

SarahSarah……JonJon……

LangLang………………

EricEric………………

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Die Einzelseiten-Navigation liegt vor, wenn von der Nicht-Blattebene aus nur eine Seite der Blattebene gelesen wird. Das Lesen einer einzelnen Seite ent-spricht einer Punktabfrage, bei der die Informationen - eine einzelne Zeile oder mehrere Zeilen - auf einer Einzelseite gefunden werden.

Einzelseiten-Navigation heißt nicht, dass die Abfrage nur eine Zeile zurückgeben kann. Eine Punktabfrage kann eine Zeile oder alle Zeilen einer Seite zurückgeben. In beiden Fällen werden sämtliche Daten auf einer einzigen Seite gefunden.

Im folgenden Beispiel wird die Abfrage durch einen zusammengesetzten, nicht gruppierten Index für die Spalten lastname und firstname abgedeckt.

SELECT lastname, firstname FROM member WHERE lastname = 'Hall'

SQL Server führt die folgenden Schritte aus, um die gewünschten Informa-tionen abzurufen:

1. Durchlaufen der Indexstruktur, wobei der Nachname Hall mit den Schlüsselwerten verglichen wird.

2. Fortsetzen des Suchlaufs im Index, bis die erste Seite der Blattebene erreicht wird, die den Schlüsselwert Hall enthält.

3. Zurückgeben der entsprechenden Zeilen, ohne auf die Datenseiten zuzu-greifen, da die Blattebene die lastname- und firstname-Schlüsselwerte enthält.

ThemaBeschreiben Sie die Einzel-seiten-Navigation eines Indexes.

EinstiegIm folgenden Beispiel muss für eine Abfrage, die durch einen Index abgedeckt wird, eine Einzelseite der Blatt-ebene gelesen werden.

Anmerkung

Beispiel

Weitere Informationen Um die Darstellung zu ver-einfachen, wird der Zeiger von der Blattebene des nicht gruppierten Indexes auf die Datenseiten (Heap oder gruppierter Index) auf der Folie nicht gezeigt.

Page 704: Programmieren Einer Microsoft SQL Server 2000-Datenbank

30 Unterrichtseinheit 13: Optimieren der Abfrageleistung

Beispiel für die Teilscan-Navigation

IndexseitenNicht-

Blattebene

Blattebene(Schlüsselwert)

Blattebene(Schlüsselwert)

AkhtarAkhtarBarrBarrBarrBarrBormBormBuhlBuhl

…………………………

GanioGanioHallHallHartHart

JonesJonesJonesJones

…………………………

MorganMorganNashNashNayNayOtaOta

RuddRudd

…………………………

ChaiChaiConConConConCoxCoxDaleDale

…………………………

DunnDunnDunnDunnFineFineFortFortFunkFunk

…………………………

JordanJordanKimKimKimKimKochKochKochKoch

…………………………

LangLangMartinMartinMartinMartinMartinMartinMorisMoris

…………………………

SmithSmithSmithSmithSmithSmithSmithSmithSmithSmith

…………………………

Datenseiten

USE creditSELECT lastname, firstname FROM memberWHERE lastname BETWEEN 'Funk' AND 'Lang'

USE creditSELECT lastname, firstname FROM memberWHERE lastname BETWEEN 'Funk' AND 'Lang'

AkhtarAkhtarChaiChaiDunnDunnGanioGanio

……………………

JordanJordanLangLangMorganMorganSmithSmith

……………………

AkhtarAkhtar

JordanJordan

……

……

……

……

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Ein Teilscan liegt vor, wenn von der Blattebene aus ein Bereich von Seiten gelesen wird.

Im folgenden Beispiel wird die Abfrage durch einen zusammengesetzten, nicht gruppierten Index für die Spalten lastname und firstname abgedeckt, indem ein Teilscan für die Seiten der Blattebene durchgeführt wird.

USE credit SELECT lastname, firstname FROM member WHERE lastname BETWEEN 'Funk' AND 'Lang'

SQL Server führt die folgenden Schritte aus, um die gewünschten Informa-tionen abzurufen:

1. Durchlaufen der Indexstruktur. 2. Beginnen mit dem Lesen der Blattebenenseiten auf der Seite, auf der der

Nachname Funk zum ersten Mal vorkommt. Die Daten auf der Blattebene werden in aufsteigender Reihenfolge sortiert.

3. Lesen des Bereichs von Blattebenenseiten bis zu der Seite, die den Nach-namen Lang enthält. Zu diesem Zeitpunkt ist der Teilscan abgeschlossen.

4. Zurückgeben der entsprechenden Zeilen, ohne auf die Datenseiten zuzu-greifen, da der Scan hinsichtlich der Nachnamen zwischen Funk und Langauf der Blattebene erfolgt ist.

ThemaBeschreiben Sie die Teil-scan-Navigation auf einem Index.

EinstiegIm folgenden Beispiel müssen für eine Abfrage, die durch einen Index abgedeckt wird, mehrere Seiten der Blattebene gelesen werden.

Beispiel

Weitere Informationen Die firstname-Spalte wurde ausgelassen, um die Dar-stellung auf der Folie zu vereinfachen. Verweisen Sie auf die vorherige Folie, wenn diese Folie zu Unklarheiten führt.

Page 705: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 13: Optimieren der Abfrageleistung 31

Beispiel für die Navigation mittels vollständigem Scan

IndexseitenNicht-

Blattebene

Blattebene(Schlüsselwert)

AkhtarAkhtarBarrBarrBarrBarrBormBormBuhlBuhl

…………………………

GanioGanioHallHallHartHart

JonesJonesJonesJones

…………………………

MorganMorganNashNashNayNayOtaOta

RuddRudd

…………………………

MartinMartinSmithSmith

……

AkhtarAkhtarGanioGanio

……

AkhtarAkhtar……

MartinMartin

ChaiChaiConConConConCoxCoxDaleDale

…………………………

DunnDunnDunnDunnFineFineFortFortFunkFunk

…………………………

JordanJordanKimKimKimKim

KochKochKochKoch

…………………………

LangLangMartinMartinMartinMartinMartinMartinMorisMoris

…………………………

SmithSmithSmithSmithSmithSmithSmithSmithSmithSmith

…………………………

Datenseiten

USE creditSELECT lastname, firstnameFROM member

USE creditSELECT lastname, firstnameFROM member

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Ein vollständiger Scan liegt vor, wenn alle Seiten der Blattebene gelesen wer-den. Ähnlich wie ein Tabellenscan erfolgt ein vollständiger Scan, wenn eine Abfrage keine WHERE-Klausel enthält oder wenn die WHERE-Klausel nicht selektiv ist.

Im folgenden Beispiel wird die Abfrage durch einen zusammengesetzten, nicht gruppierten Index für die Spalten lastname und firstname abgedeckt, indem ein vollständiger Scan für die Seiten der Blattebene durchgeführt wird.

USE credit SELECT lastname, firstname FROM member

SQL Server führt die folgenden Schritte aus, um die Informationen abzurufen:

1. Durchlaufen der Indexstruktur. 2. Lesen der Blattebenenseiten, beginnend mit der ersten Seite, und Scannen

aller Blattebenenseiten, bis die letzte Seite der Blattebene erreicht ist. 3. Zurückgeben der entsprechenden Zeilen, ohne auf die Datenseiten zuzu-

greifen, da die Blattebene gescannt wurde.

Das Scannen der Blattebene eines Indexes ist auch ein paralleler Datenscan. SQL Server verwendet die Read-Ahead-Verarbeitung, um die Leistung der Abfrage weiter zu verbessern.

ThemaBeschreiben Sie die Index-navigation mittels voll-ständigem Scan.

EinstiegIm folgenden Beispiel müssen für eine Abfrage, die durch einen Index abgedeckt wird, alle Seiten der Blattebene gelesen werden.

Beispiel

Weitere Informationen Diese Folie stellt einen Scan nach Daten dar, die nach lastname geordnet sind. Wenn Daten ungeordnet oder nach firstname geord-net angefordert werden, kann SQL Server die Reser-vierungsseiten verwenden, um alle Indexseiten zu iden-tifizieren und zu scannen, und dann die Nicht-Blatt-seiten aussortieren. Die firstname-Spalte wurde ausgelassen, um die Dar-stellung auf der Folie zu vereinfachen.

Anmerkung

Page 706: Programmieren Einer Microsoft SQL Server 2000-Datenbank

32 Unterrichtseinheit 13: Optimieren der Abfrageleistung

Bestimmen, ob ein Index zum Abdecken einer Abfrage verwendet werden kann

� Der Index muss alle benötigten Daten enthalten

� Ein zusammengesetzter Index ist auch dann nützlich, wenn nicht auf die erste Spalte verwiesen wird

� Eine WHERE-Klausel ist nicht erforderlich

� Ein nicht gruppierter Index kann verwendet werden, wenn er weniger E/A erfordert als ein gruppierter Index, der eine Spalte enthält, auf die in der WHERE-KLausel verwiesen wird

� Indizes können verknüpft werden, um eine Abfrage abzudecken

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Ob ein Index eine Abfrage abdecken kann, hängt von folgenden Faktoren ab:

� Der Index muss alle benötigten Daten enthalten. Zu diesen Daten zählen alle Spalten, auf die verwiesen wird, unabhängig davon, ob sie im Resultset zurückgegeben, für Sortier- oder Aggregationsoperationen verwendet oder in der WHERE-Klausel angegeben werden.

� Eine Spalte in einem Index kann auch dann dazu beitragen, eine Abfrage abzudecken, wenn es sich nicht um die erste Spalte handelt, auf die in einem zusammengesetzten Index verwiesen wird. So könnte z. B. ein Index für SalesRep, Region und Amount (in dieser Reihenfolge) eine Abfrage abdecken, die nur auf Region und SUM(Amount) verweist.

� Eine WHERE-Klausel ist nicht erforderlich. Der Abfrageoptimierer scannt die ganze Blattebene.

� Ein nicht gruppierter Index kann zum Abdecken einer Abfrage verwendet werden, wenn er weniger E/A erfordert als ein gruppierter Index, der eine Spalte enthält, auf die in der WHERE-Klausel verwiesen wird.

� Indizes können verknüpft werden, um eine Abfrage abzudecken. Wenn einige oder alle Tabellen, auf die in einer Verknüpfungsoperation verwiesen wird, über einen Index verfügen, der eine Abfrage abdeckt, werden die Er-gebnisse durch eine besondere Verknüpfungsoperation verknüpft; an-schließend werden die Zeilen zurückgegeben.

ThemaErklären Sie, wann der Abfrageoptimierer einen Index verwenden kann, um eine Abfrage abzudecken.

EinstiegOb ein Index eine Abfrage abdecken kann, hängt von folgenden Faktoren ab.

Page 707: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 13: Optimieren der Abfrageleistung 33

Ermitteln, ob ein Index zum Abdecken einer Abfrage verwendet wird

� Überprüfen der Ausgabe des Ausführungsplanes

� Anzeigen des Satzes „Scannt einen nicht gruppierten Index, entweder vollständig oder nur einen Bereich“

� Vergleichen der E/A

� Nicht gruppierter IndexGesamtzahl der Ebenen auf Nicht-BlattebeneGesamtzahl der Seiten, aus denen sich die Blattebene zusammensetztGesamtzahl der Zeilen pro BlattebenenseiteGesamtzahl der Zeilen pro Datenseite

� Gesamtzahl der Seiten, aus denen sich die Tabelle zusammensetzt

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Ob Abfragen durch einen Index abgedeckt werden, ist für die Benutzer nicht unmittelbar erkennbar. Sie können den grafischen Ausführungsplan überprüfen oder die E/A vergleichen, um zu ermitteln, ob der Abfrageoptimierer einen Index verwendet hat, um eine Abfrage abzudecken.

Überprüfen der Ausgabe des Ausführungsplanes Sie können den Ausführungsplan grafisch anzeigen. Wenn die Ausgabe eines Ausführungsplanes den Satz „Scannt einen nicht gruppierten Index, entweder vollständig oder nur einen Bereich“ enthält, konnte der Abfrageoptimierer die Abfrage durch Verwendung eines Indexes abdecken.

Vergleichen der E/A Sie können auch die Ausgabe von STATISTICS IO anzeigen. Wenn Sie die Kosten eines Indexes bewerten, der eine Abfrage abdeckt, sollten Sie bedenken, dass der Abfrageoptimierer immer versucht, die Abfrage abzudecken, wenn er einen Ausführungsplan bewertet.

Wenn Sie ermitteln möchten, ob die Abfrage abgedeckt wird, sollten Sie über die folgenden Informationen zum nicht gruppierten Index und zur Tabelle verfügen:

� Nicht gruppierter Index

• Gesamtzahl der Ebenen auf Nicht-Blattebene

• Gesamtzahl der Seiten, aus denen sich die Blattebene zusammensetzt

• Gesamtzahl der Zeilen pro Blattebenenseite

• Gesamtzahl der Zeilen pro Datenseite

ThemaBeschreiben Sie, wie er-mittelt werden kann, ob eine Abfrage durch einen Index abgedeckt wird.

EinstiegOb Abfragen durch einen Index abgedeckt werden, ist für die Benutzer nicht un-mittelbar erkennbar. Sie können den grafischen Ausführungsplan überprüfen oder die E/A vergleichen, um zu ermitteln, ob der Abfrageoptimierer einen Index verwendet hat, um eine Abfrage abzudecken.

Page 708: Programmieren Einer Microsoft SQL Server 2000-Datenbank

34 Unterrichtseinheit 13: Optimieren der Abfrageleistung

� Gesamtzahl der Seiten, aus denen sich die Tabelle zusammensetzt

Falls gewünscht, können Sie die Größe der Blattebene eines nicht gruppierten Indexes auch berechnen, anstatt die STATISTICS IO-Anweisung zu verwenden. Alternativ dazu können Sie auch die sysindexes-Tabelle ab-fragen und die dpages-Spalten überprüfen, in der die Größe der Blattebene angezeigt wird.

Anmerkung

Page 709: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 13: Optimieren der Abfrageleistung 35

Richtlinien für das Erstellen von Indizes, die eine Abfrage abdecken

� Fügen Sie Spalten zu Indizes hinzu

� Minimieren Sie die Größe des Indexschlüssels

� Erhalten Sie ein sinnvolles Verhältnis zwischen Zeilen-und Schlüsselgröße aufrecht

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Beim Erstellen von Indizes, die eine Abfrage abdecken, sollten Sie die fol-genden Richtlinien berücksichtigen.

� Fügen Sie Spalten zu Indizes hinzu. Mitunter empfiehlt es sich, zu einigen Indizes Spalten hinzuzufügen, für die Folgendes gilt:

• Sie decken mehr als eine Abfrage ab.

• Sie tragen dazu bei, dass einige der gängigeren Abfragen abgedeckt werden.

• Es wird regelmäßig auf sie verwiesen.

• Sie tragen nicht zu einer deutlichen Erhöhung der Schlüsselgröße bei. � Minimieren Sie die Größe des Indexschlüssels. Wenn Sie den Index-

schlüssel (Schlüsselwerte) definieren, sollten Sie es vermeiden, Schlüssel-werte anzugeben, die zu breit sind. Breite Zeilen erhöhen die Zeilengröße, die Anzahl der Indexebenen und die Gesamtzahl der Seiten. Leistungs-steigerungen, die durch das Erstellen eines die Abfragen abdeckenden Indexes erzielt würden, würden auf diese Weise gemindert.

� Erhalten Sie ein sinnvolles Verhältnis zwischen Zeilen- und Schlüsselgröße aufrecht. Wenn die Größe des Indexschlüssels relativ zur Zeilengröße zu-nimmt, kann sich dies auf die Abfrageleistung auswirken. Ein extremes Beispiel wäre eine Tabelle, für die Sie einen nicht gruppierten Index erstellt haben, der alle Spalten der Tabelle umfasst. Hierdurch wird praktisch eine Kopie der Tabelle erstellt und geordnet auf der Blattebene des nicht gruppierten Indexes gespeichert.

ThemaFühren Sie einige Richt-linien für die Erstellung von Indizes auf, die Abfragen abdecken können.

EinstiegBeim Erstellen von Indizes, die Abfragen abdecken, sollten Sie die folgenden Richtlinien berücksichtigen.

Methodischer Hinweis Weisen Sie darauf hin, dass Spalten in einem Fall zu groß sein können, ihre Größe in einer anderen Situation jedoch vertretbar ist.

Fragen Sie die Kursteilneh-mer, wie viele Zeichen zu viele Zeichen sind, wenn eine Tabelle optimiert werden soll.

Page 710: Programmieren Einer Microsoft SQL Server 2000-Datenbank

36 Unterrichtseinheit 13: Optimieren der Abfrageleistung

���� Indizierungsstrategien

� Bewerten der E/A für Abfragen, die auf einen Bereich von Daten zugreifen

� Indizierung für mehrere Abfragen

� Richtlinien für das Erstellen von Indizes

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Sie können Indizierungsstrategien implementieren, um die Abfrageleistung zu verbessern.

ThemaStellen Sie die Themen dieses Abschnitts vor.

EinstiegSie können Indizierungs-strategien implementieren, um die Abfrageleistung zu verbessern.

Page 711: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 13: Optimieren der Abfrageleistung 37

Bewerten der E/A für Abfragen, die auf einen Bereich von Daten zugreifen

ZugriffsmethodeZugriffsmethodeZugriffsmethode

TabellenscanTabellenscan

Gruppierter Index für die „charge_amt“-SpalteGruppierter Index für die „charge_amt“-Spalte

Nicht gruppierter Index für die „charge_amt“-SpalteNicht gruppierter Index für die „charge_amt“-Spalte

Zusammengesetzter Index für die Spalten„charge_amt“ und „charge_no“

Zusammengesetzter Index für die Spalten„charge_amt“ und „charge_no“

Seiten-E/ASeitenSeiten--E/AE/A

10,41710,417

10421042

100,273100,273

273273

SELECT charge_noFROM chargeWHERE charge_amt BETWEEN 20 AND 30

SELECT charge_noFROM chargeWHERE charge_amt BETWEEN 20 AND 30

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Der Abfrageoptimierer berücksichtigt automatisch mehrere Ausführungspläne und schätzt die notwendige E/A für jeden Ausführungsplan. Er wählt dann einen Ausführungsplan aus, der, basierend auf dem Umfang an E/A und anderen Überlegungen, die beste Leistung erzielt. Vergleichen sie die Seiten-E/A der unterschiedlichen Zugriffsmethoden, die der Abfrageoptimierer verwenden kann.

Nehmen Sie z. B. die folgende Abfrage, die einen Bereich von Daten abruft, und vergleichen Sie dann die E/A dieser Abfrage mit anderen Methoden des Datenzugriffs.

SELECT charge_no FROM charge WHERE charge_amt BETWEEN 20 AND 30

Gehen Sie von folgenden Daten aus, wenn Sie die unterschiedlichen Methoden vergleichen:

� Es liegen 1 Million Zeilen und 96 Zeilen pro Seite vor.� Die Gesamtzahl der Seiten beträgt 10.147. � Es gibt keinen gruppierten Index. � 100.000 Zeilen fallen in den Bereich von 20,00 $ bis 30,00 $. � Die Blattseite eines nicht gruppierten Indexes kann 367 Indexzeilen

aufnehmen.

ThemaVeranschaulichen Sie die Unterschiede bei der Seiten-E/A, indem Sie unterschied-liche Zugriffsmethoden ver-wenden.

EinstiegDer Abfrageoptimierer be-rücksichtigt automatisch mehrere Ausführungspläne und schätzt die notwendige E/A für jeden Ausfüh-rungsplan.

Methodischer Hinweis Das Beispiel kann nicht auf der credit-Datenbank aus-geführt werden.

Beziehen Sie sich auf die Annahmen im Arbeitsbuch, wenn Sie die Seiten-E/A für die unterschiedlichen Indizes vergleichen.

Methodischer Hinweis Weisen Sie darauf hin, dass die Zugriffsmethoden, die auf der Folie dargestellt sind, die folgenden Infor-mationen verwenden.

Page 712: Programmieren Einer Microsoft SQL Server 2000-Datenbank

38 Unterrichtseinheit 13: Optimieren der Abfrageleistung

TabellenscanDas Durchführen eines Tabellenscans empfiehlt sich für Abfragen, bei denen das Resultset eine hohen Prozentsatz einer Tabelle einschließt (niedrige Selek-tivität). Tabellenscans eigenen sich, wenn die gesamte Seiten-E/A einer Ab-frage die Anzahl der Seiten in der Tabelle überschreiten würde.

Wenn Sie die Abfrage ausführen, die einen Tabellenscan vornimmt, beträgt die Seiten-E/A 10.417. Vergleichen Sie die Seiten-E/A für einen Tabellenscan mit der E/A bei Verwendung eines nicht gruppierten Indexes für die charge_amt-Spalte. Die Durchführung eines Tabellenscans ist die effizientere Methode.

Gruppierter Index für die „charge_amt“-Spalte SQL Server führt die folgenden Schritte aus, um die gewünschten Informationen abzurufen:

1. Durchsuchen des gruppierten Indexes nach dem Mindestwert, in diesem Fall 20.00 $.

2. Lesen der Zeilen, beginnend bei 20.00 $, und Beenden der Suche bei 30.00 $.

Da die charge_amt-Spalte gruppiert ist, ist die physische Reihenfolge der Daten nach der charge_amt-Spalte sortiert. Sämtliche Daten, die innerhalb dieses Bereichs liegen, befinden sich geordnet auf aufeinander folgenden Seiten, wodurch das Abrufen von Daten erleichtert wird. Die Seiten-E/A beträgt 1.042 (100.000/96 Zeilen pro Seite).

Nicht gruppierter Index für die „charge_amt“-Spalte SQL Server führt die folgenden Schritte aus, um die gewünschten Informa-tionen abzurufen:

1. Suchen nach dem Bereich von Werten auf der Blattebene des nicht grup-pierten Indexes und Abrufen der RID für jede Zeile. In diesem Fall erfolgt der Zugriff auf 273 Blattebenenseiten (100.000/367).

2. Abrufen der Daten von den einzelnen Seiten mit Hilfe des BookmarkLookup-Operators für die entsprechenden Zeilen.

Die Seiten-E/A beträgt ungefähr 100.273. Die Verwendung eines nicht grup-pierten Indexes für die charge_amt-Spalte ist die am wenigsten effiziente Methode, um die Daten abzurufen, da SQL Server pro Zeile eine Seite lesen muss, zuzüglich der Blattebene des Indexes, die gelesen werden muss, um die RID-Werte abzurufen. Jede Datenseite wird mehrmals in den Cache gelesen.

Zusammengesetzter Index für die Spalten „charge_amt“ und „charge_no“ Die Seiten-E/A beträgt 273 (100.000/367 Zeilen pro Seite). Die Anzahl der Indexzeilen pro Blattebene beträgt im Durchschnitt 367. Da die Spalten charge_amt und charge_no im Index enthalten sind, durchsucht SQL Server die Datenseiten nicht, wodurch der Umfang an E/A reduziert wird.

Page 713: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 13: Optimieren der Abfrageleistung 39

Indizierung für mehrere Abfragen

USE creditSELECT charge_no, charge_dt, charge_amtFROM chargeWHERE statement_no = 19000 AND member_no = 3852

USE creditSELECT charge_no, charge_dt, charge_amtFROM chargeWHERE statement_no = 19000 AND member_no = 3852

USE creditSELECT member_no, charge_no, charge_amtFROM chargeWHERE charge_dt between ‚30.07.1999'AND ‚31.07.1999' AND member_no = 9331

USE creditSELECT member_no, charge_no, charge_amtFROM chargeWHERE charge_dt between ‚30.07.1999'AND ‚31.07.1999' AND member_no = 9331

Beispiel 1Beispiel 1

Beispiel 2Beispiel 2

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Es ist leichter, den zu erstellenden Index basierend auf einer einzelnen Abfrage auszuwählen, als einen Index für mehrere Abfragen mit unterschiedlichen Prioritäten zu erstellen. Die Erstellung von Indizes zur Unterstützung mehrerer Abfragen mit unterschiedlichen Prioritäten ist komplexer, da ein Index, der für eine Abfrage optimal ist, nicht notwendigerweise der am besten geeignete Index für eine andere Abfrage ist. Das Ziel ist, durch Bewertung der E/A eine zufrieden stellende Leistung für diejenigen Abfragen zu erreichen, die die höchste Priorität aufweisen.

BeispielszenarioFür die folgenden Beispiele gilt die Annahme, dass die Abfragen, die von Be-nutzern am häufigsten ausgeführt werden, dazu dienen, Kundenlastschriften für einen bestimmten Kontoauszug (Beispiel 1) und für einen bestimmten Tag (Beispiel 2) zu ermitteln. Die erste Beispielabfrage bezieht sich auf 15 Prozent der Tabelle. Die zweite Abfrage ist sehr selektiv und greift nur auf wenige Zeilen zu.

USE credit SELECT charge_no, charge_dt, charge_amt FROM charge WHERE statement_no = 19000 AND member_no = 3852

USE credit SELECT member_no, charge_no, charge_amt FROM charge WHERE charge_dt between '30.07.1999' AND '31.07.1999' AND member_no = 9331

ThemaBeschreiben Sie die Schwierigkeiten der Er-stellung von Indizes, die die am häufigsten ausgeführten Abfragen unterstützen.

EinstiegEs ist leichter, den zu erstellenden Index basie-rend auf einer einzelnen Abfrage auszuwählen, als einen Index für mehrere Abfragen mit unterschied-lichen Prioritäten zu erstellen.

Methodischer Hinweis Verwenden Sie die Bei-spiele auf der Folie, und verweisen Sie auf die Tabelle im Arbeitsbuch der Kursteilnehmer, wenn Sie die Abfrageleistung für bei-de Abfragen unter Verwen-dung unterschiedlicher Indizierungsstrategien vergleichen.

Beispiel 1

Beispiel 2

Page 714: Programmieren Einer Microsoft SQL Server 2000-Datenbank

40 Unterrichtseinheit 13: Optimieren der Abfrageleistung

In der folgenden Tabelle werden die Abfrageleistung von Beispiel 1 und Bei-spiel 2 basierend auf den möglichen Indizierungsstrategien verglichen, die Sie implementieren können. Ein gruppierter Index für die member_no-Spalte ist die beste Strategie.

Indextyp Spalte Beispielabfrage 1 Beispielabfrage 2

Gruppiert

Nicht gruppiert

member_no

charge_no

Sehr schnell.

Verwendet den gruppierten Index.

Sehr schnell.

Verwendet den gruppierten Index.

Gruppiert

Nicht gruppiert

charge_no

member_no

Langsamer als wenn ein gruppierter Index für die member_no-Spalte erstellt würde.

Langsam. Der nicht gruppierte Index für member_no ist für Daten-bereiche nicht effizient.

Gruppiert

Nicht gruppiert, zusammengesetzt

member_no

statement_no, member_no

Sehr schnell.

Verwendet den gruppierten Index.

Sehr schnell.

Verwendet den gruppierten Index.

Gruppiert

Nicht gruppiert, zusammengesetzt

charge_no

member_no, charge_dt

Langsamer als wenn ein gruppierter Index für die member_no-Spalte erstellt würde.

Schnell.

Ein zusammengesetzter Index kann die Leistung des nicht gruppierten Indexes beträchtlich steigern.

Page 715: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 13: Optimieren der Abfrageleistung 41

Richtlinien für das Erstellen von Indizes

� Bestimmen Sie die Prioritäten aller Abfragen

� Bestimmen Sie die Selektivität für jeden Abschnitt der WHERE-Klausel jeder Abfrage

� Bestimmen Sie, ob ein Index erstellt werden soll

� Identifizieren Sie die Spalten, die indiziert werden sollen

� Bestimmen Sie die beste Spaltenreihenfolge für zusammengesetzte Indizes

� Bestimmen Sie die Indizes, die darüber hinaus benötigt werden

� Testen Sie die Leistung der Abfragen

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Der Entscheidung über die Anzahl der Indizes, die Indextypen sowie die Spalten, für die Indizes erstellt werden sollen, sollten genaue Kenntnisse der Daten und der Anforderungen der Benutzer zugrunde liegen.

Um sicherzustellen, dass die von Ihnen erstellten Indizes für den Abfrage-optimierer von Nutzen sind, sollten Sie die folgenden Richtlinien berück-sichtigen:

� Bestimmen Sie die Prioritäten aller Abfragen.

• Machen Sie sich mit den Daten und ihrer geplanten Verwendung vertraut.

• Bestimmen Sie die vorrangigen Transaktionen für die Datenbank. � Bestimmen Sie die Selektivität für jeden Abschnitt der WHERE-Klausel

jeder Abfrage. � Bestimmen Sie, ob ein Index erstellt werden soll.

In bestimmten Situationen ist die Erstellung eines Indexes nicht angebracht. Hierzu zählen Folgende:

• Der Index wird nie vom Abfrageoptimierer verwendet.

• Die Spaltenwerte weisen eine niedrige Selektivität auf.

• Die Spalte, die indiziert werden soll, ist zu breit.

ThemaBenennen Sie die Richt-linien für das Erstellen sinnvoller Indizes.

EinstiegUm sicherzustellen, dass die von Ihnen erstellten Indizes für den Abfrage-optimierer von Nutzen sind, sollten Sie die folgenden Richtlinien berücksichtigen.

Page 716: Programmieren Einer Microsoft SQL Server 2000-Datenbank

42 Unterrichtseinheit 13: Optimieren der Abfrageleistung

� Identifizieren Sie die Spalten, die indiziert werden sollen.

• Erstellen Sie einen Index für eine Spalte, die als Verknüpfungsschlüssel verwendet wird, um die Leistung der Verknüpfung zu verbessern. Hier-durch ist es dem Abfrageoptimierer möglich, einen Index zu verwenden, anstatt einen Tabellenscan durchzuführen.

• Ermitteln Sie, ob die Spalte regelmäßig durchsucht wird.

• Stellen Sie sicher, dass diejenigen Spalten indiziert werden, auf die in den WHERE-Klauseln der Abfragen mit höchster Priorität verwiesen wird.

� Bestimmen Sie die beste Spaltenreihenfolge für zusammengesetzte Indizes. � Bestimmen Sie die Indizes, die darüber hinaus benötigt werden.

• Bestimmen Sie für jede Tabelle die kleinste Anzahl an Indizes, die er-stellt werden muss.

• Wägen Sie den durch die Indexverwendung erzielten Leistungsgewinn gegen den erhöhten Aufwand bei Aktualisierungen ab.

• Wenn eine Abfrage nur unregelmäßig ausgeführt wird, empfiehlt es sich möglicherweise, einen Index für die Dauer einer bestimmten Aktivität zu erstellen (wenn er einen beträchtlichen Leistungszuwachs erzielen kann) und ihn dann zu löschen.

� Testen Sie die Leistung der Abfragen. Testen Sie, nachdem die Indizes erstellt wurden, die Leistung der Abfragen mit höchster Priorität, indem Sie für jede Abfrage die folgenden Anweisun-gen ausführen:

• SET SHOWPLAN ON

• SET STATISTICS IO ON

• SET STATISTICS TIME ON

Page 717: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 13: Optimieren der Abfrageleistung 43

���� Außerkraftsetzen des Abfrageoptimierers

� Bestimmen, wann der Abfrageoptimierer außer Kraft gesetzt werden sollte

� Verwenden von Hinweisen und der SET FORCEPLAN-Anweisung

� Bestätigen der Abfrageleistung nach dem Außerkraftsetzen des Abfrageoptimierers

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Dieser Abschnitt behandelt Verfahren, um den Abfrageoptimierer außer Kraft zu setzen, und beschreibt, wie Sie ermitteln können, wann dies erfolgen sollte. Wenn Sie den Abfrageoptimierer außer Kraft setzen, ist es wichtig, die Ab-frageleistung zu testen und erneut zu bestätigen.

ThemaStellen Sie die Themen dieses Abschnitts vor.

EinstiegDieser Abschnitt behandelt Verfahren, um den Abfrageoptimierer außer Kraft zu setzen.

Page 718: Programmieren Einer Microsoft SQL Server 2000-Datenbank

44 Unterrichtseinheit 13: Optimieren der Abfrageleistung

Bestimmen, wann der Abfrageoptimierer außer Kraft gesetzt werden sollte

� Begrenzen von Optimiererhinweisen

� Untersuchen Sie alle Alternativen, bevor Sie den Abfrageoptimierer außer Kraft setzen:

� Aktualisieren der Statistiken

� Erneutes Kompilieren gespeicherter Prozeduren

� Überarbeiten der Abfragen oder Suchargumente

� Untersuchen der Möglichkeit, andere Indizes zu erstellen

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Wenn die Abfrageleistung nicht zufrieden stellend ist, ist es möglicherweise ratsam, den Abfrageoptimierer durch die Verwendung von Optimierer-hinweisen außer Kraft zu setzen. Optimiererhinweise sind Schlüsselwörter, die Sie in eine Abfrage einschließen können, um eine bestimmte Optimierungsoperation zu erzwingen.

Sie sollten die Verwendung von Optimiererhinweisen begrenzen, da sie zur Folge haben, dass die Optimierung statisch wird. Optimiererhinweise verhin-dern, dass der Abfrageoptimierer Anpassungen aufgrund einer geänderten Um-gebung vornehmen kann. Nachdem Sie Optimiererhinweise verwendet haben, müssen Sie die Abfrageleistung ständig überwachen, um zu überprüfen, ob die Abfrageausführung optimal ist.

Bevor Sie erwägen, den Abfrageoptimierer außer Kraft zu setzen, sollten Sie alle Alternativen untersuchen, indem Sie folgendermaßen vorgehen:

� Aktualisieren der Statistiken. � Erneutes Kompilieren gespeicherter Prozeduren. � Überarbeiten der Abfragen oder Suchargumente, um zu ermitteln, ob sie neu

geschrieben werden sollten. � Untersuchen der Möglichkeit, andere Indizes zu erstellen.

ThemaWeisen Sie auf Alternativen zum Außerkraftsetzen des Abfrageoptimierers hin.

EinstiegNormalerweise empfiehlt es sich nicht, den Abfrage-optimierer außer Kraft zu setzen.

Page 719: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 13: Optimieren der Abfrageleistung 45

Verwenden von Hinweisen und der SET FORCEPLAN-Anweisung

� Tabellenhinweise

� Verknüpfungshinweise

� Abfragehinweise

� SET FORCEPLAN-Anweisung

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Sie können den Abfrageoptimierer mit Hilfe von Hinweisen oder der SET FORCEPLAN-Anweisung außer Kraft setzen. Optimiererhinweise können Sie innerhalb der Anweisungen SELECT, INSERT, UPDATE und DELETE ange-ben. Es gibt drei Arten von Hinweisen, mit deren Hilfe der Abfrageoptimierer außer Kraft gesetzt werden kann.

TabellenhinweiseEin Tabellenhinweis legt fest, dass für diese Tabelle oder für eine Anweisung ein Tabellenscan ausgeführt werden soll oder dass der Abfrageoptimierer einen oder mehrere Indizes oder eine Sperrmethode verwenden soll. Wenn Sie Tabellenhinweise verwenden, sollten Sie Folgendes berücksichtigen:

� Jeder Tabellenhinweis kann nur einmal angegeben werden; sie können jedoch mehrere Tabellenhinweise verwenden.

� Die WITH-Klausel muss direkt nach dem Tabellennamen angegeben werden.

ThemaErläutern Sie, wie der Abfrageoptimierer außer Kraft gesetzt werden kann.

EinstiegSie können den Abfrage-optimierer mit Hilfe von Optimiererhinweisen oder der SET FORCEPLAN-Anweisung außer Kraft setzen.

Page 720: Programmieren Einer Microsoft SQL Server 2000-Datenbank

46 Unterrichtseinheit 13: Optimieren der Abfrageleistung

table_name [ [ AS ] table_alias ] [ WITH ( < table_hint > [ ,...n ] ) ]

WITH ( < table_hint > ) ::= { INDEX ( index_val [ ,...n ] )

| FASTFIRSTROW | HOLDLOCK | NOLOCK | PAGLOCK | READCOMMITTED | READPAST | READUNCOMMITTED | REPEATABLEREAD | ROWLOCK | SERIALIZABLE | TABLOCK | TABLOCKX | UPDLOCK | XLOCK }

Verknüpfungshinweise Verknüpfungshinweise erzwingen eine Verknüpfungsstrategie zwischen zwei Tabellen. Verknüpfungshinweise werden in der FROM-Klausel einer Abfrage angegeben. Wenn ein Verknüpfungshinweis angegeben wird, erzwingt der Abfrageoptimierer, basierend auf der Position der ON-Schlüsselwörter, auto-matisch die Verknüpfungsreihenfolge für alle verknüpften Tabellen in der Abfrage.

<join_hint> ::= { LOOP | HASH | MERGE | REMOTE }

AbfragehinweiseAbfragehinweise können eine Vielzahl von Aktionen steuern. Mit Hilfe der OPTION-Klausel können Sie festlegen, dass der Abfrageoptimierer einen bestimmten Hinweis für eine Abfrage verwendet. Wenn Sie die OPTION-Klausel verwenden, sollten Sie die folgenden Punkte berücksichtigen:

� Jeder Abfragehinweis kann nur einmal angegeben werden; sie können jedoch mehrere Abfragehinweise verwenden.

� Die OPTION-Klausel muss mit der äußersten Abfrage der Anweisung angegeben werden.

� Der Abfragehinweis wirkt sich auf alle Operatoren in der Anweisung aus. � Falls UNION in der Hauptabfrage vorkommt, kann nur die letzte Abfrage,

die einen UNION-Operator enthält, die OPTION-Klausel beinhalten.

Syntax

Syntax

Methodischer Hinweis Erinnern Sie die Kursteil-nehmer daran, dass der UNION-Operator die Anzahl der Zeilen erhöht, wohin-gegen Verknüpfungsopera-tionen die Anzahl der Spalten erhöhen.

Page 721: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 13: Optimieren der Abfrageleistung 47

[ OPTION ( < query_hint > [ ,...n ) ]< query_hint > ::= { { HASH | ORDER } GROUP | { CONCAT | HASH | MERGE } UNION | {LOOP | MERGE | HASH} JOIN | FAST number_rows | FORCE ORDER | MAXDOP number | ROBUST PLAN | KEEP PLAN | KEEPFIXED PLAN | EXPAND VIEWS }

SET FORCEPLAN-Anweisung Mit Hilfe der FROM-Klausel können Sie erzwingen, dass der Abfrageopti-mierer Tabellen in der Reihenfolge verknüpft, in der sie aufgeführt werden. Wenn Sie die SET FORCEPLAN-Anweisung verwenden, verwendet der Abfrageoptimierer ausschließlich Nested Loop-Verknüpfungen.

Die SET FORCEPLAN-Anweisung ist eine Einstellung auf Sitzungsebene.

SET FORCEPLAN {ON | OFF}

Wenn ein oder mehrere Abfragehinweise dazu führen, dass der Abfrageoptimierer keinen gültigen Ausführungsplan generiert, bricht SQL Server die Ausführung ab und gibt die Fehlermeldung 8622 aus. Sie müs-sen die Abfrage erneut senden, ohne einen Optimiererhinweis anzugeben oder die SET FORCEPLAN-Anweisung zu verwenden.

Syntax

Syntax

Anmerkung

Page 722: Programmieren Einer Microsoft SQL Server 2000-Datenbank

48 Unterrichtseinheit 13: Optimieren der Abfrageleistung

Bestätigen der Abfrageleistung nach dem Außerkraftsetzen des Abfrageoptimierers

� Überprüfen, ob die Leistung verbessert wurde

� Dokumentieren der Gründe für die Verwendung von Optimiererhinweisen

� Regelmäßiges Testen der Abfragen

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Wenn Sie feststellen, dass es notwendig ist, den Abfrageoptimierer außer Kraft zu setzen, müssen Sie überprüfen, ob die Leistung verbessert werden konnte. Darüber hinaus sollten Sie die Gründe für das Außerkraftsetzen des Abfrage-optimierers dokumentieren und die Abfragen regelmäßig neu testen.

Überprüfen, ob die Leistung verbessert wurde Sie können überprüfen, ob die Hinweise für den Abfrageoptimierer zu einer Verbesserung der Leistung führen, indem Sie für die Anweisungen STATISTICS IO und STATISTICS TIME die Option ON festlegen und in Query Analyzer die Option Ausführungsplan anzeigen auswählen. In den meisten Fällen führt das Außerkraftsetzen des Abfrageoptimierers nicht zu einer Leistungsverbesserung.

Wenn Sie Eingabewerte in einer gespeicherten Prozedur übergeben, müssen Sie sicherstellen, dass die Leistung für keinen der Eingabewerte beeinträchtigt wird. Optimiererhinweise können die Leistung für bestimmte Eingabewerte ver-bessern, bei anderen Eingabewerten jedoch zu einer Leistungsbeeinträchtigung führen.

Dokumentieren der Gründe für die Verwendung von OptimiererhinweisenWenn das Außerkraftsetzen des Abfrageoptimierers zu einer Leistungs-verbesserung führt, sollten Sie dokumentieren, warum dies der Fall ist. Durch das Aufzeichnen der Gründe ist es Ihnen möglich, regelmäßig neu zu beur-teilen, ob die Verwendung der Optimiererhinweise weiterhin angebracht ist. Wenn sich diese Gründe ändern, kann es sein, dass die Optimiererhinweise nicht mehr länger erforderlich sind und zu einer Beeinträchtigung der Leistung führen.

ThemaErklären Sie, warum es wichtig ist, die Abfrage-leistung zu testen und neu zu bewerten, nachdem der Abfrageoptimierer außer Kraft gesetzt wurde.

EinstiegWenn Sie feststellen, dass es notwendig ist, den Abfrageoptimierer außer Kraft zu setzen, müssen Sie die Abfrageleistung testen und neu bewerten.

Page 723: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 13: Optimieren der Abfrageleistung 49

Regelmäßiges Testen der Abfragen Der Abfrageoptimierer arbeitet dynamisch und ermittelt bei sich ändernden Daten ständig den am besten geeigneten Ausführungsplan. Wenn Sie Optimie-rerhinweise verwenden, wird der Ausführungsplan statisch. Aus diesem Grund empfiehlt es sich, Abfragen, für die Sie den Abfrageoptimierer außer Kraft gesetzt haben, regelmäßig zu testen.

Page 724: Programmieren Einer Microsoft SQL Server 2000-Datenbank

50 Unterrichtseinheit 13: Optimieren der Abfrageleistung

Empfohlene Methoden

Machen Sie sich mit den Daten und der Art und Weise, wie Abfragen auf diese Daten zugreifen, vertrautMachen Sie sich mit den Daten und der Art und Weise, wie Abfragen auf diese Daten zugreifen, vertraut

Entwickeln Sie Indizierungsstrategien für einzelne und mehrere AbfragenEntwickeln Sie Indizierungsstrategien für einzelne und mehrere Abfragen

Erstellen Sie Indizes, die die am häufigsten verwendeten Abfragen abdeckenErstellen Sie Indizes, die die am häufigsten verwendeten Abfragen abdecken

Vermeiden Sie es, den Abfrageoptimierer außer Kraft zu setzenVermeiden Sie es, den Abfrageoptimierer außer Kraft zu setzen

Verwenden Sie die Abfragekontrolle, um zu verhindern, dass Abfragen mit langen Ausführungszeiten ausgeführt werden und Systemressourcen beanspruchenVerwenden Sie die Abfragekontrolle, um zu verhindern, dass Abfragen mit langen Ausführungszeiten ausgeführt werden und Systemressourcen beanspruchen

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Die folgenden empfohlenen Methoden helfen Ihnen bei der Bestimmung von Indizierungsstrategien, durch die die Abfrageleistung sichergestellt oder ver-bessert werden kann.

� Verwenden Sie die Abfragekontrolle, um zu verhindern, dass Abfragen mit langen Ausführungszeiten ausgeführt werden und Systemressourcen bean-spruchen. Standardmäßig wird die Ausführung jeder Abfrage unabhängig von der Ausführungsdauer zugelassen. Die Abfragekontrolle verwendet einen geschätzten Kostenwert, um zu verhindern, dass Abfragen mit hohen Kosten überhaupt ausgeführt werden.

� Machen Sie sich mit den Daten und der Art und Weise, wie Abfragen auf diese Daten zugreifen, vertraut. Wenn Sie wissen, wie der Abfrageopti-mierer durch gruppierte Indizes, nicht gruppierte Indizes und Indizes, die Abfragen abdecken, navigiert, sind Sie in der Lage, sinnvolle Indizes für die Abfragen zu entwerfen, die die Benutzer ausführen.

� Erstellen Sie Indizes, die die am häufigsten verwendeten Abfragen ab-decken. Wenn eine Abfrage durch einen Index abgedeckt wird, greift der Abfrageoptimierer nicht auf die Datenseiten zu, da alle erforderlichen Daten im Index enthalten sind. Der Umfang an E/A wird erheblich reduziert.

� Entwickeln Sie Indizierungsstrategien für einzelne und mehrere Abfragen. Versuchen Sie, für alle Abfragen mit hoher Priorität eine zufrieden stellende Leistung zu erzielen.

� Vermeiden Sie es, den Abfrageoptimierer außer Kraft zu setzen. Der Ab-frageoptimierer wählt in der Regel den effizientesten Ausführungsplan aus. Wenn Sie Optimiererhinweise verwenden, sind diese mit der Zeit mög-licherweise veraltet und führen zu einer Beeinträchtigung der Abfrage-leistung.

ThemaBenennen Sie die empfoh-lenen Methoden zur Ver-besserung der Abfrage-leistung.

EinstiegDie folgenden empfohlenen Methoden können Ihnen bei der Optimierung der Abfrageleistung helfen.

Page 725: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 13: Optimieren der Abfrageleistung 51

Weitere Informationen zu den folgenden Themen finden Sie in der SQL Server-Onlinedokumentation.

Thema Suchbegriff

Grafisches Anzeigen des Ausführungsplanes mit Symbolen

"Grafische Anzeige des Ausführungsplanes mithilfe von SQL Query Analyzer"

Zwischenspeichern des Ausführungsplanes

"Zwischenspeicherung und Wiederverwendung von Aus-führungsplänen"

Erstellen von Indizes, die eine Abfrage abdecken

"Verwenden von Indizes für Sichten", "Auflösen von Indizes für Sichten"

Page 726: Programmieren Einer Microsoft SQL Server 2000-Datenbank

52 Unterrichtseinheit 13: Optimieren der Abfrageleistung

Übungseinheit A: Optimieren der Abfrageleistung

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

LernzieleAm Ende dieser Übungseinheit werden Sie in der Lage sein, die folgenden Aufgaben auszuführen:

� Verwenden des grafischen Ausführungsplanes, um zu bestimmen, wie eine Abfrage aufgelöst wird.

� Vergleichen der E/A für Abfragen, die von Indizes abgedeckt oder nicht abgedeckt werden.

� Vergleichen der E/A für Abfragen, die Bereiche von Daten abrufen. � Verwenden von Optimiererhinweisen, um die Verwendung eines Indexes

und einer Verknüpfungsmethode zu erzwingen.

VoraussetzungenUm diese Übungseinheit zu bearbeiten, benötigen Sie Folgendes:

• Die Skriptdateien für diese Übungseinheit, die sich in C:\Moc\2328A\Labfiles\L13 befinden.

Einrichten der ÜbungseinheitUm diese Übungseinheit zu bearbeiten, ist eine der folgenden Aktionen erforderlich:

� Bearbeiten der vorherigen Übungseinheit. � Ausführen der Batchdatei C:\Moc\2328A\Batches\Restore13.cmd.

Mit dieser Befehlsdatei wird die credit-Datenbank wieder in den Zustand zurückversetzt, der für diese Übungseinheit erforderlich ist.

� Erstellen der gespeicherten Prozedur index_cleanup durch das Ausführen von Index_cleanup.sql. Diese Datei befindet sich im Verzeichnis C:\Moc\2328A\Labfiles\L13.

ThemaGeben Sie eine Einführung in die Übungseinheit.

EinstiegIn dieser Übungseinheit erstellen Sie Indizes und analysieren die Abfrage-leistung.

Erläutern Sie die Lernziele der Übungseinheit.

Page 727: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 13: Optimieren der Abfrageleistung 53

Weitere Informationen Sollten Sie beim Ausführen von Dateien Hilfe benötigen, suchen Sie in der Hilfe von SQL Query Analyzer nach „Ausführen einer Abfrage“.

Daneben sind die folgenden Informationsquellen verfügbar:

� Das credit-Datenbankschema. � Die Microsoft SQL Server-Onlinedokumentation.

SzenarioDer Aufbau des Schulungsraumes soll die Organisation des weltweit agieren-den Handelsunternehmens Northwind Traders widerspiegeln. Das Unternehmen hat den fiktiven Domänennamen nwtraders.msft. Der primäre DNS-Server für nwtraders.msft ist der Kursleitercomputer, dessen IP-Adresse (Internetproto-koll) 192.168.x.200 lautet (wobei x die zugewiesene Schulungsraumnummer ist). Der Name des Kursleitercomputers ist London.

Die folgende Tabelle stellt den Benutzernamen, den Computernamen und die IP-Adresse für jeden Kursteilnehmercomputer in der fiktiven Domäne nwtraders.msft bereit. Suchen Sie den Ihrem Computer zugewiesenen Benutzernamen und notieren Sie ihn.

Benutzername Computername IP-Adresse

SQLAdmin1 Vancouver 192.168.x.1SQLAdmin2 Denver 192.168.x.2SQLAdmin3 Perth 192.168.x.3SQLAdmin4 Brisbane 192.168.x.4SQLAdmin5 Lisbon 192.168.x.5SQLAdmin6 Bonn 192.168.x.6SQLAdmin7 Lima 192.168.x.7SQLAdmin8 Santiago 192.168.x.8SQLAdmin9 Bangalore 192.168.x.9SQLAdmin10 Singapore 192.168.x.10SQLAdmin11 Casablanca 192.168.x.11SQLAdmin12 Tunis 192.168.x.12SQLAdmin13 Acapulco 192.168.x.13SQLAdmin14 Miami 192.168.x.14SQLAdmin15 Auckland 192.168.x.15SQLAdmin16 Suva 192.168.x.16SQLAdmin17 Stockholm 192.168.x.17SQLAdmin18 Moscow 192.168.x.18SQLAdmin19 Caracas 192.168.x.19SQLAdmin20 Montevideo 192.168.x.20SQLAdmin21 Manila 192.168.x.21SQLAdmin22 Tokyo 192.168.x.22SQLAdmin23 Khartoum 192.168.x.23SQLAdmin24 Nairobi 192.168.x.24

Veranschlagte Zeit für die Übungseinheit: 45 Minuten

Page 728: Programmieren Einer Microsoft SQL Server 2000-Datenbank

54 Unterrichtseinheit 13: Optimieren der Abfrageleistung

Übung 1 Verwenden des grafischen Ausführungsplanes, um zu bestimmen, wie eine Abfrage aufgelöst wird

In dieser Übung erstellen Sie einen Index für eine berechnete Spalte und ver-wenden den grafischen Ausführungsplan, um zu ermitteln, ob der Index sinn-voll ist.

Sie können Abschnitte der Skriptdatei Indexed_View.sql unter C:\Moc\SQL2328A\Labfiles\L13 öffnen, lesen und ausführen oder die angegebenen Transact-SQL-Anweisungen eingeben und ausführen.

� So erstellen Sie eine indizierte Sicht In diesem Verfahren löschen Sie alle vorhandenen Indizes für die charge-Tabelle in der credit-Datenbank und erstellen eine indizierte Sicht, die Rech-nungen (Charges) nach Mitglied zusammenfasst. 1. Melden Sie sich mit Hilfe der Informationen in der folgenden Tabelle an der

Schulungsraumdomäne nwtraders an.

Option Eingabe

Benutzername SQLAdminx (wobei x die Ihrem Computernamen zugewiesene Nummer ist, wie in der Schulungsraumdomäne nwtraders.msftfestgelegt)

Kennwort password

2. Öffnen Sie SQL Query Analyzer und melden Sie sich gegebenenfalls mit Microsoft Windows®-Authentifizierung am (lokalen) Server an. Sie verfügen über die Berechtigung, sich bei Microsoft SQL Server 2000 anzumelden und SQL Server zu verwalten, da Sie als SQLAdminx ange-meldet sind und SQLAdminx ein Mitglied der lokalen Gruppe Administ-ratoren von Microsoft Windows 2000 ist. Alle Mitglieder dieser Gruppe werden automatisch der sysadmin-Rolle von SQL Server zugeordnet.

3. Geben Sie die folgende Anweisung ein, und führen Sie sie aus, um vorhan-dene Indizes für die charge-Tabelle in der credit-Datenbank zu löschen: USE credit EXEC index_cleanup charge

4. Geben Sie die folgende Anweisung ein, und führen Sie sie aus, um eine Sicht für die charge-Tabelle in der credit-Datenbank zu erstellen: CREATE VIEW mem_charges WITH SCHEMABINDING ASSELECT member_no, SUM(charge_amt) AS charge_SUM, COUNT_BIG(*) AS mem_count FROM dbo.charge GROUP BY member_no

Page 729: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 13: Optimieren der Abfrageleistung 55

5. Geben Sie die beiden folgenden Anweisungen ein, und führen Sie sie aus, um Indizes für die mem_charges-Sicht zu erstellen: CREATE UNIQUE CLUSTERED INDEX cl_mem_chg ON mem_charges(member_no)CREATE NONCLUSTERED INDEX nc_mem_chg_amt ON mem_charges(charge_SUM)

� So zeigen Sie den grafischen Ausführungsplan an In diesem Verfahren führen Sie eine Abfrage auf der charge-Tabelle aus und zeigen den Abfrageausführungsplan an, um zu ermitteln, wie der Abfrage-optimierer das Abfrageergebnis erhalten hat. 1. Klicken Sie im Abfragefenster im Menü Abfrage auf Ausführungsplan

anzeigen, um den grafischen Ausführungsplan zu starten. 2. Geben Sie die folgende Anweisung ein, und führen Sie sie aus, um eine

Abfrage auf der charge-Tabelle auszuführen: SELECT member_no, SUM(charge_amt) AS Charge_SUM FROM dbo.charge GROUP BY member_no

3. Wechseln Sie zur Registerkarte Ausführungsplan, um sehen Sie sich den grafischen Ausführungsplan an. Hat der Abfrageoptimierer die charge-Tabelle als Quelle für das Resultset ausgewählt? Begründung? Nein. Bei Erstellung der indizierten Sicht wurden die Charges für jedes Mitglied nach „member_no“ summiert. Es ist effizienter, diese Werte aus dem „nc_mem_chg_amt“-Index abzurufen, als sie neu zu berechnen.____________________________________________________________

____________________________________________________________

____________________________________________________________

Page 730: Programmieren Einer Microsoft SQL Server 2000-Datenbank

56 Unterrichtseinheit 13: Optimieren der Abfrageleistung

Übung 2 Vergleichen der E/A für Abfragen, die von Indizes abgedeckt oder nicht abgedeckt werden

In dieser Übung vergleichen Sie die E/A, die erforderlich ist, wenn gruppierte und nicht gruppierte Indizes verwendet werden, um selektive Daten abzurufen.

Sie können Abschnitte der Skriptdatei Covered_Queries.sql unter C:\Moc\SQL2328A\Labfiles\L13 öffnen, lesen und ausführen oder die angegebenen Transact-SQL-Anweisungen eingeben und ausführen.

� So erstellen Sie einen gruppierten Index In diesem Verfahren löschen Sie alle vorhandenen Indizes für die charge-Tabelle und erstellen einen gruppierten Index für die member_no-Spalte der charge-Tabelle in der credit-Datenbank. 1. Melden Sie sich mit Hilfe der Informationen in der folgenden Tabelle an der

Schulungsraumdomäne nwtraders an.

Option Eingabe

Benutzername SQLAdminx (wobei x die Ihrem Computernamen zugewiesene Nummer ist, wie in der Schulungsraumdomäne nwtraders.msftfestgelegt)

Kennwort password

2. Öffnen Sie SQL Query Analyzer, und melden Sie sich ggf. unter Verwen-dung der Windows-Authentifizierung am (lokalen) Server an. Sie verfügen über die Berechtigung, sich bei Microsoft SQL Server 2000 anzumelden und SQL Server zu verwalten, da Sie als SQLAdminx ange-meldet sind und SQLAdminx ein Mitglied der lokalen Gruppe Administ-ratoren von Microsoft Windows 2000 ist. Alle Mitglieder dieser Gruppe werden automatisch der sysadmin-Rolle von SQL Server zugeordnet.

3. Geben Sie die folgende Anweisung ein, und führen Sie sie aus, um vorhan-dene Indizes für die charge-Tabelle zu löschen: USE credit EXEC index_cleanup charge

4. Geben Sie die folgende Anweisung ein, und führen Sie sie aus, um einen gruppierten Index für die member_no-Spalte der charge-Tabelle zu erstellen:CREATE CLUSTERED INDEX charge_member_no_CL ON charge(member_no)

Page 731: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 13: Optimieren der Abfrageleistung 57

� So bewerten Sie die Unterschiede in den Ausführungsplänen, wenn eine Abfrage durch einen Index abgedeckt oder nicht abgedeckt wird

In diesem Verfahren führen Sie eine Abfrage aus, die alle Spalten zurückgibt, und zeigen den Ausführungsplan an. Anschließend löschen Sie vorhandene gruppierte Indizes und erstellen einen nicht gruppierten Index, führen die Ab-frage erneut aus und bewerten dann die Unterschiede im Ausführungsplan. 1. Klicken Sie in SQL Query Analyzer im Menü Abfrage auf

Ausführungsplan anzeigen.2. Geben Sie die folgende Anweisung ein, und führen Sie sie aus, um die

Statistikoption auf den Wert ON festzulegen: SET STATISTICS IO ON

3. Geben Sie die folgende SELECT-Anweisung ein, und führen Sie sie aus, um alle Spalten für die Mitgliedsnummer 5001 abzurufen: SELECT * FROM charge WHERE member_no = 5001

4. Notieren Sie die statistischen Informationen in der folgenden Tabelle.

Informationen Ergebnis

Scananzahl 1

Logische Lesevorgänge 3

Ausführungsplan (Index- oder Tabellenscan) Index

Ausführungsplan (Art der Indexoperation) Clustered Index Seek

5. Geben Sie die folgenden Anweisungen ein, und führen Sie sie aus, um den gruppierten Index zu löschen und einen nicht gruppierten Index für die member_no-Spalte der charge-Tabelle zu erstellen: EXEC index_cleanup charge CREATE NONCLUSTERED INDEX charge_member_no ON charge(member_no)

6. Führen Sie die folgende SELECT-Anweisung erneut aus, um alle Spalten für die Mitgliedsnummer 5001 abzurufen: SELECT * FROM charge WHERE member_no = 5001

Page 732: Programmieren Einer Microsoft SQL Server 2000-Datenbank

58 Unterrichtseinheit 13: Optimieren der Abfrageleistung

7. Notieren Sie die statistischen Informationen in der folgenden Tabelle.

Informationen Ergebnis

Scananzahl 1

Logische Lesevorgänge 8

Ausführungsplan (Index- oder Tabellenscan) Index

Ausführungsplan (Art der Indexoperation) Index Seek

Beide Abfragen verwenden einen Index um die Datensätze zu ermitteln. Warum waren bei Verwendung des nicht gruppierten Indexes mehr logische Lesevorgänge erforderlich? Nachdem das Mitglied im nicht gruppierten Index ermittelt worden ist, ruft SQL Server sämtliche Daten für jede Zeile aus dem gruppierten Index ab. Für diesen Vorgang muss sowohl der nicht gruppierte als auch der gruppierte Index gelesen werden. ____________________________________________________________

____________________________________________________________

� So wiederholen Sie den Test mit einer Abfrage, die durch einen nicht gruppierten Index abgedeckt wird

In diesem Verfahren löschen Sie vorhandene Indizes, erstellen einen gruppier-ten Index für die member_no-Spalte der charge-Tabelle, führen eine Abfrage aus, die von dem gruppierten Index abgedeckt wird, und zeigen den Ausfüh-rungsplan an. Anschließend löschen Sie den gruppierten Index, erstellen einen nicht gruppierten Index für die member_no-Spalte der charge-Tabelle, führen die Abfrage erneut aus (die von dem nicht gruppierten Index ebenfalls abge-deckt wird) und zeigen den Ausführungsplan an. 1. Geben Sie die folgenden Anweisungen ein, und führen Sie sie aus, um vor-

handene Indizes zu löschen und einen gruppierten Index für die member_no-Spalte der charge-Tabelle zu erstellen: EXEC index_cleanup charge

CREATE CLUSTERED INDEX charge_member_no_CL ON charge(member_no)

2. Geben Sie die folgende SELECT-Anweisung ein, und führen Sie sie aus, um nur die member_no-Spalte für die Mitgliedsnummer 5001 abzurufen: SELECT member_no FROM charge WHERE member_no = 5001

3. Notieren Sie die statistischen Informationen in der folgenden Tabelle.

Informationen Ergebnis

Scananzahl 1

Logische Lesevorgänge 3

Ausführungsplan (Index- oder Tabellenscan) Index

Ausführungsplan (Art der Indexoperation) Clustered Index Seek

Page 733: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 13: Optimieren der Abfrageleistung 59

4. Geben Sie die folgenden Anweisungen ein, und führen Sie sie aus, um den gruppierten Index zu löschen und einen nicht gruppierten Index für die member_no-Spalte der charge-Tabelle zu erstellen: EXEC index_cleanup charge

CREATE NONCLUSTERED INDEX charge_member_no ON charge(member_no)

5. Führen Sie die folgende SELECT-Anweisung erneut aus, um nur die member_no-Spalte für die Mitgliedsnummer 5001 abzurufen: SELECT member_no FROM charge WHERE member_no = 5001

Informationen Ergebnis

Scananzahl 1

Logische Lesevorgänge 2

Ausführungsplan (Index- oder Tabellenscan) Index

Ausführungsplan (Art der Indexoperation) Index Seek

Unterscheidet sich der Umfang der E/A der beiden Abfragen, die unter Ver-wendung des gruppierten Indexes ausgeführt wurden, obwohl eine der bei-den Abfragen von dem gruppierten Index abgedeckt wurde? Begründung? Nein. Aufgrund der Merkmale eines gruppierten Indexes ist die Blatt-ebene mit den Datenseiten identisch. Eine Abfrage, die vom gruppierten Index abgedeckt wird, bietet keine Vorteile. ____________________________________________________________

____________________________________________________________

Unterscheidet sich der Umfang der E/A der beiden Abfragen, die unter Ver-wendung des nicht gruppierten Indexes ausgeführt wurden, obwohl eine der beiden Abfragen von dem nicht gruppierten Index abgedeckt wurde? Begründung? Ja. Aufgrund der Merkmale eines nicht gruppierten Indexes ist die Blattebene nicht mit den Datenseiten identisch. Eine Abfrage, die vom nicht gruppierten Index abgedeckt wird, ist von Vorteil, da kein Zugriff auf die Datenseiten erforderlich ist. Da die Abfrage durch einen nicht gruppierten Index abgedeckt wurde, konnte der Umfang der E/A von 8 auf 2 Operationen reduziert werden. ____________________________________________________________

____________________________________________________________

Unterscheidet sich die Leistung der Abfrage, die vom gruppierten Index ab-gedeckt wird, erheblich von der Leistung der Abfrage, die vom nicht grup-pierten Index abgedeckt wird? Nein. In diesem Fall sind die Abfragen bis auf eine E/A-Operation identisch, was keinen deutlichen Leistungsgewinn darstellt. ____________________________________________________________

____________________________________________________________

Page 734: Programmieren Einer Microsoft SQL Server 2000-Datenbank

60 Unterrichtseinheit 13: Optimieren der Abfrageleistung

Übung 3 Vergleichen der E/A für Abfragen, die Bereiche von Daten abrufen

In dieser Übung vergleichen Sie die E/A, die erforderlich ist, wenn gruppierte und nicht gruppierte Indizes verwendet werden, um einen Bereich von Daten abzurufen.

Sie können Abschnitte der Skriptdatei Range_Queries.sql unter C:\Moc\SQL2328A\Labfiles\L13 öffnen, lesen und ausführen oder die angegebenen Transact-SQL-Anweisungen eingeben und ausführen.

� So vergleichen Sie die Verwendung eines gruppierten Indexes und eines nicht gruppierten Indexes, die eine Abfrage abdecken

In diesem Verfahren löschen Sie alle vorhandenen Indizes, erstellen einen gruppierten Index für die member_no-Spalte der charge-Tabelle, führen eine Abfrage aus und zeigen den Ausführungsplan an. Anschließend löschen Sie vorhandene gruppierte Indizes und erstellen einen nicht gruppierten Index, führen die Abfrage erneut aus und bewerten dann die Unterschiede im Ausführungsplan. 1. Geben Sie die folgenden Anweisungen ein, und führen Sie sie aus, um

vorhandene Indizes zu löschen und einen gruppierten Index für die member_no-Spalte der charge-Tabelle zu erstellen: USE credit EXEC index_cleanup charge

CREATE CLUSTERED INDEX charge_member_no_CL ON charge(member_no)

2. Klicken Sie im Abfragefenster im Menü Abfrage auf Ausführungsplan anzeigen.

3. Geben Sie die folgende Anweisung ein, und führen Sie sie aus, um die Statistikoption auf den Wert ON festzulegen: SET STATISTICS IO ON

4. Geben Sie die folgende SELECT-Anweisung ein, und führen Sie sie aus, um die Mitgliedsnummern 5001 bis 6000 abzurufen: SELECT member_no FROM charge WHERE member_no BETWEEN 5001 AND 6000

5. Notieren Sie die statistischen Informationen in der folgenden Tabelle.

Informationen Ergebnis

Scananzahl 1

Logische Lesevorgänge 58

Ausführungsplan (Index- oder Tabellenscan) Index

Ausführungsplan (Art der Indexoperation) Clustered Index Seek

Page 735: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 13: Optimieren der Abfrageleistung 61

6. Geben Sie die folgenden Anweisungen ein, und führen Sie sie aus, um den gruppierten Index zu löschen und einen nicht gruppierten Index für die member_no-Spalte der charge-Tabelle zu erstellen: EXEC index_cleanup charge

CREATE NONCLUSTERED INDEX charge_member_no ON charge(member_no)

7. Führen Sie die folgende SELECT-Anweisung erneut aus, um die Mitglieds-nummern 5001 bis 6000 abzurufen: SELECT member_no FROM charge WHERE member_no BETWEEN 5001 AND 6000

8. Notieren Sie die statistischen Informationen in der folgenden Tabelle.

Informationen Ergebnis

Scananzahl 1

Logische Lesevorgänge 17

Ausführungsplan (Index- oder Tabellenscan) Index

Ausführungsplan (Art der Indexoperation) Index Seek

9. Vergleichen Sie die statistische Ausgabe der beiden Abfragen. Führt in diesem Beispiel die Verwendung des einen Indexes zu einer deut-lich besseren Leistung als die Verwendung des anderen Indexes? Begründung? Ja. Der Unterschied bezüglich der E/A verhält sich proportional zum Unterschied zwischen der Anzahl der Zeilen pro Datenseiten und der Anzahl der Zeilen pro Blattebenenseite. Wenn beispielsweise 10 Zeilen auf eine Datenseite und 100 Zeilen auf eine Blattebenenseiten passen, ist das Verhältnis 10 zu 1. Das bedeutet, dass für 10 E/A-Operationen, die für den Zugriff auf die Datenseiten notwendig sind, lediglich eine E/A-Operation erforderlich ist, um auf die Blattebene einer abgedeckten Abfrage zuzugreifen. ____________________________________________________________

____________________________________________________________

Page 736: Programmieren Einer Microsoft SQL Server 2000-Datenbank

62 Unterrichtseinheit 13: Optimieren der Abfrageleistung

� So führen Sie eine abgedeckte Abfrage aus, die keine WHERE-Klausel enthält

In diesem Verfahren löschen Sie alle vorhandenen Indizes, erstellen einen gruppierten Index für die member_no-Spalte der charge-Tabelle, führen eine Abfrage aus und zeigen den Ausführungsplan an. Anschließend löschen Sie vorhandene gruppierte Indizes und erstellen einen nicht gruppierten Index, führen die Abfrage erneut aus und bewerten dann die Unterschiede im Aus-führungsplan.

1. Geben Sie die folgenden Anweisungen ein, und führen Sie sie aus, um vor-handene Indizes zu löschen und einen gruppierten Index für die member_no-Spalte der charge-Tabelle zu erstellen: EXEC index_cleanup charge

CREATE CLUSTERED INDEX charge_member_no_CL ON charge(member_no)

2. Geben Sie die folgende SELECT-Anweisung ein, und führen Sie sie aus, um alle Mitgliedsnummern abzurufen: SELECT member_no FROM charge

3. Notieren Sie die statistischen Informationen in der folgenden Tabelle.

Informationen Ergebnis

Scananzahl 1

Logische Lesevorgänge 675

Ausführungsplan (Index- oder Tabellenscan) Index

Ausführungsplan (Art der Indexoperation) Clustered Index Scan

4. Geben Sie die folgenden Anweisungen ein, und führen Sie sie aus, um den gruppierten Index zu löschen und einen nicht gruppierten Index für die member_no-Spalte der charge-Tabelle zu erstellen: EXEC index_cleanup charge

CREATE NONCLUSTERED INDEX charge_member_no ON charge(member_no)

5. Führen Sie die folgende SELECT-Anweisung erneut aus, um alle Mitglieds-nummern abzurufen: SELECT member_no FROM charge

Page 737: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 13: Optimieren der Abfrageleistung 63

6. Notieren Sie die statistischen Informationen in der folgenden Tabelle.

Informationen Ergebnis

Scananzahl 1

Logische Lesevorgänge 187

Ausführungsplan (Index- oder Tabellenscan) Index

Ausführungsplan (Art der Indexoperation) Index Scan

7. Vergleichen Sie die statistische Ausgabe der beiden Abfragen. Worin besteht der Unterschied zwischen einem Tabellenscan und einem Indexscan? Ein Tabellenscan scannt immer die ganze Tabelle. Ein Indexscan (grup-pierter Index oder nicht gruppierter Index, der eine Abfrage abdeckt) scannt sämtliche Blattebenenseiten oder nur einen Teil der Blatt-ebenenseiten. Der Abfrageoptimierer gibt einem Indexscan immer den Vorzug vor einem Tabellenscan, da ein Indexscan in den meisten Fällen die Anzahl der Seitenlesevorgänge begrenzt. ____________________________________________________________

____________________________________________________________

____________________________________________________________

____________________________________________________________

Welche Größe (Anzahl der Seiten) wird in der statistischen Ausgabe für die Blattebene des nicht gruppierten Indexes aufgeführt? Die Größe der Blattebene des nicht gruppierten Indexes beträgt unge-fähr 186 Seiten (187 Seite - 1 Stammseite = 186). ____________________________________________________________

____________________________________________________________

Page 738: Programmieren Einer Microsoft SQL Server 2000-Datenbank

64 Unterrichtseinheit 13: Optimieren der Abfrageleistung

Wenn Sie noch Zeit haben Verwenden von Optimiererhinweisen, um die Verwendung eines Indexes und einer Verknüpfung zu erzwingen

In dieser Übung verwenden Sie Optimiererhinweise, um zu erzwingen, dass der Abfrageoptimierer die von Ihnen angegebenen Indizes und Verknüpfungen ver-wendet.

Sie können Abschnitte der Skriptdatei Hints.sql unter C:\Moc\SQL2328A\Labfiles\L13 öffnen, lesen und ausführen oder die ange-gebenen Transact-SQL-Anweisungen eingeben und ausführen.

� So vergleichen Sie Ausführungspläne, wenn Sie einen Indexhinweis verwenden

In diesem Verfahren erzwingen Sie, dass der Abfrageoptimierer einen bestimm-ten Index verwendet. 1. Melden Sie sich mit Hilfe der Informationen in der folgenden Tabelle an der

Schulungsraumdomäne nwtraders an.

Option Eingabe

Benutzername SQLAdminx (wobei x die Ihrem Computernamen zugewiesene Nummer ist, wie in der Schulungsraumdomäne nwtraders.msftfestgelegt)

Kennwort password

2. Öffnen Sie SQL Query Analyzer, und melden Sie sich ggf. unter Verwen-dung der Windows-Authentifizierung am (lokalen) Server an. Sie verfügen über die Berechtigung, sich bei Microsoft SQL Server 2000 anzumelden und SQL Server zu verwalten, da Sie als SQLAdminx ange-meldet sind und SQLAdminx ein Mitglied der lokalen Gruppe Administ-ratoren von Microsoft Windows 2000 ist. Alle Mitglieder dieser Gruppe werden automatisch der sysadmin-Rolle von SQL Server zugeordnet.

3. Geben Sie die folgenden Anweisungen ein, und führen Sie sie aus, um vor-handene Indizes zu löschen und einen gruppierten und einen nicht gruppier-ten Index für die charge-Tabelle der credit-Datenbank zu erstellen: USE credit GO

EXEC index_cleanup charge

4. Geben Sie die folgende Anweisung ein, und führen Sie sie aus, um einen gruppierten Index für die charge_dt-Spalte der charge-Tabelle zu erstellen: CREATE CLUSTERED INDEX charge_date_CL ON charge(charge_dt)

Page 739: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 13: Optimieren der Abfrageleistung 65

5. Geben Sie die folgende Anweisung ein, und führen Sie sie aus, um einen nicht gruppierten Index für die member_no-Spalte der charge-Tabelle zu erstellen:CREATE NONCLUSTERED INDEX charge_member_NC ON charge(member_no)

6. Klicken Sie im Menü Abfrage auf Ausführungsplan anzeigen, um den grafischen Ausführungsplan zu aktivieren.

7. Geben Sie die folgende SELECT-Anweisung ein, und führen Sie sie aus, um Zeilen aus der charge-Tabelle abzurufen, in denen member_no dem Wert 4000 entspricht: SELECT * FROM charge WHERE member_no = 4000

Welcher Index wird laut Ausgabe des Ausführungsplanes vom Abfrage-optimierer verwendet? Der „charge_member_NC“-Index wurde ausgewählt, da er für diese Abfrage eine hohe Selektivität aufweist. ____________________________________________________________

____________________________________________________________

8. Geben Sie die folgende SELECT-Anweisung ein, und führen Sie sie aus, um unter Verwendung des charge_date_CL-Indexes Zeilen aus der charge-Tabelle abzurufen, in denen member_no dem Wert 4000 entspricht: SELECT * FROM charge WITH(INDEX (charge_date_CL)) WHERE member_no = 4000

Welcher Index wird laut Ausgabe des Ausführungsplanes vom Abfrage-optimierer verwendet? Der „charge_date_CL“-Index wurde ausgewählt, da seine Verwendung erzwungen wurde. ____________________________________________________________

____________________________________________________________

Page 740: Programmieren Einer Microsoft SQL Server 2000-Datenbank

66 Unterrichtseinheit 13: Optimieren der Abfrageleistung

� So vergleichen Sie den Ausführungsplan, wenn Sie einen Indexhinweis verwenden

In diesem Verfahren werden Sie beobachten, wie mit Hilfe eines Indexhin-weises erzwungen wird, dass der Abfrageoptimierer einen anderen Ausfüh-rungsplan bereitstellt. 1. Geben Sie die folgenden Anweisungen ein, und führen Sie sie aus, um vor-

handene Indizes zu löschen und einen gruppierten Index für die charge-Tabelle der credit-Datenbank zu erstellen: USE credit GO

EXEC index_cleanup member CREATE UNIQUE CLUSTERED INDEX member_no_CL ON member(member_no)

2. Aktivieren Sie in SQL Query Analyzer die Anzeige des grafischen Ausfüh-rungsplanes, und wählen Sie dann im Menü Abfrage den Befehl Ausfüh-rungsplan anzeigen aus.

3. Geben Sie die folgende SELECT-Anweisung ein, und führen Sie sie aus, um die Tabellen charge und member miteinander zu verknüpfen: SELECT m.lastname, SUM(charge_amt) FROM charge AS c JOIN member AS m ON c.member_no = m.member_no WHERE m.lastname = 'BARR' GROUP BY m.lastname

Welche Verknüpfungsmethode wird laut Ausgabe des Ausführungsplanes vom Abfrageoptimierer verwendet? Als effizienteste Verknüpfungsmethode wird eine Merge-verknüpfung/innere Verknüpfung ausgewählt. ____________________________________________________________

____________________________________________________________

4. Geben Sie die folgende SELECT-Anweisung ein, und führen Sie sie aus, um zu erzwingen, dass der Abfrageoptimierer eine Hashverknüpfung ver-wendet, um die Tabellen charge und member miteinander zu verknüpfen: SELECT m.lastname, SUM(charge_amt) FROM charge AS c INNER HASH JOIN member AS m ON c.member_no = m.member_no WHERE m.lastname = 'BARR' GROUP BY m.lastname

Welche Verknüpfungsmethode wird laut Ausgabe des Ausführungsplanes vom Abfrageoptimierer verwendet? Als Verknüpfungsmethode wird eine Hashverknüpfung/innere Ver-knüpfung ausgewählt, da ihre Verwendung erzwungen wurde. ____________________________________________________________

____________________________________________________________

Page 741: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 13: Optimieren der Abfrageleistung 67

Lernzielkontrolle

� Einführung zum Abfrageoptimierer

� Abrufen von Ausführungsplaninformationen

� Verwenden eines Indexes zum Abdecken einer Abfrage

� Indizierungsstrategien

� Außerkraftsetzen des Abfrageoptimierers

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

1. Ein Finanzanalyst führt Abfragen mit langen Ausführungszeiten aus, die dazu führen, dass die Antwortzeiten für die Benutzer, die Transaktionen eingeben, länger werden. Sie bitten den Finanzanalysten, die Aktivitäten zu begrenzen, er weiß jedoch nicht, welche Abfragen mehr Ressourcen bean-spruchen als andere. Wie können Sie die Auswirkungen für die Verarbei-tung von Transaktionsabfragen reduzieren? Verwenden Sie die Abfragekontrolle, um die Abfragen des Finanz-analysten auf Abfragen zu beschränken, deren Ausführungszeit maximal 30 Sekunden beträgt.

2. Sie ermitteln mit Hilfe von SQL Profiler die fünf Abfragen, die die schlech-teste Leistung aufweisen. Wie können Sie die Ursache für die schlechte Ab-frageleistung ermitteln? Welche Vorteile bieten die einzelnen Methoden? Eines der Tools, die sehr gut geeignet sind, um die Ursache für eine schlechte Abfrageleistung zu ermitteln, ist der grafische Ausführungs-plan. Grafische Ausführungspläne ermöglichen es Ihnen, anzuzeigen, wie eine Abfrage ausgeführt wurde. Sie können jeden Schritt des Planes sowie die Abfolge der einzelnen Schritte anzeigen. Der Plan enthält darüber hinaus Kostenschätzungen und Warnungen, falls Indizes oder Statistiken fehlen sollten. Sie können auch die Anweisungen STATISTICS IO und STATISTICS TIME verwenden, um weitere Informationen zur Abfrage anzuzeigen, einschließlich der Häufigkeit der Ausführung eines Tabellenscans und der Gesamt-E/A, die SQL Server für die Verarbeitung der Abfrage verwendet hat. Mit Hilfe von STATISTICS TIME können Sie ermitteln, wie lange die Verarbei-tung der einzelnen Abfragephasen einschließlich CPU- und Kompilie-rungszeit gedauert hat.

ThemaVertiefen Sie die Lernziele dieser Unterrichtseinheit, indem Sie die Kernpunkte wiederholen.

EinstiegDie Fragen zur Lernziel-kontrolle beziehen sich auf einige der Schlüsselkon-zepte, die Inhalt dieser Unterrichtseinheit sind.

Methodischer Hinweis Gehen Sie anhand dieser Fragen die Themen der Unterrichtseinheit durch.

Klären Sie andere offene Fragen der Kursteilnehmer, bevor Sie fortfahren.

Page 742: Programmieren Einer Microsoft SQL Server 2000-Datenbank

68 Unterrichtseinheit 13: Optimieren der Abfrageleistung

3. Sie haben bestimmt, dass durch Hinzufügen eines weiteren Indexes zu einer Tabelle erreicht werden kann, dass der Index mehrere Abfragen abdecken kann. Durch das Vorhandensein eines Indexes, der eine Abfrage abdeckt, wird die Leistung gesteigert, wodurch die Kosten, die durch das Vorhanden-sein des zusätzlichen Indexes entstehen, aufgewogen werden. Welche An-forderungen müssen erfüllt sein, damit ein Index eine Abfrage abdeckt? Alle Spalten, auf die in der Abfrage verwiesen wird, müssen indiziert werden. Es muss mindestens ein nicht gruppierter Index vorhanden sein. Darüber hinaus können zusammengesetzte Indizes und gruppierte Indizes verwendet werden, um eine Abfrage abzudecken.

4. Während Sie die vorhandenen Indizes untersuchen, stellen Sie fest, dass der gruppierte Index der Client-Tabelle die Last Name-Spalte verwendet. Sie wissen, dass Kunden üblicherweise einzeln anhand des Nachnamens ge-sucht werden. Darüber hinaus ist bekannt, dass Kunden im Rahmen der Berichterstellung regelmäßig anhand der Client Representative ID-Spalte gruppiert werden. Sollten Sie einen nicht gruppierten Index für die Client Representative ID-Spalte erstellen? Nein. Sie sollten zuerst den gruppierten Index für die Last Name-Spalte löschen und einen neuen gruppierten Index für die Client Representative ID-Spalte erstellen. Durch die Erstellung eines neuen gruppierten Indexes kann die Berichterstellung erheblich beschleunigt werden. Anschließend sollten Sie einen nicht gruppierten Index für die Last Name-Spalte erstellen. Durch das Erstellen eines nicht gruppierten Indexes erzielen Sie dieselbe Leistung, wenn Sie einzelne Kunden an-hand des Nachnamens suchen.

5. Im Juli haben Sie Optimiererhinweise in einer Abfrage verwendet, um die Leistung der Abfrage zu verbessern. Drei Monate später stellen Sie fest, dass diese Abfrage erneut eine schlechte Leistung aufweist. Was ist die Ursache? Die Daten können sich so verändern, dass die angegebenen Optimierer-hinweise nicht mehr zu einer effizienten Verarbeitung der Abfrage führen. Darüber hinaus können sich die Merkmale der Parameterwerte ändern, die von den Benutzern an die Abfrage übergeben werden, was ebenfalls dazu führt, dass der Optimiererhinweis keine effiziente Ver-arbeitung mehr bewirkt.

Page 743: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Inhalt

Übersicht 1

Abfragen mit dem AND-Operator 2

Abfragen mit dem OR-Operator 4

Übungseinheit A: Analysieren von Abfragen mit dem AND-Operator und dem OR-Operator 5

Abfragen mit Verknüpfungsoperationen 35

Übungseinheit B: Analysieren von Abfragen mit unterschiedlichen Verknüpfungsstrategien 48

Empfohlene Methoden 57

Lernzielkontrolle 58

Unterrichtseinheit 14: Analysieren von Abfragen

Page 744: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Die in diesen Unterlagen enthaltenen Angaben und Daten können ohne vorherige Ankündigung geändert werden. Die in diesen Unterlagen genannten Firmen, Produkte, Menschen, Charaktere und/oder Daten sind frei erfunden und sollen keine wirklichen Individuen, Gesellschaften, Produkte oder Veranstaltungen darstellen, soweit nichts anderes angegeben ist. Die Benutzer/innen sind verpflichtet, sich an alle anwendbaren Urheberrechtsgesetze zu halten. Ohne ausdrückliche schriftliche Erlaubnis der Microsoft Corporation darf kein Teil dieser Unterlagen für irgendwelche Zwecke vervielfältigt oder übertragen werden, unabhängig davon, auf welche Art und Weise oder mit welchen Mitteln, elektronisch oder mechanisch, dies geschieht. Wenn auf dieses Dokument nur auf elektronischem Wege zugegriffen werden kann, sind Sie hiermit berechtigt, eine (1) Kopie zum persönlichen Gebrauch auszudrucken.

Microsoft Corporation kann Inhaber von Patenten oder Patentanträgen, Marken, Urheberrechten oder anderen gewerblichen Schutzrechten sein, die den Inhalt dieses Dokuments betreffen. Die Bereitstellung dieses Dokuments gewährt keinerlei Lizenzrechte an diesen Patenten, Marken, Urheberrechten oder anderen gewerblichen Schutzrechten, es sei denn, dies wurde ausdrücklich durch einen schriftlichen Lizenzvertrag mit der Microsoft Corporation vereinbart.

2000 Microsoft Corporation. Alle Rechte vorbehalten.

Microsoft, ActiveX, BackOffice, MS-DOS, PowerPoint, Visual Basic, Visual C++, Visual Studio, Windows und Windows NT sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern.

Andere in diesem Dokument aufgeführte Produkt- und Firmennamen sind möglicherweise Marken der jeweiligen Eigentümer.

Project Lead: Rich Rose Instructional Designers: Rich Rose, Cheryl Hoople, Marilyn McGill Instructional Software Design Engineers: Karl Dehmer, Carl Raebler, Rick Byham Technical Lead: Karl Dehmer Subject Matter Experts: Karl Dehmer, Carl Raebler, Rick Byham Graphic Artist: Kirsten Larson (Independent Contractor) Editing Manager: Lynette Skinner Editor: Wendy Cleary Copy Editor: Edward McKillop (S&T Consulting) Production Manager: Miracle Davis Production Coordinator: Jenny Boe Production Support: Lori Walker (S&T Consulting) Test Manager: Sid Benavente Courseware Testing: TestingTesting123 Classroom Automation: Lorrin Smith-Bates Creative Director, Media/Sim Services: David Mahlmann Web Development Lead: Lisa Pease CD Build Specialist: Julie Challenger Online Support: David Myka (S&T Consulting) Localization Manager: Rick Terek Operations Coordinator: John Williams Manufacturing Support: Laura King; Kathy Hershey Lead Product Manager, Release Management: Bo Galford Lead Product Manager, Data Base: Margo Crandall Group Manager, Courseware Infrastructure: David Bramble Group Product Manager, Content Development: Dean Murray General Manager: Robert Stewart

Page 745: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 14: Analysieren von Abfragen iii

Hinweise für den Kursleiter Diese Unterrichtseinheit vermittelt Kursteilnehmern umfassende Kenntnisse darin, wie der Abfrageoptimierer von Microsoft® SQL Server™ 2000 Abfragen auswertet und verarbeitet, die den AND-Operator und den OR-Operator sowie Verknüpfungsoperationen enthalten. Außerdem werden den Kursteilnehmern Kenntnisse darin vermittelt, wann sie den Abfrageoptimierer außer Kraft setzen sollten.

In den Übungseinheiten führen die Kursteilnehmer verschiedene Abfragen durch. Außerdem analysieren die Kursteilnehmer, wie der Abfrageoptimierer Abfragen mit dem logischen AND-Operator und dem logischen OR-Operator verarbeitet. Weiterhin analysieren die Kursteilnehmer, wie Nested Loop-, Merge- und Hashverknüpfungen verarbeitet werden.

Am Ende dieser Unterrichtseinheit werden die Kursteilnehmer in der Lage sein, die folgenden Aufgaben auszuführen:

� Analysieren des Leistungsgewinns durch das Schreiben effizienter Abfragen und Erstellen nützlicher Indizes für Abfragen mit dem logischen AND-Operator.

� Analysieren des Leistungsgewinns durch das Schreiben effizienter Abfragen und Erstellen nützlicher Indizes für Abfragen mit dem logischen OR-Operator.

� Auswerten, wie der Abfrageoptimierer die verschiedenen Verknüpfungs-strategien zur Abfrageoptimierung verwendet.

Unterlagen und Vorbereitung In diesem Abschnitt werden die Unterlagen und vorbereitenden Aufgaben erläutert, die nötig sind, um diese Unterrichtseinheit zu unterrichten.

Erforderliche Unterlagen Um diese Unterrichtseinheit zu unterrichten, benötigen Sie folgende Unterlagen:

� Die Microsoft PowerPoint®-Datei 2328A_14.ppt� Die Beispieldatei C:\Moc\2328A\Demo\D14_Ex.sql, die alle Beispiel-

skripts der Unterrichtseinheit enthält, soweit in der Unterrichtseinheit nichts anderes angegeben ist.

Vorbereitende Aufgaben Zur Vorbereitung dieser Unterrichtseinheit gehen Sie folgendermaßen vor:

� Lesen Sie alle Unterlagen für diese Unterrichtseinheit. � Arbeiten Sie die Übungseinheiten durch. � Machen Sie sich mit der Präsentation einschließlich der Animationen

vertraut. � Gehen Sie alle relevanten Whitepaper auf der Kursleiter-CD durch.

Präsentation:60 Minuten

Übungseinheit:90 Minuten

Page 746: Programmieren Einer Microsoft SQL Server 2000-Datenbank

iv Unterrichtseinheit 14: Analysieren von Abfragen

MultimediapräsentationIn diesem Abschnitt werden Vorgehensweisen bei der Multimediapräsentation beschrieben, die nicht in den Randnotizen enthalten und nicht für die Unter-lagen der Kursteilnehmer geeignet sind.

Die Multimediapräsentation muss im Kurs abgespielt werden, da ihr Inhalt zu keinem anderen Zeitpunkt der Unterrichtseinheit vorgestellt wird. In dieser Multimediapräsentation wird vorgestellt, wie der Abfrageoptimierer Merge-verknüpfungen verarbeitet.

Wie Mergeverknüpfungen verarbeitet werden � So bereiten Sie die Multimediapräsentation vor und starten sie • Klicken Sie auf die Schaltfläche auf der Folie, um die Multimediapräsen-

tation zu starten.

Skript für die Multimediapräsentation Wenn der Abfrageoptimierer eine Abfrage mit einer Verknüpfungsoperation verarbeitet, kann die Abfrage mit Hilfe eines Mergeverknüpfungsalgorithmus optimiert werden.

1. In diesem Beispiel werden die member-Tabelle und die payment-Tabelle in den member_no-Spalten verknüpft. Die zum Verknüpfen der Tabellen verwendeten Spalten werden durch die Mergeverknüpfungsoperation in zwei Listen sortierter Eingabewerte konvertiert. Beachten Sie, dass die Eingabewerte in m.member_no eindeutige Werte sind und dass die Eingabewerte in p.member_no keine eindeutigen Werte sind. Diese Tabellen stellen 1:n-Beziehungen dar: Für ein Mitglied gibt es viele Zahlungen.

2. Der Abfrageoptimierer vergleicht den ersten Wert aus Eingabe A (Input A) mit dem ersten Wert in Eingabe B (Input B).

• Wenn die Werte gleich sind, werden die übereinstimmenden Zeilen zurückgegeben.

• Wenn der Wert aus Input A niedriger ist als der Wert aus Input B, dann erhält der Abfrageoptimierer den nächsten Eingabewert aus Input A.

• Wenn der Wert aus Input B niedriger ist als der Wert aus Input A, dann erhält der Abfrageoptimierer den nächsten Eingabewert aus Input B.

Da der Wert 1 der niedrigere Wert ist, wird die 1 verworfen, und der nächste Wert in Input A wird für den nächsten Vergleich verwendet.

3. Der Abfrageoptimierer wertet aus, dass 2 gleich 2 ist. Wenn die Eingabe-werte gleich sind, werden übereinstimmende Zeilen zurückgegeben.

Page 747: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 14: Analysieren von Abfragen v

4. Der nächste Eingabewert (3) in Input A wird mit dem Eingabewert 2 in Input B verglichen. Da der Wert 2 der niedrigere Wert ist, wird die 2 ver-worfen, und der nächste Wert in Input B wird für den nächsten Vergleich verwendet.

5. Da wieder der Wert 2 der niedrigere Wert ist, wird die 2 verworfen, und der nächste Wert in Input B wird für den nächsten Vergleich verwendet.

6. Der Abfrageoptimierer setzt die Auswertung fort. Er vergleicht mit dem nächsten Eingabewert in Input B, der ebenfalls 2 beträgt. Eingabewert 2 wird verworfen, da er der niedrigere Wert ist, und der nächste Eingabewert in Input B wird für den nächsten Vergleich verwendet

7. Der nächste Eingabewert in Input B ist die 4. Der Abfrageoptimierer ver-gleicht die beiden Werte. Da der Wert 3 niedriger als der Wert 4 ist, wird die 3 verworfen, und der nächste Wert in Input A wird für den nächsten Vergleich verwendet.

8. Der Abfrageoptimierer wertet aus, dass 4 gleich 4 ist und gibt alle über-einstimmenden Zeilen zurück.

9. Der nächste Eingabewert (5) in Input A wird mit dem Eingabewert 4 in Input B verglichen. Da der Wert 4 der niedrigere Wert ist, wird die 4 ver-worfen, und der nächste Wert in Input B wird für den nächsten Vergleich verwendet.

10. Da wieder der Wert 4 der niedrigere Wert ist, wird die 4 verworfen, und der nächste Wert in Input B wird für den nächsten Vergleich verwendet.

11. Der nächste Eingabewert in Input B ist die 8. Der Abfrageoptimierer ver-gleicht die beiden Werte. Da der Wert 5 niedriger als der Wert 8 ist, wird die 5 verworfen, und der nächste Wert in Input A wird für den nächsten Vergleich verwendet.

12. Der Abfrageoptimierer setzt die Auswertung fort. Er vergleicht den nächsten Eingabewert in Input A, der 6 beträgt. Er verwirft diesen Eingabe-wert und verwendet den nächsten Eingabewert in Input A für den nächsten Vergleich.

13. Wie Sie sehen können, setzt der Abfrageoptimierer bei Input A fort, ver-gleicht den nächsten Schlüsselwert mit Eingabewert 8 und verwirft den niedrigeren Wert. Der Abfrageoptimierer setzt diesen Vorgang fort, bis er übereinstimmende Eingabewerte findet.

14. Da 8 gleich 8 ist, gibt der Abfrageoptimierer die Zeilen zurück. 15. Der nächste Eingabewert in Input A ist die 9. Da der Wert 8 der niedrigere

Wert ist, verwirft der Abfrageoptimierer diesen Eingabewert und verwendet den nächsten Eingabewert in Input B für den nächsten Vergleich.

16. Der Abfrageoptimierer vergleicht mit dem nächsten Eingabewert in Input B, der ebenfalls 8 beträgt. Er verwirft diesen Eingabewert.

17. Da alle Zeilen aus Input B verarbeitet wurden, beendet der Abfrage-optimierer das Auswerten der übrigen Werte in Input A.

18. Die Ergebnisse einer Mergeverknüpfungsoperation können dann im nächsten Schritt des Ausführungsplanes, wie beispielsweise bei einem Bookmark Lookup oder einer anderen Verknüpfungsoperation, verwendet werden.

Page 748: Programmieren Einer Microsoft SQL Server 2000-Datenbank

vi Unterrichtseinheit 14: Analysieren von Abfragen

Strategie für die Unterrichtseinheit Verwenden Sie die folgende Strategie, um diese Unterrichtseinheit zu präsentieren:

� Abfragen mit dem AND-Operator Beschreiben Sie, wie der Abfrageoptimierer den AND-Operator verarbeitet. Erläutern Sie, dass die Abfrageoptimierung davon abhängt, ob für einige oder für alle Spalten, auf die in der WHERE-Klausel verwiesen wird, Indizes vorhanden sind.

� Abfragen mit dem OR-Operator Beschreiben Sie, wie der Abfrageoptimierer den OR-Operator verarbeitet. Erläutern Sie, dass die Abfrageoptimierung davon abhängt, ob für einige oder für alle Spalten, auf die in der WHERE-Klausel verwiesen wird, Indizes vorhanden sind.

� Abfragen mit Verknüpfungsoperationen Erläutern Sie die Selektivität und die Dichte einer JOIN-Klausel. Be-schreiben Sie, wie der Abfrageoptimierer die verschiedenen Verknüpfungs-strategien verwendet, um Abfragen mit Verknüpfungen zu verarbeiten.

AnpassungsinformationenDieser Abschnitt beschreibt die Anforderungen zum Einrichten der Übungs-einheiten für eine Unterrichtseinheit sowie die Konfigurationsänderungen, die während der Übungseinheiten an den Kursteilnehmercomputern vorgenommen werden. Diese Informationen sollen Ihnen beim Replizieren oder Anpassen der Microsoft Official Curriculum-Courseware (MOC) helfen.

Die Übungseinheiten in dieser Unterrichtseinheit hängen auch von der Schulungsraumkonfiguration ab, die im Abschnitt „Anpassungsinformationen“ am Ende des Dokuments Handbuch für das Einrichten von Schulungs-computern für Kurs 2328A, Programmieren einer Microsoft SQL Server 2000-Datenbank, angegeben ist.

Einrichten der Übungseinheiten Im folgenden Abschnitt werden die Anforderungen zum Einrichten der Übungseinheiten dieser Unterrichtseinheit beschrieben.

Anforderung zum Einrichten der Übungseinheit A Für die Übungseinheit in dieser Unterrichtseinheit muss sich die credit-Daten-bank in einem für die Übungseinheiten erforderlichen Status befinden. Um die Kursteilnehmercomputer so vorzubereiten, dass sie diese Anforderung erfüllen, führen Sie eine der beiden folgenden Aktionen durch:

� Bearbeiten der vorherigen Übungseinheit. � Ausführen der Batchdatei C:\Moc\2328A\Batches\Restore14A.cmd.

Wichtig

Page 749: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 14: Analysieren von Abfragen vii

Anforderung zum Einrichten der Übungseinheit B Für die Übungseinheit in dieser Unterrichtseinheit muss sich die credit-Daten-bank in einem für die Übungseinheiten erforderlichen Zustand befinden. Um die Kursteilnehmercomputer so vorzubereiten, dass sie diese Anforderung er-füllen, führen Sie eine der beiden folgenden Aktionen durch:

� Bearbeiten der vorherigen Übungseinheit. � Ausführen der Batchdatei C:\Moc\2328A\Batches\Restore14B.cmd.

Falls dieser Kurs angepasst wurde, müssen die Kursteilnehmer die Batchdatei C:\Moc\2328A\Batches\Restore14A.cmd ausführen, um sicherzu-stellen, dass die erste Übungseinheit ordnungsgemäß funktioniert. Falls dieser Kurs angepasst wurde, müssen die Kursteilnehmer die Batchdatei C:\Moc\2328A\Batches\Restore14B.cmd ausführen, um sicherzustellen, dass die zweite Übungseinheit ordnungsgemäß funktioniert.

Ergebnisse der Übungseinheiten Auf den Kursteilnehmercomputern gibt es keine Konfigurationsänderungen, die die Replikation oder die Anpassung betreffen.

Achtung

Page 750: Programmieren Einer Microsoft SQL Server 2000-Datenbank

iv Unterrichtseinheit 14: Analysieren von Abfragen

This page is intentionally left blank.

Page 751: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 14: Analysieren von Abfragen 1

Übersicht

� Abfragen mit dem AND-Operator

� Abfragen mit dem OR-Operator

� Abfragen mit Verknüpfungsoperationen

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Am Ende dieser Unterrichtseinheit werden Sie in der Lage sein, die folgenden Aufgaben auszuführen:

� Analysieren des Leistungsgewinns durch das Schreiben effizienter Abfragen und Erstellen nützlicher Indizes für Abfragen mit dem logischen AND-Operator.

� Analysieren des Leistungsgewinns durch das Schreiben effizienter Abfragen und Erstellen nützlicher Indizes für Abfragen mit dem logischen OR-Operator.

� Auswerten, wie der Abfrageoptimierer die verschiedenen Verknüpfungs-strategien zur Abfrageoptimierung verwendet.

ThemaGeben Sie eine Übersicht über die Themen und Lern-ziele dieser Unterrichts-einheit.

EinstiegIn dieser Unterrichtseinheit lernen Sie, wie der Abfrage-optimierer den logischen AND-Operator und den logischen OR-Operator verarbeitet und wie der Abfrageoptimierer die verschiedenen Verknüp-fungsstrategien verwendet.

Page 752: Programmieren Einer Microsoft SQL Server 2000-Datenbank

2 Unterrichtseinheit 14: Analysieren von Abfragen

Abfragen mit dem AND-Operator � Verarbeiten des AND-Operators

� Gibt die Zeilen zurück, die alle Bedingungen für jedes in der WHERE-Klausel angegebene Kriterium erfüllen

� Beschränkt die Anzahl zurückgegebener Zeilen bei jeder zusätzlichen Suchbedingung immer weiter

� Kann für jede Suchbedingung der WHERE-Klausel einen Index verwenden

� Richtlinien zum Indizieren und Leistungsaspekte� Definieren eines Indexes auf der Grundlage eines

sehr selektiven Suchkriterium� Leistungsunterschiede zwischen dem Erstellen

mehrerer einspaltiger Indizes und dem Erstellen eines zusammengesetzten Index vergleichen

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Das Verarbeiten des AND-Operators durch den Abfrageoptimierer hängt davon ab, ob für einige oder für alle Spalten, auf die in der WHERE-Klausel ver-wiesen wird, Indizes vorhanden sind.

Verarbeiten des AND-Operators Wenn eine Abfrage den AND-Operator enthält, gilt für den Abfrageoptimierer Folgendes:

� Gibt die Zeilen zurück, die alle Bedingungen für jedes in der WHERE-Klausel angegebene Kriterium erfüllen.

� Beschränkt die Anzahl zurückgegebener Zeilen bei jeder zusätzlichen Such-bedingung immer weiter.

� Kann für jede Suchbedingung der WHERE-Klausel einen Index verwenden. � Verwendet immer einen Index, wenn der Index nützlich ist.

Wenn die Indizes für keine der Spalten in der WHERE-Klausel nützlich sind, führt der Abfrageoptimierer einen Tabellenscan oder einen Scan des gruppierten Indexes aus.

� Kann mehrere Indizes verwenden, falls sie nützlich sind. Wenn mehrere Indizes vorhanden sind und einige Indizes für beliebige Spalten in der WHERE-Klausel nützlich sind, ermittelt der Abfrage-optimierer, welche Indexkombination verwendet wird.

ThemaBeschreiben Sie, wie eine Abfrage, die den AND-Operator enthält, optimiert wird.

EinstiegDas Verarbeiten des AND-Operators durch den Abfrageoptimierer hängt davon ab, ob für einige oder für alle Spalten, auf die in der WHERE-Klausel verwiesen wird, Indizes vorhanden sind.

Page 753: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 14: Analysieren von Abfragen 3

Im Ausführungsplan kann sich zeigen, dass ein Index oder die meisten Indizes zum Verarbeiten der Abfrage verwendet wurden Die Kombination aus Indizes wird durch Folgendes ermittelt:

• Selektivität der Suche.

• Vorhandene Indextypen, wie z. B. gruppierte oder nicht gruppierte Indizes.

• Die Möglichkeit, den Index abzudecken.

• Das Vorhandensein einer indizierten Sicht. � Kann möglicherweise nur einen Index verwenden, auch wenn mehrere nütz-

liche Indizes vorhanden sind. Wenn der Abfrageoptimierer einen sehr selektiven Index findet, wird dieser Index verwendet. Dann wird eine Filteroperation verwendet, um die übrigen Suchergebnisse mit den qualifizierenden Zeilen zu verarbeiten.

Richtlinien zum Indizieren und Leistungsaspekte Die beste Methode zum Erstellen eines Indexes für Abfragen, die den AND-Operator enthalten, ist, wenn mindestens ein sehr selektives Suchkriterium vorhanden ist und ein Index für die Spalte definiert wird.

Sie können die Leistungsunterschiede beim Erstellen von mehreren einspaltigen Indizes und einem zusammengesetzten Index vergleichen. Die Abfrageleistung wird nicht unbedingt verbessert, indem jede Spalte indiziert wird, die Teil des AND-Operators ist. Mehrere Indizes sind jedoch vorteilhaft, wenn die Spalten, auf die der AND-Operator verweist, eine geringere Selektivität aufweisen.

Page 754: Programmieren Einer Microsoft SQL Server 2000-Datenbank

4 Unterrichtseinheit 14: Analysieren von Abfragen

Abfragen mit dem OR-Operator � Gibt die Zeilen zurück, die beliebige Bedingungen für

jedes in der WHERE-Klausel angegebene Kriterium erfüllen

� Erhöht die Anzahl zurückgegebener Zeilen bei jeder zusätzlichen Suchbedingung immer weiter

� Kann einen Index verwenden, der alle Teile des OR-Operators erfüllt, oder verwendet verschiedene Indizes für jeden Teil des OR-Operators

� Führt immer einen Tabellenscan oder einen Scan des gruppierten Indexes durch, wenn eine Spalte, auf die im OR-Operator verwiesen wird, keinen Index aufweist oder wenn der Index nicht nützlich ist

� Kann mehrere Indizes verwenden

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Das Verarbeiten des OR-Operators durch den Abfrageoptimierer hängt eben-falls davon ab, ob für einige oder für alle Spalten, auf die in der WHERE-Klausel verwiesen wird, Indizes vorhanden sind.

Wenn eine Abfrage den OR-Operator enthält, gilt für den Abfrageoptimierer Folgendes:

� Gibt die Zeilen zurück, die beliebige Bedingungen für jedes in der WHERE-Klausel angegebene Kriterium erfüllen.

� Erhöht die Anzahl zurückgegebener Zeilen bei jeder zusätzlichen Such-bedingung immer weiter.

� Kann einen Index verwenden, der alle Teile des OR-Operators erfüllt, oder verwendet verschiedene Indizes für jeden Teil des OR-Operators.

� Führt immer einen Tabellenscan oder einen Scan des gruppierten Indexes durch, wenn eine Spalte, auf die im OR-Operator verwiesen wird, keinen Index aufweist oder wenn der Index nicht nützlich ist.

� Wenn mehrere Indizes vorhanden sind und alle Indizes nützlich sind, führt der Abfrageoptimierer Folgendes aus:

• Durchsucht eine Tabelle mit Hilfe eines Indexes für jede Spalte.

• Sortiert die qualifizierenden Werte für jede Spalte.

• Kombiniert die Ergebnisse.

• Ruft die qualifizierenden Zeilen mit Hilfe einer Bookmark Lookup-Operation ab.

Der Abfrageoptimierer konvertiert die IN-Klausel in den OR-Operator.

ThemaBeschreiben Sie, wie eine Abfrage, die den OR-Operator enthält, optimiert wird.

EinstiegDas Verarbeiten des OR-Operators durch den Abfrageoptimierer hängt ebenfalls davon ab, ob für einige oder für alle Spalten, auf die in der WHERE-Klausel verwiesen wird, Indizes vorhanden sind.

Anmerkung

Page 755: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 14: Analysieren von Abfragen 5

Übungseinheit A: Analysieren von Abfragen mit dem AND-Operator und dem OR-Operator

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

LernzieleAm Ende dieser Übungseinheit werden Sie in der Lage sein, die folgenden Aufgaben auszuführen:

� Interpretieren von statistischen Informationen zu einer Abfrage, in der der AND-Operator verwendet wird, und Ermitteln, warum der Abfrage-optimierer bestimmte Indizes verwendet oder nicht verwendet.

� Interpretieren, warum der Abfrageoptimierer Abfragen mit einer kurzen Werteliste anders verarbeitet als Abfragen mit einer langen Werteliste.

� Erklären der Menge von Eingabe-/Ausgabevorgängen (E/A), die zum Verarbeiten einer Abfrage mit geschachtelten SELECT-Anweisungen verwendet werden, und Erläutern, warum der Abfrageoptimierer einen bestimmten Ausführungsplan ausgewählt hat.

VoraussetzungenUm diese Übungseinheit zu bearbeiten, benötigen Sie Folgendes:

� Die credit-Datenbank in Microsoft® SQL Server™ 2000. � Die Skriptdateien für diese Übungseinheit, die sich in

C:\Moc\2328A\Labfiles\L14 befinden.

ThemaGeben Sie eine Einführung in die Übungseinheit.

EinstiegIn dieser Übungseinheit be-trachten Sie den Ausfüh-rungsplan und werten aus, wie der Abfrageoptimierer eine Abfrage optimiert, in der der AND-Operator und der OR-Operator verwendet wird.

Erläutern Sie die Lernziele der Übungseinheit.

Page 756: Programmieren Einer Microsoft SQL Server 2000-Datenbank

6 Unterrichtseinheit 14: Analysieren von Abfragen

Einrichten der Übungseinheit Um diese Übungseinheit zu bearbeiten, ist eine der folgenden Aktionen erforderlich:

� Bearbeiten der vorherigen Übungseinheit. � Ausführen der Batchdatei C:\Moc\2328A\Batches\Restore14A.cmd.

Mit dieser Befehlsdatei wird die credit-Datenbank wieder in den Zustand zurückversetzt, der für diese Übungseinheit erforderlich ist.

Weitere Informationen Sollten Sie beim Ausführen von Dateien Hilfe benötigen, suchen Sie in der Hilfe von SQL Query Analyzer nach „Ausführen einer Abfrage“.

Daneben sind die folgenden Ressourcen verfügbar:

� Das credit-Datenbankschema. � Die Microsoft SQL Server-Onlinedokumentation.

SzenarioDer Aufbau des Schulungsraumes soll die Organisation des weltweit agieren-den Handelsunternehmens Northwind Traders widerspiegeln. Das Unternehmen hat den fiktiven Domänennamen nwtraders.msft. Der primäre DNS-Server für nwtraders.msft ist der Kursleitercomputer, dessen IP-Adresse (Internetproto-koll) 192.168.x.200 lautet (wobei x die zugewiesene Schulungsraumnummer ist). Der Name des Kursleitercomputers ist London.

Die folgende Tabelle stellt den Benutzernamen, den Computernamen und die IP-Adresse für jeden Kursteilnehmercomputer in der fiktiven Domäne nwtraders.msft bereit. Suchen Sie den Ihrem Computer zugewiesenen Benutzernamen und notieren Sie ihn.

Benutzername Computername IP-Adresse

SQLAdmin1 Vancouver 192.168.x.1

SQLAdmin2 Denver 192.168.x.2

SQLAdmin3 Perth 192.168.x.3

SQLAdmin4 Brisbane 192.168.x.4

SQLAdmin5 Lisbon 192.168.x.5

SQLAdmin6 Bonn 192.168.x.6

SQLAdmin7 Lima 192.168.x.7

SQLAdmin8 Santiago 192.168.x.8

SQLAdmin9 Bangalore 192.168.x.9

SQLAdmin10 Singapore 192.168.x.10

SQLAdmin11 Casablanca 192.168.x.11

SQLAdmin12 Tunis 192.168.x.12

SQLAdmin13 Acapulco 192.168.x.13

SQLAdmin14 Miami 192.168.x.14

SQLAdmin15 Auckland 192.168.x.15

SQLAdmin16 Suva 192.168.x.16

Page 757: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 14: Analysieren von Abfragen 7

(Fortsetzung) Benutzername Computername IP-Adresse

SQLAdmin17 Stockholm 192.168.x.17

SQLAdmin18 Moscow 192.168.x.18

SQLAdmin19 Caracas 192.168.x.19

SQLAdmin20 Montevideo 192.168.x.20

SQLAdmin21 Manila 192.168.x.21

SQLAdmin22 Tokyo 192.168.x.22

SQLAdmin23 Khartoum 192.168.x.23

SQLAdmin24 Nairobi 192.168.x.24

Veranschlagte Zeit für die Übungseinheit: 60 Minuten

Page 758: Programmieren Einer Microsoft SQL Server 2000-Datenbank

8 Unterrichtseinheit 14: Analysieren von Abfragen

Übung 1 Auswerten von Abfragen mit einigen Indizes

In dieser Übung werden Sie drei Indizes für die member-Tabelle erstellen. Sie werden mit Hilfe des AND-Operators eine Abfrage ausführen, die drei Such-bedingungen enthält, und dabei die Gründe für das Erstellen des Plantyps durch den Abfrageerläutern. Sie werden außerdem die E/A-Vorgänge erklären, die zum Verarbeiten der Abfrage verwendet werden.

Sie können Abschnitte der Skriptdatei EvalQuery.sql in C:\Moc\2328A\Labfiles\L14 öffnen, überprüfen und ausführen oder die bereitgestellten Transact-SQL-Anweisungen eingeben und ausführen.

� So erstellen Sie Indizes In diesem Verfahren werden Sie alle Indizes für die member-Tabelle löschen und drei nicht gruppierte Indizes für die Spalten firstname, corp_no und member_no erstellen. 1. Melden Sie sich mit Hilfe der Informationen in der folgenden Tabelle an der

Schulungsraumdomäne nwtraders an.

Option Eingabe

Benutzername SQLAdminx (wobei x die Ihrem Computernamen zugewiesene Nummer ist, wie in der Schulungsraumdomäne nwtraders.msftfestgelegt)

Kennwort password

2. Öffnen Sie SQL Query Analyzer und melden Sie sich gegebenenfalls mit Microsoft Windows®-Authentifizierung am (lokalen) Server an. Sie verfügen über die Berechtigung, sich bei SQL Server anzumelden und SQL Server zu verwalten, da Sie als SQLAdminx angemeldet sind, und SQLAdminx ein Mitglied der lokalen Windows 2000-Gruppe Administ-ratoren ist. Alle Mitglieder dieser Gruppe werden automatisch der sysadmin-Rolle von SQL Server zugeordnet.

3. Geben Sie mit SQL Query Analyzer diese Anweisung ein, und führen Sie sie aus, um vorhandene Indizes für die member-Tabelle zu löschen: USE credit EXEC index_cleanup member

4. Geben Sie diese Anweisung ein, und führen Sie sie aus, um drei Indizes für die member-Tabelle zu erstellen: USE Credit CREATE NONCLUSTERED INDEX fname ON member(firstname) CREATE NONCLUSTERED INDEX corp_no ON member(corp_no) CREATE NONCLUSTERED INDEX mem_no ON member(member_no) GO

Die member-Tabelle enthält 10.000 eindeutige Mitglieder (Zeilen). Anmerkung

Page 759: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 14: Analysieren von Abfragen 9

� So führen Sie eine Abfrage aus, die einige Indizes verwendet In diesem Verfahren werden Sie für die Statistikoption ON festlegen, eine Ab-frage ausführen, die drei Suchbedingungen in der WHERE-Klausel enthält (wo-bei für jede Spalte, auf die in der WHERE-Klausel verwiesen wird, ein Index erstellt wird), die statistischen Informationen aufzeichnen und die Ergebnisse im Ausführungsplan beobachten. 1. Geben Sie diese Anweisung ein, und führen Sie sie aus, um für die Statistik-

option ON festzulegen: SET STATISTICS IO ON

2. Klicken Sie im Menü Abfrage auf Ausführungsplan anzeigen.3. Geben Sie diese SELECT-Anweisung ein, und führen Sie sie aus, um Daten

zu Mitgliedern abzurufen, deren Vorname mit dem Buchstaben Q beginnt, deren Personalnummer höher als 450 ist und deren Mitgliedsnummer höher als 6.000 ist: USE credit SELECT * FROM member WHERE firstname LIKE 'Q%' AND corp_no > 450 AND member_no > 6000

Diese Abfrage wird im Verlauf dieser Übung als ursprüngliche Abfrage bezeichnet.

4. Zeichnen Sie die statistischen Informationen in der folgenden Tabelle auf.

Informationen Ergebnis

Anzahl der betroffenen Zeilen 5

Scananzahl 2

Anzahl logischer Lesevorgänge 18

Anzahl und Namen der Indizes zum Verarbeiten der Abfrage

2 (fname und corp_no)

Anmerkung

Page 760: Programmieren Einer Microsoft SQL Server 2000-Datenbank

10 Unterrichtseinheit 14: Analysieren von Abfragen

5. Klicken Sie auf die Registerkarte Ausführungsplan, um den Ausführungs-plan grafisch anzuzeigen.

6. Untersuchen Sie den Ausführungsplan. Er ähnelt der folgenden Abbildung. Beachten Sie die im Ausführungsplan verwendeten Vorgänge. In dieser Übung werden Sie den Ausführungsplan analysieren, um die verwendete Anzahl der E/A-Vorgänge und die Gründe für die Auswahl dieses Aus-führungsplanes zu erklären.

Bookmark LookupKosten: 66%

Hash Match/Inne…Kosten: 22%

FilterKosten:8%

member.fnameKosten: 7%

FilterKosten: 0%

member.corp_noKosten: 6%

SelectKosten:0%

� So erklären Sie die zum Verarbeiten der ursprünglichen Abfrage verwendeten E/A-Vorgänge

In diesem Verfahren werden Sie die ursprüngliche Abfrage als drei SELECT-Anweisungen neu schreiben, um die 18 E/A-Vorgänge der ursprüngliche Ab-frage zu verstehen und zu erklären. Jede Anweisung stellt eine Suchbedingung der WHERE-Klausel dar, die die Suche beschränkt. Für jede Anweisung wer-den Sie statistische Informationen aufzeichnen und die Anzahl von E/A-Vor-gängen zum Verarbeiten der Abfrage erklären. 1. Geben Sie die SELECT-Anweisung ein, mit der nur die erste Suchbedin-

gung der WHERE-Klausel in die ursprüngliche Abfrage eingeschlossen wird, und führen Sie diese Anweisung aus: USE credit SELECT firstname FROM member WHERE firstname LIKE 'Q%'

2. Zeichnen Sie die statistischen Informationen in der folgenden Tabelle auf.

Informationen Ergebnis

Anzahl der betroffenen Zeilen 411

Scananzahl 1

Anzahl logischer Lesevorgänge 3

Anzahl und Namen der Indizes zum Verarbeiten der Abfrage 1 (fname)

Wird die Abfrage von einem Index abgedeckt? Ja

Page 761: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 14: Analysieren von Abfragen 11

3. Geben Sie die SELECT-Anweisung ein, mit der nur die zweite Such-bedingung der WHERE-Klausel in die ursprüngliche Abfrage einge-schlossen wird, und führen Sie diese Anweisung aus: USE credit SELECT corp_no FROM member WHERE corp_no > 450

4. Zeichnen Sie die statistischen Informationen in der folgenden Tabelle auf.

Informationen Ergebnis

Anzahl der betroffenen Zeilen 303

Scananzahl 1

Anzahl logischer Lesevorgänge 3

Anzahl und Namen der Indizes zum Verarbeiten der Abfrage 1 (corp_no)

Wird die Abfrage von einem Index abgedeckt? Ja

5. Geben Sie die SELECT-Anweisung ein, mit der nur die dritte Suchbedin-gung der WHERE-Klausel in die ursprüngliche Abfrage eingeschlossen wird, und führen Sie diese Anweisung aus: USE credit SELECT member_no FROM member WHERE member_no > 6000

6. Zeichnen Sie die statistischen Informationen in der folgenden Tabelle auf.

Informationen Ergebnis

Anzahl der betroffenen Zeilen 4000

Scananzahl 1

Anzahl logischer Lesevorgänge 9

Anzahl und Namen der Indizes zum Verarbeiten der Abfrage 1 (mem_no)

Wird die Abfrage von einem Index abgedeckt? Ja

Page 762: Programmieren Einer Microsoft SQL Server 2000-Datenbank

12 Unterrichtseinheit 14: Analysieren von Abfragen

7. Vergleichen Sie die statistischen Informationen der ursprünglichen Abfrage mit dem Breakdown jeder Suchbedingung der Abfrage. USE credit SELECT *FROM member WHERE firstname LIKE 'Q%' AND corp_no > 450 AND member_no > 6000

Informationen

Ergebnis der ursprünglichen Abfrage

Ergebnis der Abfrage mit der ersten Such-bedingung

Ergebnis der Abfrage mit der zweiten Such-bedingung

Ergebnis der Abfrage mit der dritten Such-bedingung

Anzahl der betroffenen Zeilen

5 411 303 4000

Scananzahl 2 1 1 1

Anzahl logischer Lesevorgänge

18 3 3 9

Anzahl und Name der Indizes zum Verarbeiten der Abfrage

2 (fname und corp_no)

1 (fname) 1 (corp_no) 1 (mem_no)

Die statistischen Informationen können von denen in der Tabelle abweichen.

Warum wurden von den drei einzelnen Abfragen so wenige E/A-Vorgänge verwendet? Die Anzahl der E/A-Vorgänge wurde reduziert, da jede Abfrage den Index abdecken konnte. Ausschließliches Lesen der Indexseiten auf Blattebene und nicht der Datenseiten reduziert die Anzahl der E/A-Vorgänge. ____________________________________________________________

____________________________________________________________

____________________________________________________________

Warum hat der Abfrageoptimierer in der ursprünglichen Abfrage den Index für die member_no-Spalte nicht verwendet? Da die Suchbedingung „WHERE member_no > 6000“ eine geringe Selektivität aufweist. Die Abfrage gibt 4.000 von 10.000 Zeilen zurück. Im Vergleich zu anderen Suchbedingungen in der WHERE-Klausel beschränkt diese WHERE-Klausel die Suche nicht. ____________________________________________________________

____________________________________________________________

____________________________________________________________

____________________________________________________________

Ursprüngliche Abfrage

Anmerkung

Page 763: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 14: Analysieren von Abfragen 13

� So lernen Sie den Ausführungsplan kennen, indem Sie Such-bedingungen kombinieren

In diesem Verfahren werden Sie die ursprüngliche Abfrage neu schreiben, in-dem Sie die Suchbedingungen der WHERE-Klausel kombinieren, die der Ab-frageoptimierer im Ausführungsplan verwendet. Sie werden die statistischen Informationen aufzeichnen und den Ausführungsplan auswerten, um die Anzahl der E/A-Vorgänge zu erklären. 1. Geben Sie die SELECT-Anweisung ein, mit der die erste und die zweite

Suchbedingung der WHERE-Klausel in die ursprüngliche Abfrage einge-schlossen wird, und führen Sie die Anweisung aus. USE credit SELECT firstname FROM member WHERE firstname LIKE 'Q%' AND corp_no > 450

2. Zeichnen Sie die statistischen Informationen in der folgenden Tabelle auf.

Informationen Ergebnis

Anzahl der betroffenen Zeilen 12

Scananzahl 2

Anzahl logischer Lesevorgänge 6

Anzahl und Name der Indizes zum Verarbeiten der Abfrage 2 (fname undcorp_no)

Wird die Abfrage von einem Index abgedeckt? Ja

Beachten Sie, dass der Abfrageoptimierer beim Ausführen der Abfrage für jede Suchbedingung einen Index verwendet.

Page 764: Programmieren Einer Microsoft SQL Server 2000-Datenbank

14 Unterrichtseinheit 14: Analysieren von Abfragen

3. Vergleichen Sie die statistischen Informationen der ursprünglichen Abfrage mit der Abfrage, die die erste und die zweite Suchbedingung enthält. USE credit SELECT * FROM member WHERE firstname LIKE 'Q%' AND corp_no > 450 AND member_no > 6000

Informationen

Ergebnis der ursprünglichen Abfrage

Ergebnis der Abfrage mit der ersten und der zweiten Such-bedingung

Anzahl der betroffenen Zeilen

5 12

Scananzahl 2 2

Anzahl logischer Lesevorgänge

18 6

Anzahl und Name der Indizes zum Ver-arbeiten der Abfrage

2 (fname und corp_no)

2 (fname und corp_no)

Die statistischen Informationen können von denen in der Tabelle abweichen.

4. Klicken Sie auf die Registerkarte Ausführungsplan, um den Ausführungs-plan grafisch anzuzeigen.

5. Untersuchen Sie den Ausführungsplan. Warum weisen beide Abfragen die Scananzahl 2 auf? Beide Abfragen verwenden zwei Indizes. Der Abfrageoptimierer ver-wendet einen Index zur Zeit. Im ersten Durchgang verwendet der Abfrageoptimierer den Index für die „firstname“-Spalte der „member“-Tabelle und führt automatisch eine abgedeckte Abfrage durch. Die Abfrage ist abgedeckt, da nur die Schlüsselwerte (ein Scan und drei E/A-Vorgänge) erforderliche Informationen darstellen. Im zweiten Durchgang (Scananzahl 2) verwendet der Abfrageoptimie-rer den Index für die „corp_no“-Spalte der „member“-Tabelle und deckt die Abfrage automatisch ab. Für den Abfrageoptimierer sind nur drei E/A-Vorgänge zum Suchen in jedem Index erforderlich. Für das Suchen in zwei Indizes ergeben sich insgesamt sechs E/A-Vorgänge. ____________________________________________________________

____________________________________________________________

____________________________________________________________

____________________________________________________________

____________________________________________________________

____________________________________________________________

Ursprüngliche Abfrage

Anmerkung

Page 765: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 14: Analysieren von Abfragen 15

Übung 2 Auswerten von Abfragen mit allen Indizes

In dieser Übung werden Sie Abfragen mit dem AND-Operator für die member-Tabelle durchführen und die statistischen Informationen aufzeichnen. Die in dieser Übung verwendete Abfrage gleicht der in Übung 1 verwendeten Abfrage. Es wurde jedoch eine Suchbedingung von member_no > 6500 zu member_no > 8000 geändert. Es sind die gleichen nicht gruppierten Indizes für die member-Tabelle vorhanden, die für die firstname-, corp_no- und member_no-Spalten definiert wurden.

Sie werden außerdem die Indizierungsstrategie ändern, um zu zeigen, wie ver-schiedene Indizes die E/A-Vorgänge bei einer Abfrage reduzieren können.

Sie können Abschnitte der Skriptdatei EvalQueryIndex.sql in C:\Moc\2328A\Labfiles\L14 öffnen, überprüfen und ausführen oder Ihre eigenen Transact-SQL-Anweisungen eingeben und ausführen.

� So führen Sie eine Abfrage aus, die alle Indizes verwendet In diesem Verfahren werden Sie für die Statistikoption ON festlegen, eine Ab-frage ausführen, die statistischen Informationen aufzeichnen und die Ergebnisse des Ausführungsplanes beobachten. 1. Geben Sie diese SELECT-Anweisung ein, und führen Sie sie aus, um Daten

zu Mitgliedern abzurufen, deren Vorname mit dem Buchstaben Q beginnt, deren Personalnummer größer als 450 ist und deren Mitgliedsnummer größer als 8.000 ist. USE credit SET STATISTICS IO ON SELECT * FROM member WHERE firstname LIKE 'Q%' AND corp_no > 450 AND member_no > 8000

Diese Abfrage wird im Verlauf dieser Übung als ursprüngliche Abfrage bezeichnet.

2. Zeichnen Sie die statistischen Informationen in der folgenden Tabelle auf.

Informationen Ergebnis

Anzahl der betroffenen Zeilen 1

Scananzahl 3

Anzahl logischer Lesevorgänge 13

Anzahl und Name der Indizes zum Verarbeiten der Abfrage

3 (fname, corp_nound mem_no)

3. Klicken Sie auf die Registerkarte Ausführungsplan, um den Ausführungs-plan grafisch anzuzeigen.

Anmerkung

Page 766: Programmieren Einer Microsoft SQL Server 2000-Datenbank

16 Unterrichtseinheit 14: Analysieren von Abfragen

4. Untersuchen Sie den Ausführungsplan. Er ähnelt der folgenden Abbildung. Beachten Sie die im Ausführungsplan verwendeten Vorgänge. In dieser Übung werden Sie den Ausführungsplan analysieren, um die verwendete Anzahl der E/A-Vorgänge und die Gründe für die Auswahl dieses Aus-führungsplanes zu erklären.

Bookmark LookupKosten: 11%

Hash Match Team…Kosten: 0%

member.fnameKosten: 78%

member.corp_noKosten: 67%

SelectKosten: 0%

Hash Match Root…Kosten: 44%

member.mem_noKosten: 11%

Verwendet der Abfrageoptimierer den Index für die member_no-Spalte? Begründung? Ja. Die Suchbedingung „member_no > 8000“ ist sehr selektiv. ____________________________________________________________

____________________________________________________________

5. Vergleichen Sie die ursprüngliche Abfrage dieser Übung mit der ursprüng-lichen Abfrage aus Übung 1. USE credit SELECT * FROM member WHERE firstname LIKE 'Q%' AND corp_no > 450 AND member_no > 8000

USE credit SELECT * FROM member WHERE firstname LIKE 'Q%' AND corp_no > 450 AND member_no > 6000

Warum verwendet die ursprüngliche Abfrage dieser Übung den Index, der für die member_no-Spalte definiert wurde, und die ursprüngliche Abfrage aus Übung 1 nicht? Die Suchbedingung „member_no > 6000“ weist eine geringe Selektivität auf. Die Abfrage gibt 4.000 von 10.000 Zeilen zurück. Die Such-bedingung „member_no > 8000“ weist eine hohe Selektivität auf und gibt 2000 von 10.000 Zeilen zurück. ____________________________________________________________

____________________________________________________________

Ursprüngliche Abfrage

Ursprüngliche Abfrage (Übung1)

Page 767: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 14: Analysieren von Abfragen 17

� So erklären Sie die zum Verarbeiten der ursprünglichen Abfrage verwendeten E/A-Vorgänge

In diesem Verfahren werden Sie die ursprüngliche Abfrage als drei SELECT-Anweisungen neu schreiben. Jede Anweisung stellt eine Suchbedingung der WHERE-Klausel dar, die die Suche beschränkt. Sie werden für jede Anweisung statistische Informationen aufzeichnen. Dann werden Sie diese Informationen verwenden, um zu erläutern, warum der Abfrageoptimierer einen bestimmten Ausführungsplan auswählt, und um die Anzahl der E/A-Vorgänge zu erklären. 1. Geben Sie die SELECT-Anweisung ein, mit der nur die erste Such-

bedingung der WHERE-Klausel in die ursprüngliche Abfrage einge-schlossen wird, und führen Sie die Anweisung aus. USE credit SELECT firstname FROM member WHERE firstname LIKE 'Q%'

2. Zeichnen Sie die statistischen Informationen in der folgenden Tabelle auf.

Informationen Ergebnis

Anzahl der betroffenen Zeilen 411

Scananzahl 1

Anzahl logischer Lesevorgänge 3

Anzahl und Name der Indizes zum Verarbeiten der Abfrage 1 (fname)

Wird die Abfrage von einem Index abgedeckt? Ja

3. Geben Sie die SELECT-Anweisung ein, mit der nur die zweite Such-bedingung der WHERE-Klausel in die ursprüngliche Abfrage einge-schlossen wird, und führen Sie die Anweisung aus. USE credit SELECT corp_no FROM member WHERE corp_no > 450

4. Zeichnen Sie die statistischen Informationen in der folgenden Tabelle auf.

Informationen Ergebnis

Anzahl der betroffenen Zeilen 303

Scananzahl 1

Anzahl logischer Lesevorgänge 3

Anzahl und Name der Indizes zum Verarbeiten der Abfrage 1 (corp_no)

Wird die Abfrage von einem Index abgedeckt? Ja

5. Geben Sie die SELECT-Anweisung ein, mit der nur die dritte Such-bedingung der WHERE-Klausel in die ursprüngliche Abfrage einge-schlossen wird, und führen Sie die Anweisung aus. USE credit SELECT member_no FROM member WHERE member_no > 8000

Page 768: Programmieren Einer Microsoft SQL Server 2000-Datenbank

18 Unterrichtseinheit 14: Analysieren von Abfragen

6. Zeichnen Sie die statistischen Informationen in der folgenden Tabelle auf.

Informationen Ergebnis

Anzahl der betroffenen Zeilen 2000

Scananzahl 1

Anzahl logischer Lesevorgänge 6

Anzahl und Name der Indizes zum Verarbeiten der Abfrage 1 (mem_no)

Wird die Abfrage von einem Index abgedeckt? Ja

7. Vergleichen Sie die statistischen Informationen der ursprünglichen Abfrage mit dem Breakdown jeder Suchbedingung der Abfrage. USE credit SELECT * FROM member WHERE firstname LIKE 'Q%' AND corp_no > 450 AND member_no > 8000

Informationen

Ergebnis der ursprüng-lichen Abfrage

Ergebnis der Abfrage mit der ersten Such-bedingung

Ergebnis der Abfrage mit der zweiten Such-bedingung

Ergebnis der Abfrage mit der dritten Such-bedingung

Anzahl der betroffenen Zeilen 1 411 303 2000

Scananzahl 3 1 1 1

Anzahl logischer Lese-vorgänge

13 3 3 3

Anzahl und Name der Indizes zum Verarbeiten der Abfrage

3 (fname,corp_no und mem_no)

1 (fname) 1 (corp_no) 1 (mem_no)

Die statistischen Informationen können von denen in der Tabelle abweichen.

8. Klicken Sie auf die Registerkarte Ausführungsplan, um den Ausführungs-plan grafisch anzuzeigen.

9. Untersuchen Sie den Ausführungsplan für die ursprüngliche Abfrage. Wie erklären Sie die dreizehn E/A-Vorgänge in der ursprünglichen Abfrage? Der Abfrageoptimierer verwendet drei Indizes. Für jeden Index sind drei E/A-Vorgänge erforderlich. Drei E/A-Vorgänge multipliziert mit drei E/A-Vorgängen ergibt neun E/A-Vorgänge. Die verbleibenden E/A-Vorgänge werden für „Bookmark Lookup“, „Hash Match Root/Inner Join“ und „Hash Match Team/Inner Join“ verwendet. Dies ergibt insgesamt dreizehn E/A-Vorgänge. ____________________________________________________________

____________________________________________________________

____________________________________________________________

____________________________________________________________

Ursprüngliche Abfrage

Anmerkung

Page 769: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 14: Analysieren von Abfragen 19

� So führen Sie eine Abfrage für eine Tabelle mit einem gruppierten Index aus

In diesem Verfahren werden Sie den nicht gruppierten Index für die member.member_no-Spalte löschen und einen gruppierten Index für die member.member_no-Spalte erstellen. Nach dem Erstellen des Indexes werden Sie die ursprüngliche Abfrage ausführen und die Änderungen im Ausführungs-plan und der Seiten-E/A beobachten. 1. Geben Sie die Anweisung ein, und führen Sie sie aus, um den nicht grup-

pierten Index für die member.member_no-Spalte zu löschen und einen gruppierten Index zu erstellen. USE credit DROP INDEX member.mem_no GOCREATE CLUSTERED INDEX mem_no_CL ON member(member_no) GO

Es sind zwei nicht gruppierte Indizes vorhanden: Einer wurde für die corp_no-Spalte definiert, und der andere wurde für die firstname-Spalte definiert.

2. Geben Sie die ursprüngliche Abfrage für die member-Tabelle mit einem gruppierten Index für die member_no-Spalte ein, und führen Sie die Abfrage aus. USE credit SELECT * FROM member WHERE firstname LIKE 'Q%' AND corp_no > 450 AND member_no > 8000

3. Zeichnen Sie die statistischen Informationen in der folgenden Tabelle auf.

Informationen Ergebnis

Anzahl der betroffenen Zeilen 1

Scananzahl 1

Anzahl logischer Lesevorgänge 31

Anzahl und Name der Indizes zum Verarbeiten der Abfrage 1 (mem_no)

Wird die Abfrage von einem Index abgedeckt? Nein

Anmerkung

Page 770: Programmieren Einer Microsoft SQL Server 2000-Datenbank

20 Unterrichtseinheit 14: Analysieren von Abfragen

4. Vergleichen Sie die statistischen Informationen der Abfrage für eine Tabelle mit einem gruppierten Index für die member_no-Spalte mit der Abfrage für eine Tabelle mit einem nicht gruppierten Index für die member_no-Spalte.

Informationen

Ergebnis der Abfrage (gruppierter Index für „member_no“)

Ergebnis der Abfrage (nicht gruppierter Index für „member_no“)

Anzahl der betroffenen Zeilen

1 1

Scananzahl 1 3

Anzahl logischer Lesevorgänge

31 13

Anzahl und Name der Indizes zum Verarbeiten der Abfrage

1 (mem_no) 3 (fname, corp_no und mem_no)

Die statistischen Informationen können von denen in der Tabelle abweichen.

5. Klicken Sie auf die Registerkarte Ausführungsplan, um den Ausführungs-plan grafisch anzuzeigen.

6. Untersuchen Sie den Ausführungsplan. Hat sich die Abfrageleistung durch einen gruppierten Index für member_no-Spalte verbessert? Begründung? Ja. Für die Abfrage mit dem gruppierten Index für die „member_no“-Spalte sind 31 E/A-Vorgänge, ein Scan und weniger Schritte im Ausführungsplan erforderlich. ____________________________________________________________

____________________________________________________________

Warum verwendet der Abfrageoptimierer den gruppierten Index für die member_no-Spalte? Der Abfrageoptimierer wählt normalerweise einen gruppierten Index aus, wenn die Abfrage nicht durch einen Index abgedeckt ist. Der Abfrageoptimierer verwendet einen gruppierten Index, da die Zeilen sortiert sind und es beim Verarbeiten von Abfragen, die Datenbereiche angeben, effizienter ist. Mit Hilfe des gruppierten Indexes für „member_no“ liest SQL Server alle 2000 Zeilen. Dafür sind neun E/A-Vorgänge erforderlich. Zeilen, die die Suchbedingungen nicht erfüllen, werden beim Lesen des Mitgliedsnummernbereichs entfernt. ____________________________________________________________

____________________________________________________________

____________________________________________________________

____________________________________________________________

Anmerkung

Page 771: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 14: Analysieren von Abfragen 21

Übung 3 Auswerten von Abfragen mit dem IN-Schlüsselwort

In dieser Übung werden Sie einen Index für die member-Tabelle erstellen, die Leistung von Abfragen mit dem IN-Schlüsselwort beobachten und beobachten, wie sich der Ausführungsplan mit der Vergrößerung der Werteliste ändert. Je länger die Liste, desto weniger effizient ist die Abfrage.

Sie können Abschnitte der Skriptdatei EvalQueryIN.sql in C:\Moc\2328A\Labfiles\L14 öffnen, überprüfen und ausführen oder die bereitgestellten Transact-SQL-Anweisungen eingeben und ausführen.

� So führen Sie eine Abfrage aus, die ein IN-Schlüsselwort enthält In diesem Verfahren werden Sie vorhandene Indizes für die member-Tabelle löschen, einen Index erstellen, eine Abfrage ausführen, statistische Informa-tionen aufzeichnen und den Ausführungsplan untersuchen. 1. Geben Sie diese Anweisung ein, und führen Sie sie aus, um vorhandene

Indizes für die member-Tabelle zu löschen: USE credit EXEC index_cleanup member

2. Geben Sie diese Anweisung ein und führen Sie sie aus, um einen ein-deutigen, nicht gruppierten Index für die member_no-Spalte der member-Tabelle zu erstellen: USE credit CREATE UNIQUE nonclustered INDEX mbr_mem_no ON member(member_no) GO

3. Geben Sie diese Anweisung ein, und führen Sie sie aus, um für die Statistik-option ON festzulegen: SET STATISTICS IO ON

4. Geben Sie diese SELECT-Anweisung ein, und führen Sie sie aus, um alle Daten für bestimmte Mitgliedsnummern abzurufen: USE credit SELECT * FROM member WHERE member_no IN (100,101,102,103,104,105,106,107,108,109,200,201, 202,203,204,205,206,207,208,209,210,211,212,213, 214,215,216,217,218,219,220,221,222,223,224,225, 226,227,228,229,230,231,232)

5. Zeichnen Sie die statistischen Informationen in der folgenden Tabelle auf.

Informationen Ergebnis

Anzahl der betroffenen Zeilen 43

Scananzahl 43

Anzahl logischer Lesevorgänge 129

Anzahl und Name der Indizes zum Verarbeiten der Abfrage 1 (mbr_mem_no)

Wird die Abfrage von einem Index abgedeckt? Ja

Page 772: Programmieren Einer Microsoft SQL Server 2000-Datenbank

22 Unterrichtseinheit 14: Analysieren von Abfragen

6. Klicken Sie auf die Registerkarte Ausführungsplan, um den Ausführungs-plan grafisch anzuzeigen.

7. Untersuchen Sie den Ausführungsplan. Er ähnelt der folgenden Abbildung. Beachten Sie die im Ausführungsplan verwendeten Vorgänge. In dieser Übung werden Sie den Ausführungsplan analysieren, um die verwendete Anzahl der E/A-Vorgänge und die Gründe für die Auswahl dieses Ausfüh-rungsplanes zu erklären.

Bookmark LookupKosten: 91%

member.mbr_mem...Kosten: 0%

SELECTKosten: 9%

Durch Bookmark Lookup lassen sich 43 der 129 E/A-Vorgänge erklären. Wie erklären Sie die übrigen 86 E/A-Vorgänge?

STATISTICS I/O zeigt eine Scananzahl von 43.

Die übrigen 86 E/A-Vorgänge ergeben sich aus dem Lesen (Scananzahl) der Tabelle. Dies wird für jeden Wert in der Werteliste für die Abfrage einmal vorgenommen. Die Werteliste für die Abfrage enthält 43 Werte. Der Abfrageoptimierer verwendet den nicht gruppierten Index, um nach jedem Wert zu suchen. Um den notwendigen Wert zu erhalten, liest der Abfrageoptimierer die Stammseite. Dann liest der Abfrage-optimierer eine Seite auf Blattebene, um die Zeilen-ID (Row Identifier, RID) zu erhalten (deckt den Index ab). Für jede der 43 Zeilen sind zwei E/A-Vorgänge erforderlich. Dies ergibt 86 E/A-Vorgänge. Durch das Verwenden einer RID zum Abrufen von Daten, ist genau ein E/A-Vorgang pro Zeile erforderlich. Für zwölf Zeilen ergeben sich 43 E/A-Vorgänge. 43 + 86 = 129 E/A-Vorgänge. ____________________________________________________________

____________________________________________________________

____________________________________________________________

____________________________________________________________

____________________________________________________________

Wenn die Abfrage so geändert werden würde, dass sie einen Index ver-wendet, der die Abfrage abdeckt, welcher Schritt des Ausführungsplanes würde dann wegfallen? Begründung? Der Schritt Bookmark Lookup würde wegfallen, da die Abfrage nur den ersten Schritt des Ausführungsplanes verarbeiten müsste und nur die Daten der „member_no“-Spalte auswählen müsste. ____________________________________________________________

____________________________________________________________

____________________________________________________________

Tipp

Page 773: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 14: Analysieren von Abfragen 23

Wie würde die gesamte Seiten-E/A für diese Abfrage lauten, die von einem Index abgedeckt wird?

43 Seiten-E/A. Durch das Wegfallen des Schrittes Bookmark Lookup fallen 43 E/A-Vorgänge weg. 129 - 43 = 86 E/A. ____________________________________________________________

____________________________________________________________

� So zeigen Sie, wann eine Abfrage mit einer Werteliste ineffizient wird. In diesem Verfahren werden Sie eine Abfrage ausführen, die statistischen Infor-mationen aufzeichnen und den Ausführungsplan mit dem der vorherigen Ab-frage vergleichen. Die Abfrage in diesem Verfahren ähnelt der vorherigen Ab-frage, jedoch schließt die IN-Liste einen zusätzlichen Wert ein. Durch den zu-sätzlichen Wert in der Abfrage verarbeitet der Abfrageoptimierer die Abfrage anders.1. Geben Sie diese SELECT-Anweisung ein, und führen Sie sie aus, um be-

stimmte Mitgliedsnummern abzurufen. Beachten Sie, dass diese Abfrage von der ursprünglichen Abfrage abweicht. Die IN-Liste enthält jetzt 44 Werte. USE credit SELECT * FROM member WHERE member_no IN (100,101,102,103,104,105,106,107,108,109,200,201,202, 203,204,205,206,207,208,209,210,211,212,213,214,215, 216,217,218,219,220,221,222,223,224,225,226,227,228, 229,230,231,232,233)

2. Zeichnen Sie die statistischen Informationen in der folgenden Tabelle auf.

Informationen Ergebnis

Anzahl der betroffenen Zeilen 44

Scananzahl 1

Anzahl logischer Lesevorgänge 147

Anzahl und Name der Indizes zum Verarbeiten der Abfrage Keine

Wird die Abfrage von einem Index abgedeckt? Nein

3. Vergleichen Sie die statistischen Informationen für diese Abfrage mit den statistischen Informationen der vorherigen Abfrage. USE credit SELECT * FROM member WHERE member_no IN (100,101,102,103,104,105,106,107,108,109,200,201, 202,203,204,205,206,207,208,209,210,211,212,213, 214,215,216,217,218,219,220,221,222,223,224,225, 226,227,228,229,230,231,232)

Vorherige Abfrage

Page 774: Programmieren Einer Microsoft SQL Server 2000-Datenbank

24 Unterrichtseinheit 14: Analysieren von Abfragen

USE credit SELECT * FROM member WHERE member_no IN (100,101,102,103,104,105,106,107,108,109,200,201,202, 203,204,205,206,207,208,209,210,211,212,213,214,215, 216,217,218,219,220,221,222,223,224,225,226,227,228, 229,230,231,232,233)

Informationen Ergebnis der vorherigen Abfrage

Ergebnis der Abfrage mit zusätzlichem Wert

Anzahl der betroffenen Zeilen 43 44

Scananzahl 43 1

Anzahl logischer Lesevorgänge

129 147

Anzahl und Name der Indizes zum Verarbeiten der Abfrage

Ja (mem_no) Keine

4. Klicken Sie auf die Registerkarte Ausführungsplan, um den Ausführungs-plan grafisch anzuzeigen.

5. Untersuchen Sie den Ausführungsplan. Warum hat der Abfrageoptimierer für die Abfrage mit dem zusätzlichen Wert (233) in der Werteliste einen anderen Ausführungsplan verwendet? Mit dem Vergrößern der Werteliste verarbeitet der Abfrageoptimierer die Abfrage anders. Ein neuer Ausführungsplan wird verwendet, um mehr Werte effizienter zu verarbeiten ____________________________________________________________

____________________________________________________________

____________________________________________________________

____________________________________________________________

Beschreiben Sie den Ausführungsplan für die Abfrage mit dem zusätzlichen Wert (233). Der Ausführungsplan erstellt zuerst eine interne Tabelle, um die Liste der Werte zu speichern, die sortiert sind („Constant Scan“). Die interne Tabelle wird dann mit Hilfe einer Hashverknüpfung mit der Liste der Schlüsselwerte verknüpft, die mit Hilfe eines Tabellenscans abgerufen wurden. Für diesen Ausführungsplan sind mehr E/A-Vorgänge erfor-derlich, um die Verknüpfung zwischen der internen Tabelle und der „member“-Tabelle zu verarbeiten. ____________________________________________________________

____________________________________________________________

____________________________________________________________

____________________________________________________________

Abfrage mit zusätzlichem Wert

Page 775: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 14: Analysieren von Abfragen 25

Übung 4 Auswerten von Abfragen mit geschachtelten SELECT-Anweisungen

In dieser Übung werden Sie die Leistung von Abfragen mit geschachtelten SELECT-Anweisungen beobachten. Sie werden den Ausführungsplan einer Abfrage untersuchen, die eine Werteliste zurückgibt, die Anzahl der E/A-Vor-gänge erklären und erläutern, warum der Abfrageoptimierer den speziellen Aus-führungsplan ausgewählt hat.

Sie können Abschnitte der Skriptdatei EvalQueryNested.sql in C:\Moc\2328A\Labfiles\L14 öffnen, überprüfen und ausführen oder die bereitgestellten Transact-SQL-Anweisungen eingeben und ausführen.

� So führen Sie eine Abfrage mit einer geschachtelten SELECT-Anweisung aus

In diesem Verfahren werden Sie eine Abfrage mit einer geschachtelten SELECT-Anweisung ausführen, die eine Werteliste zurückgibt, und die statistischen Informationen aufzeichnen. 1. Geben Sie diese SELECT-Anweisung ein und führen Sie sie aus, um

Mitgliedsdaten zu Mitgliedern abzurufen, deren Mitgliedsnummern zwischen 100 und 111 liegen: USE credit SELECT * FROM member WHERE member_no IN (SELECT member_no FROM member WHERE member_no BETWEEN 100 AND 111)

Diese Abfrage wird im Verlauf dieser Übung als ursprüngliche Abfrage bezeichnet.

2. Zeichnen Sie die statistischen Informationen in der folgenden Tabelle auf.

Informationen Ergebnis

Anzahl der betroffenen Zeilen 12

Scananzahl 13

Anzahl logischer Lesevorgänge 44

Anzahl und Name der Indizes zum Verarbeiten der Abfrage 1 (mbr_mem_no)

Anmerkung

Page 776: Programmieren Einer Microsoft SQL Server 2000-Datenbank

26 Unterrichtseinheit 14: Analysieren von Abfragen

� So erklären Sie die zum Verarbeiten der ursprünglichen Abfrage verwendeten E/A-Vorgänge

In diesem Verfahren werden Sie die ursprüngliche Abfrage als zwei SELECT-Anweisungen neu schreiben. Jede Anweisung steht für einen Schritt im Aus-führungsplan. Zu jeder Anweisung werden Sie statistische Informationen auf-zeichnen, um zu erläutern, warum der Abfrageoptimierer einen bestimmten Ausführungsplan ausgewählt hat, und dann werden Sie die Anzahl der E/A-Vorgänge erklären. 1. Geben Sie diese SELECT-Anweisung ein, und führen Sie sie aus, um Mit-

gliedsnummern zwischen 100 und 111 abzurufen: USE credit SELECT member_no FROM member WHERE member_no BETWEEN 100 AND 111

In der ursprünglichen Abfrage ist die SELECT-Anweisung der erste Schritt des Ausführungsplanes.

2. Zeichnen Sie die statistischen Informationen in der folgenden Tabelle auf.

Informationen Ergebnis

Anzahl der betroffenen Zeilen 12

Scananzahl 1

Anzahl logischer Lesevorgänge 2

Wurde ein Index zum Verarbeiten dieser Abfrage verwendet? Wird diese Abfrage von einem Index abgedeckt? Begründung? Ja („member_no“). Ja, diese Abfrage wird von einem Index abgedeckt, da die gesamten Daten im Index vorhanden sind. ____________________________________________________________

____________________________________________________________

3. Geben Sie diese SELECT-Anweisung ein, und führen Sie sie aus, um be-stimmte Mitgliedsnummern abzurufen. USE credit SELECT member_no FROM member WHERE member_no IN (100,101,102,103,104,105,106,107,108,109,110,111)

In der ursprünglichen Abfrage ist die SELECT-Anweisung der zweite Schritt des Ausführungsplanes.

Anmerkung

Anmerkung

Page 777: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 14: Analysieren von Abfragen 27

4. Zeichnen Sie die statistischen Informationen in der folgenden Tabelle auf.

Informationen Ergebnis

Anzahl der betroffenen Zeilen 12

Scananzahl 12

Anzahl logischer Lesevorgänge 24

Wurde ein Index zum Verarbeiten dieser Abfrage verwendet? Wird diese Abfrage von einem Index abgedeckt? Ja („member_no“). Ja, diese Abfrage wird von einem Index abgedeckt, da die gesamten Daten im Index vorhanden sind. ____________________________________________________________

____________________________________________________________

5. Vergleichen Sie die statistischen Informationen der ursprünglichen Abfrage mit dem Breakdown von jedem Schritt des Ausführungsplanes. USE credit SELECT * FROM member WHERE member_no IN (SELECT member_no FROM member WHERE member_no BETWEEN 100 AND 111)

USE credit SELECT member_no FROM member WHERE member_no BETWEEN 100 AND 111

USE credit SELECT member_no FROM member WHERE member_no IN (100,101,102,103,104,105,106,107,108,109,110,111)

Informationen Ergebnis der ursprünglichen Abfrage

Ergebnis der Abfrage (erster Schritt des Ausführungsplanes)

Ergebnis der Abfrage (zweiter Schritt des Ausführungsplanes)

Anzahl der betroffenen Zeilen

12 12 12

Scananzahl 13 1 12

Anzahl logischer Lesevorgänge

44 2 24

Die statistischen Informationen können von denen in der Tabelle abweichen.

6. Klicken Sie auf die Registerkarte Ausführungsplan, um den Ausführungs-plan grafisch anzuzeigen.

Ursprüngliche Abfrage

Abfrage zum ersten Schritt

Abfrage zum zweiten Schritt

Anmerkung

Page 778: Programmieren Einer Microsoft SQL Server 2000-Datenbank

28 Unterrichtseinheit 14: Analysieren von Abfragen

7. Führen Sie die ursprüngliche Abfrage aus, und untersuchen Sie den Aus-führungsplan. Erläutern Sie, warum der Abfrageoptimierer in der ersten Abfrage diesen Plan erstellt hat, und geben Sie an, wie viele E/A-Vorgänge für jeden Schritt im Ausführungsplan verwendet wurden. Der Abfrageoptimierer verarbeitet zuerst die geschachtelte SELECT-Anweisung, indem der Wertebereich auf Blattebene des nicht gruppier-ten Indexes gelesen wird (ein Index deckt diese Abfrage ab). Dazu sind nur zwei E/A-Vorgänge erforderlich, und es werden zwölf Werte zu-rückgegeben (nicht die Zeile). Dadurch wird ein Scan generiert. Dann werden alle zwölf Werte gleichzeitig verarbeitet. Für jeden Wert sind zwei E/A-Vorgänge erforderlich, ein Vorgang zum Lesen der Stammseite und der andere zum Lesen der Seite auf Blattebene. Dies ergibt insgesamt 24 E/A-Vorgänge. In diesem Schritt wird ein Index verwendet, der die Abfrage abdeckt. Dadurch werden zwölf Scans generiert. Dies ergibt insgesamt 13 Scans (1 + 12 = 13). Die Verknüpfungsoperation verknüpft diese Ergebnisse und erzeugt so zwölf Zeilen Im letzten Schritt wird ein Bookmark Lookup ausgeführt, bei dem für jeden der zwölf Werte ein E/A-Vorgang erforderlich ist. Insgesamt werden in diesem Ausführungsplan 2 +24 + 12 = 38 E/A-Vor-gänge verwendet. Durch die sechs E/A-Vorgänge der Verknüpfungs-operation ergeben sich insgesamt 44 E/A-Vorgänge. ____________________________________________________________

____________________________________________________________

____________________________________________________________

____________________________________________________________

____________________________________________________________

____________________________________________________________

____________________________________________________________

____________________________________________________________

Page 779: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 14: Analysieren von Abfragen 29

Übung 5 Auswerten von Abfragen mit dem OR-Operator

In dieser Übung werden Sie mehrere Abfragen mit dem OR-Operator für die member-Tabelle ausführen, für die ein nicht gruppierter Index für die member_no-Spalte vorhanden ist Sie werden die statistischen Informationen aufzeichnen, E/A-Vorgänge vergleichen und den Ausführungsplan untersuchen. Sie werden vorhandene Indizes löschen, zwei Indizes erstellen, eine Abfrage erneut ausführen und den Ausführungsplan vergleichen, der für die gleiche Abfrage für eine Tabelle mit Teilindizierung verwendet wurde.

Sie können Abschnitte der Skriptdatei EvalQueryOR.sql in C:\Moc\2328A\Labfiles\L14 öffnen, überprüfen und ausführen oder die bereitgestellten Transact-SQL-Anweisungen eingeben und ausführen.

� So führen Sie eine Abfrage für eine Tabelle mit Teilindizierung aus In diesem Verfahren werden Sie drei Abfragen ausführen und deren statistische Informationen aufzeichnen und auswerten. 1. Löschen Sie alle Indizes für die member-Tabelle in der credit-Datenbank.

USE credit EXEC index_cleanup member

2. Erstellen Sie einen eindeutigen nicht gruppierten Index für die member_no-Spalte der member-Tabelle. CREATE UNIQUE nonclustered INDEX mbr_mem_no ON member(member_no)

3. Legen Sie für STATISTICS IO die Option ON fest. SET STATISTICS IO ON

4. Geben Sie diese SELECT-Anweisung ein und führen Sie sie aus, um ein Mitglied abzurufen, dessen Mitgliedsnummer gleich 1234 oder dessen Regionsnummer gleich 5 ist. USE credit SELECT * FROM member WHERE member_no=1234 OR region_no=5

Für die member_no-Spalte der member-Tabelle ist ein ein-deutiger nicht gruppierter Index vorhanden.

5. Zeichnen Sie die statistischen Informationen in der folgenden Tabelle auf.

Informationen Ergebnis

Anzahl der betroffenen Zeilen 1.166

Scananzahl 1

Anzahl logischer Lesevorgänge 147

Anzahl und Name der Indizes zum Verarbeiten der Abfrage Keine (Tabellenscan)

Abfrage 1

Anmerkung

Page 780: Programmieren Einer Microsoft SQL Server 2000-Datenbank

30 Unterrichtseinheit 14: Analysieren von Abfragen

6. Geben Sie diese SELECT-Anweisung ein und führen Sie sie aus, um ein Mitglied abzurufen, dessen Mitgliedsnummer gleich 1234 oder dessen Unternehmensnummer gleich 410 ist. USE credit SELECT * FROM member WHERE member_no=1234 OR corp_no=410

7. Zeichnen Sie die statistischen Informationen in der folgenden Tabelle auf.

Informationen Ergebnis

Anzahl der betroffenen Zeilen 10

Scananzahl 1

Anzahl logischer Lesevorgänge 147

Anzahl und Name der Indizes zum Verarbeiten der Abfrage Keine (Tabellenscan)

8. Klicken Sie auf die Registerkarte Ausführungsplan, um den Ausführungs-plan grafisch anzuzeigen.

9. Untersuchen Sie den Ausführungsplan. Er ähnelt der folgenden Abbildung.

SELECTKosten: 1%

Table ScanKosten: 99%

Beachten Sie die im Ausführungsplan verwendeten Vorgänge. Sie werden diesen Ausführungsplan verwenden, um ihn mit einem anderen Ausfüh-rungsplan später in dieser Übung zu vergleichen.

10. Geben Sie diese SELECT-Anweisung ein und führen Sie sie aus, um ein Mitglied abzurufen, dessen Regionsnummer gleich 5 oder dessen Unter-nehmensnummer gleich 410 ist. USE credit SELECT * FROM member WHERE region_no = 5 OR corp_no = 410

11. Zeichnen Sie die statistischen Informationen in der folgenden Tabelle auf.

Informationen Ergebnis

Anzahl der betroffenen Zeilen 1173

Scananzahl 1

Anzahl logischer Lesevorgänge 145

Anzahl und Name der Indizes zum Verarbeiten der Abfrage Keine (Tabellenscan)

Abfrage 2

Abfrage 3

Page 781: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 14: Analysieren von Abfragen 31

12. Vergleichen Sie die statistischen Informationen der drei Abfragen. USE credit SELECT * FROM member WHERE member_no=1234 OR region_no=5

USE credit SELECT * FROM member WHERE member_no=1234 OR corp_no=410

USE credit SELECT * FROM member WHERE region_no=5 OR corp_no=410

Informationen Ergebnis von Abfrage 1 Ergebnis von Abfrage 2 Ergebnis von Abfrage 3

Anzahl der betroffenen Zeilen 1.166 10 1.173

Scananzahl 1 1 1

Anzahl logischer Lese-vorgänge

147 147 147

Anzahl und Name der Indizes zum Verarbeiten der Abfrage

Keine (Tabellenscan) Keine (Tabellenscan) Keine (Tabellenscan)

Die statistischen Informationen können von denen in der Tabelle abweichen.

Weisen diese drei Ausführungspläne Unterschiede auf? Begründung? Nein, die drei Ausführungspläne weisen keine Unterschiede auf, da für alle ein Tabellenscan erforderlich ist. Mindestens eine der Spalten, auf die der OR-Operator verweist, hat keinen Index. Wenn eine Spalte keinen Index hat, führt der Abfrageoptimierer einen Tabellenscan durch. Aufgrund der Funktionsweise der Logik des OR-Operators werden alle Spalten, die auf einen OR-Operator verweisen, getrennt verarbeitet.____________________________________________________________

____________________________________________________________

____________________________________________________________

____________________________________________________________

Abfrage 1

Abfrage 2

Abfrage 3

Anmerkung

Page 782: Programmieren Einer Microsoft SQL Server 2000-Datenbank

32 Unterrichtseinheit 14: Analysieren von Abfragen

� So löschen Sie vorhandene Indizes und erstellen Indizes In diesem Verfahren werden Sie alle vorhandenen Indizes löschen und zwei Indizes für die member-Tabelle erstellen. 1. Geben Sie diese Anweisung ein, und führen Sie sie aus, um für die Statistik-

option OFF festzulegen: SET STATISTICS IO OFF

2. Geben Sie diese Anweisung ein, und führen Sie sie aus, um vorhandene Indizes für die member-Tabelle zu löschen: USE credit EXEC index_cleanup member

3. Geben Sie diese Anweisung ein, und führen Sie sie aus, um zwei Indizes für die member-Tabelle zu erstellen: USE credit CREATE UNIQUE nonclustered INDEX mbr_mem_no ON member(member_no) CREATE clustered INDEX mbr_corp_no_CL ON member(corp_no)

� So führen Sie eine Abfrage für eine Tabelle mit vollständiger Indizierung aus

In diesem Verfahren werden Sie für die Statistikoption ON festlegen, Abfrage 2 dieser Übung erneut ausführen und die statistischen Informationen aufzeichnen und auswerten. 1. Geben Sie diese Anweisung ein, und führen Sie sie aus, um für die Statistik-

option ON festzulegen: SET STATISTICS IO ON

2. Führen Sie Abfrage 2 erneut aus, wodurch Mitgliedsnummer 1234 oder Unternehmensnummer 410 abgerufen wird. USE credit SELECT * FROM member WHERE member_no=1234 OR corp_no=410

3. Zeichnen Sie die statistischen Informationen in der folgenden Tabelle auf.

Informationen Ergebnis

Anzahl der betroffenen Zeilen 10

Scananzahl 2

Anzahl logischer Lesevorgänge 24

Anzahl und Name der Indizes zum Verarbeiten der Abfrage

2 (mbr_mem_no undmbr_corp_no_CL)

Abfrage 2

Page 783: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 14: Analysieren von Abfragen 33

4. Vergleichen Sie die statistischen Informationen von Abfrage 2 für eine Tabelle mit Teilindizierung mit den statistischen Informationen von Abfrage 2 für eine Tabelle mit vollständiger Indizierung. USE credit SELECT * FROM member WHERE member_no=1234 OR corp_no=410

Informationen Ergebnis von Abfrage 2 (Teilindizierung)

Ergebnis von Abfrage 2 (vollständige Indizierung)

Anzahl der betroffenen Zeilen

10 10

Scananzahl 1 2

Anzahl logischer Lesevorgänge

147 24

Anzahl und Name der Indizes zum Ver-arbeiten der Abfrage

Keine (Tabellenscan) Ja (mbr_mem_no und mbr_corp_no_CL)

5. Klicken Sie auf die Registerkarte Ausführungsplan, um den Ausführungs-plan grafisch anzuzeigen.

6. Untersuchen Sie den Ausführungsplan, und vergleichen Sie ihn mit dem Ausführungsplan für die gleiche Abfrage, die für eine Tabelle mit Teil-indizierung ausgeführt wurde. Warum unterscheidet sich der Ausführungsplan für eine Tabelle mit voll-ständiger Indizierung vom Ausführungsplan, der für die gleiche Abfrage für eine Tabelle mit Teilindizierung verwendet wurde? Der Ausführungsplan für eine Tabelle mit vollständiger Indizierung ist anders, da für jede Spalte, auf die der OR-Operator verweist, ein nütz-licher Index vorhanden ist. Der Abfrageoptimierer verwendet einen Index zur Suche in der „corp_no“-Spalte und einen anderen Index zur Suche in der „member_no“-Spalte. ____________________________________________________________

____________________________________________________________

____________________________________________________________

Abfrage 2

Page 784: Programmieren Einer Microsoft SQL Server 2000-Datenbank

34 Unterrichtseinheit 14: Analysieren von Abfragen

Wie lautet der Ausführungsplan, und wie viele E/A-Vorgänge werden verwendet? Für Schritt 1a sind zwei E/A-Vorgänge erforderlich, um eine Zeile der „member_no“-Spalte abzurufen, die einen nicht gruppierten Index aufweist, der die Abfrage abdeckt. Dieser Vorgang trägt nicht zum Wert der Scananzahl bei, da er den Index abdeckt. Dieser Vorgang greift nicht auf die Tabelle zu. Für Schritt 2b sind zwei E/A-Vorgänge erforderlich, um zehn Zeilen der „corp_no“-Spalte abzurufen, die einen gruppierten Index aufweist. Durch diesen Vorgang kann ein Scan erklärt werden. In Schritt 2 und 3 werden die Ergebnisse verkettet und sortiert. Für diese Vorgänge sind zehn E/A-Vorgänge erforderlich. Schritt 3 ist eine Bookmark Lookup-Operation. Der Abfrageoptimierer liest die zehn Zeilen einzeln mit Hilfe der RID oder des Gruppierungs-schlüssels. Ein E/A-Vorgang für jede Zeile entspricht zehn E/A-Vorgängen und erklärt den zweiten Scan. E/A-Vorgänge insgesamt: 2 + 2 + 10 + 10 = 24 E/A-Vorgänge. ____________________________________________________________

____________________________________________________________

____________________________________________________________

____________________________________________________________

Page 785: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 14: Analysieren von Abfragen 35

���� Abfragen mit Verknüpfungsoperationen

� Selektivität und Dichte einer JOIN-Klausel

� Verarbeiten von Verknüpfungen

� Verarbeiten von Nested Loop-Verknüpfungen

� Multimediapräsentation: Wie Mergeverknüpfungen verarbeitet werden

� Überlegungen zum Verwenden von Mergeverknüpfungen

� Verarbeiten von Hashverknüpfungen

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

In diesem Abschnitt wird erläutert wie der Abfrageoptimierer Abfragen optimiert, in denen Verknüpfungsoperationen verwendet werden.

ThemaStellen Sie die Themen dieses Abschnitts vor.

EinstiegIn diesem Abschnitt werden Abfrageoptimierungen er-läutert, in denen Verknüp-fungsoperationen verwendet werden.

Page 786: Programmieren Einer Microsoft SQL Server 2000-Datenbank

36 Unterrichtseinheit 14: Analysieren von Abfragen

Selektivität und Dichte einer JOIN-Klausel

� Selektivität einer JOIN-Klausel� Basiert auf Indexdichte, falls

Statistiken verfügbar sind� Basiert auf verschiedenen

Erwägungen, falls Statistiken nicht verfügbar sind

� Dichte einer JOIN-Klausel� Ein Index mit einer großen

Zahl von doppelten Werten weist eine hohe Verknüpfungs-dichte auf

� Ein eindeutiger Index weist eine niedrige Verknüpfungs-dichte auf

Selektivität

Proz

ents

atz

der

zurü

ckge

gebe

nen

Zeile

n

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Die Reihenfolge, in der der Abfrageoptimierer die Verknüpfungen verarbeitet, wird neben der Selektivität und der Dichte der Daten auch durch das Vorhan-densein von Indizes und einer WHERE-Klausel bestimmt.

Selektivität einer JOIN-Klausel Die Selektivität einer JOIN-Klausel ist der Prozentsatz der Zeilen einer Tabelle, die zu einer einzigen Zeile verknüpft werden. Selektivität wird von der Anzahl von Zeilen abgeleitet, die wahrscheinlich zurückgegeben werden, wie bei der WHERE-Klausel.

Bei einer geringen Selektivität werden viele Zeilen zurückgegeben, bei einer hohen Selektivität werden wenige Zeilen zurückgegeben. Die Basis ist ein Vielfaches der Zeilen in beiden Tabellen, nachdem lokale Prädikate (WHERE-Klausel) auf verknüpfte Tabellen und Aggregationen angewandt wurden. Dieser Algorithmus unterscheidet sich vom Ermitteln der Anzahl von Zeilen, die mit einer Suchbedingung übereinstimmen.

Ermitteln der Selektivität einer JOIN-Klausel Sie können die Selektivität einer JOIN-Klausel mit Hilfe der Dichte der Daten berechnen. Der Abfrageoptimierer ermittelt basierend auf den folgenden Para-metern die Selektivität einer JOIN-Klausel.

� Falls Statistiken verfügbar sind, basiert die Verknüpfungsselektivität auf der Dichte des Indexes für alle Spalten.

� Falls keine Statistiken verfügbar sind, da keine Indizes vorhanden sind, vor-handene Indizes nicht nützlich sind, oder falls keine WHERE-Klausel in die Abfrage eingeschlossen ist, verarbeitet der Abfrageoptimierer die Abfrage auf folgende Weise effizienter:

• Anwenden einer geeigneten Verknüpfungsstrategie.

• Verwenden anderer physischer Operatoren.

ThemaErläutern Sie die Selektivität und die Dichte einer JOIN-Klausel.

EinstiegDie Reihenfolge, in der der Abfrageoptimierer die Ver-knüpfungen verarbeitet, wird neben der Selektivität und der Dichte der Daten auch durch das Vorhandensein von Indizes und einer WHERE-Klausel bestimmt.

Methodischer Hinweis Verwenden Sie die Abbil-dung auf der Folie, um er-neut darauf hinzuweisen, dass durch geringe Selek-tivität viele Zeilen und durch hohe Selektivität wenige Zeilen zurückgegeben werden.

Methodischer Hinweis Weisen Sie auf die Punkte hin, die der Abfrageoptimie-rer abschätzt, um die Selek-tivität einer JOIN-Klausel zu ermitteln, falls keine Statis-tiken verfügbar sind.

Page 787: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 14: Analysieren von Abfragen 37

• Dynamisches Erstellen von Spaltenstatistiken.

• Die Anzahl von Zeilen in jeder Tabelle der Verknüpfung.

Dichte einer JOIN-Klausel Die Dichte einer JOIN-Klausel ist der durchschnittliche Prozentsatz der doppel-ten Werte zwischen den inneren und äußeren Tabellen. Der Abfrageoptimierer verwendet die Dichte einer JOIN-Klausel, um zu ermitteln, welche Tabelle als innere und welche Tabelle als äußere Tabelle verarbeitet wird.

� Ein Index mit einer großen Anzahl von doppelten Werten weist eine hohe Dichte auf. Dies ist für Verknüpfungen keine hohe Selektivität. Beispielsweise enthält die orders_details-Tabelle viele Bestellungen für einen Kunden.

� Ein eindeutiger Index weist eine geringe Verknüpfungsdichte auf. Dies ist sehr selektiv. Beispielsweise ist in der customer-Tabelle jeder Kunde nur einmal auf-gelistet. Die customer ID-Spalte ist eindeutig.

Falls ein Index eine geringe Verknüpfungsdichte aufweist, kann der Abfrage-optimierer auf die Daten mit Hilfe eines gruppierten oder nicht gruppierten Indexes zugreifen. Ein gruppierter Index ist jedoch normalerweise nützlich für Indizes mit einer hohen Verknüpfungsdichte.

Verwenden Sie in diesem Beispiel die folgenden Annahmen, um zu ermitteln, wie der Abfrageoptimierer einen Ausführungsplan erzeugt.

� Die employee-Tabelle enthält 1.000 Zeilen. � Die department-Tabelle enthält 100 Zeilen (eindeutige Abteilungen). � Die Daten sind gleichmäßig verteilt (10 Angestellte pro Abteilung). � Es sind keine Indizes oder Statistiken vorhanden.

USE credit SELECT * FROM department AS dept INNER JOIN employee AS empl ON dept.deptno = empl.deptno

Wenn für verknüpfte Spalten kein Index vorhanden ist, verwendet der Abfrage-optimierer eine Verknüpfungsstrategie, mit der ermittelt wird, welche Tabelle die äußere und welche Tabelle die innere Tabelle ist. Dazu wird das Zeilen-verhältnis zwischen Tabellen ausgewertet.

Falls in der WHERE-Klausel Suchbedingungen vorhanden sind, kann der Abfrageoptimierer diese Bedingungen zuerst verwenden, um zu ermitteln, wie die Tabellen verknüpft werden. Dies basiert auf der Selektivität.

Beispiel

Page 788: Programmieren Einer Microsoft SQL Server 2000-Datenbank

38 Unterrichtseinheit 14: Analysieren von Abfragen

Verarbeiten von Verknüpfungen

membermembermembermember_nomember_no ……...5678...

.

.

.5678...

.

.

.Chen...

.

.

.Chen...

ErgebnisEindeutiger nichtgruppierter Index

Nicht gruppierter Indexchargechargechargecharge_nocharge_no...15259...16351...17673...

.

.

.15259...16351...17673...

member_nomember_no...5678...5678...5678...

.

.

.5678...5678...5678...

……member_nomember_no

5678567856785678567856785678567856785678567856785678

5678567856785678567856785678567856785678567856785678

charge_nocharge_no

30257176731525916351327784889760611667947439676840861738790299607

30257176731525916351327784889760611667947439676840861738790299607

……

(13 row(s) affected

USE creditSELECT m.member_no, c.charge_no, c.charge_amt, c.statement_noFROM member AS m INNER JOIN charge AS cON m.member_no = c.member_noWHERE c.member_no = 5678

USE creditSELECT m.member_no, c.charge_no, c.charge_amt, c.statement_noFROM member AS m INNER JOIN charge AS cON m.member_no = c.member_noWHERE c.member_no = 5678

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Wenn Sie wissen, wie der Abfrageoptimierer Verknüpfungsvorgänge ver-arbeitet, können Sie ermitteln, welche Indextypen Sie erstellen sollten.

Verknüpfungen werden paarweise verarbeitet. Es spielt keine Rolle, wie viele Tabellen Sie kombinieren, Verknüpfungen bestehen immer zwischen zwei Tabellen. Das Ergebnis dieser Verknüpfungen wird Zwischenergebnis genannt. Zwischenergebnisse können mit Hilfe eines Verknüpfungsalgorithmus mit einer anderen Tabelle verknüpft werden. Für jede Verknüpfung ermittelt der Ab-frageoptimierer den geeigneten Verknüpfungsalgorithmus, der verwendet werden soll.

Beim Verarbeiten von Verknüpfungsoperationen führt der Abfrageoptimierer normalerweise Folgendes durch:

� Ermitteln der Reihenfolge, in der die Tabellen verarbeitet werden, basierend auf Indizes, Selektivität und Dichte. Die Reihenfolge wird nicht durch die Reihenfolge der Tabelle bestimmt, auf die in der SELECT-Anweisung verwiesen wird.

� Identifizieren, welche Tabelle die optimale äußere Tabelle ist. � Ermitteln aller übereinstimmenden Zeilen der inneren Tabelle zu jeder

qualifizierenden Zeile in der äußeren Tabelle.

Auswerten der Verwendung von Indizes Die Selektivität und die Dichte einer JOIN-Klausel beeinflussen, welcher Indextyp für das Verarbeiten der Abfrage am nützlichsten ist.

� Ein Index für die Spalte, die in der WHERE-Klausel angegeben ist, kann beeinflussen, welche Tabelle als äußere Tabelle verwendet wird und welche Verknüpfungsstrategie verwendet wird. Selektivität bestimmt, welche Tabelle die innere Tabelle ist.

� Der Abfrageoptimierer berücksichtigt automatisch die Verwendung redundanter JOIN-Klauseln und Bedingungen in der WHERE-Klausel.

ThemaStellen Sie dar, wie der Abfrageoptimierer eine Verknüpfung verarbeitet.

EinstiegBetrachten wir nun, wie der Abfrageoptimierer eine Verknüpfung verarbeitet.

Methodischer Hinweis Weisen Sie darauf hin, dass der Abfrageoptimierer die Suchbedingungen in der WHERE-Klausel konvertiert, sodass die member-Tabelle die äußere Tabelle ist.

Erläutern Sie, dass der Ab-frageoptimierer mit Hilfe dieser Konvertierung die Suche beschränkt. Die Suche wird beschränkt, da die member-Tabelle nur eine qualifizierende Zeile aufweist, während die charge-Tabelle viele Zeilen aufweist.

Page 789: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 14: Analysieren von Abfragen 39

In diesem Beispiel weist die member_no-Spalte in der member-Tabelle einen eindeutigen nicht gruppierten Index auf, und die member_no-Spalte in der charge-Tabelle weist einen nicht gruppierten Index auf. Beide Indizes sind zum Verarbeiten der Abfrage nützlich.

USE credit SELECT m.member_no, c.charge_no, c.charge_amt, c.statement_no FROM member AS m INNER JOIN charge AS c ON m.member_no = c.member_no WHERE c.member_no = 5678

Der Abfrageoptimierer konvertiert die Suchkriterien in der WHERE-Klausel, sodass die Abfrage wie folgt verarbeitet wird:

WHERE m.member_no = 5678

Durch das Konvertieren der member-Tabelle in die äußere Tabelle beschränkt der Abfrageoptimierer die Suche, da die member-Tabelle nur eine qualifizie-rende Zeile aufweist, die charge-Tabelle aber viele Zeilen.

Beispiel

Page 790: Programmieren Einer Microsoft SQL Server 2000-Datenbank

40 Unterrichtseinheit 14: Analysieren von Abfragen

Verarbeiten von Nested Loop-Verknüpfungen

USE creditSELECT m.member_no, c.charge_no, c.charge_amt, s.statement_noFROM member AS m INNER JOIN charge AS cON m.member_no = c.member_no INNER JOIN statement AS sON c.member_no = s.member_noWHERE m.member_no = 5678

USE creditSELECT m.member_no, c.charge_no, c.charge_amt, s.statement_noFROM member AS m INNER JOIN charge AS cON m.member_no = c.member_no INNER JOIN statement AS sON c.member_no = s.member_noWHERE m.member_no = 5678

Verknüpft die Ergebnisse mit denqualifizierenden Zeilen der charge-Tabelle

Ruft qualifizierende Zeilen aus beidenTabellen ab und verknüpft sie

111

222

chargechargechargecharge_nocharge_no...15259...16351...17673...

.

.

.15259...16351...17673...

member_nomember_no...5678...5678...5678...

.

.

.5678...5678...5678...

statementstatementstatementstatement_nostatement_no...567815678...

.

.

.567815678...

member_nomember_no...56785678...

.

.

.56785678...

……........

.

.

.

.

.

.

.

.

membermembermembermember_nomember_no ……...5678...

.

.

.5678...

.

.

.Chen...

.

.

.Chen...

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Falls die Abfrage eine JOIN-Klausel enthält, wertet der Abfrageoptimierer die Anzahl von Tabellen, Indizes und Verknüpfungen aus, um die optimale Reihen-folge und die zu verwendende Verknüpfungsstrategie zu ermitteln. Der Ab-frageoptimierer verarbeitet Nested Loop-Verknüpfungen als geschachtelte Iterationen

Definieren einer geschachtelten Iteration Eine geschachtelte Iteration liegt vor, wenn der Abfrageoptimierer einen Satz von Nested Loop-Verknüpfungen erstellt und das Resultset anwächst, während die Zeilen verarbeitet werden. Der Abfrageoptimierer führt die folgenden Schritte durch.

1. Finden einer Zeile der ersten Tabelle. 2. Verwenden der Zeile, um die nächste Tabelle zu scannen. 3. Verwenden des Ergebnisses der vorherigen Tabelle, um die nächste Tabelle

zu scannen.

Auswerten von Verknüpfungskombinationen Der Abfrageoptimierer wertet automatisch mindestens vier oder mehr mögliche Verknüpfungskombinationen aus. Dies gilt auch dann, wenn diese Kombina-tionen nicht im Verknüpfungsprädikat angegeben sind. Sie müssen keine redun-danten Klauseln hinzufügen. Der Abfrageoptimierer gleicht die Kosten aus und verwendet Statistiken, um die Anzahl von Verknüpfungskombinationen zu er-mitteln, die ausgewertet werden. Das Auswerten aller möglichen Verknüp-fungskombinationen ist ineffizient und aufwendig.

ThemaErläutern Sie, wie ge-schachtelte Verknüpfungen verarbeitet werden.

EinstiegFalls die Abfrage eine JOIN-Klausel enthält, wertet der Abfrageoptimierer die An-zahl von Tabellen, Indizes und Verknüpfungen aus, um die optimale Reihenfolge und die zu verwendende Verknüpfungsstrategie zu ermitteln.

Page 791: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 14: Analysieren von Abfragen 41

Auswerten der Kosten der Abfrageleistung Wenn der Abfrageoptimierer eine geschachtelte Verknüpfung durchführt, soll-ten Sie bedenken, dass bestimmte Kosten verursacht werden. Nested Loop-Ver-knüpfungen sind Mergeverknüpfungen und Hashverknüpfungen weit über-legen, wenn kleine Transaktionen ausgeführt werden, wie beispielsweise solche, von denen nur ein kleiner Satz von Zeilen betroffen ist. Für den Ab-frageoptimierer gilt Folgendes:

� Verwendet Nested Loop-Verknüpfungen, wenn die äußere Eingabe sehr klein ist und wenn die innere Eingabe indiziert und sehr groß ist.

� Verwendet die kleinere Eingabe als äußere Tabelle. � Erfordert, dass ein nützlicher Index für das Verknüpfungsprädikat der

inneren Tabelle vorhanden ist. � Verwendet immer eine Nested Loop-Verknüpfungsstrategie, wenn die

Verknüpfungsoperation nicht den Gleichheitsoperator verwendet.

In diesem Beispiel wird die member-Tabelle (10.000 Zeilen) mit der charge-Tabelle (100.000 Zeilen) verknüpft. Die charge-Tabelle ist mit der statement-Tabelle (20.000 Zeilen) verknüpft. Für die member_no-Spalte in jeder Tabelle sind nicht gruppierte Indizes vorhanden. Der Abfrageoptimierer hat die Ver-knüpfung verarbeitet, als die member-Tabelle mit der statement-Tabelle ver-knüpft wurde, und das Ergebnis dieser Verknüpfung wurde mit der charge-Tabelle kombiniert.

USE credit SELECT m.member_no, c.charge_no, c.charge_amt, s.statement_no FROM member AS m INNER JOIN charge AS c ON m.member_no = c.member_no INNER JOIN statement AS s ON c.member_no = s.member_no WHERE m.member_no = 5678

Der Abfrageoptimierer führt die folgenden Schritte durch, um die Abfrage zu verarbeiten:

1. Abrufen der qualifizierenden Zeilen der member-Tabelle und der statement-Tabelle und anschließendes Verknüpfen des Ergebnisses mit Hilfe der Nested Loop-Verknüpfungsstrategie.

2. Abrufen der qualifizierenden Zeilen der charge-Tabelle, und anschließen-des Verknüpfen des Ergebnisses mit den Ergebnissen der ersten Nested Loop-Verknüpfung mit Hilfe einer anderen Nested Loop-Verknüpfungs-strategie.

Beispiel

Page 792: Programmieren Einer Microsoft SQL Server 2000-Datenbank

42 Unterrichtseinheit 14: Analysieren von Abfragen

Multimediapräsentation: Wie Mergeverknüpfungen verarbeitet werden

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Die Spalten der Verknüpfungsbedingungen werden als Eingaben verwendet, um eine Mergeverknüpfung zu verarbeiten. SQL Server führt die folgenden Schritte durch, wenn eine Mergeverknüpfungsstrategie verwendet wird:

1. Verwenden des ersten Eingabewertes jeder Eingabemenge. 2. Vergleichen der Eingabewerte. 3. Ausführen eines Mergealgorithmus.

• Wenn die Eingabewerte gleich sind, werden die Zeilen zurückgegeben.

• Wenn die Eingabewerte nicht gleich sind, wird der niedrigere Wert ver-worfen, und der nächste Eingabewert dieser Eingabe wird für den nächsten Vergleich verwendet.

4. Wiederholen dieses Vorgangs bis alle Zeilen einer dieser Eingabemengen verarbeitet wurden.

5. Auswerten der übrigen Suchbedingungen der Abfrage und Zurückgeben der qualifizierenden Zeilen.

Es wird nur ein Durchgang pro Eingabe vorgenommen. Die Mergeverknüpfungsoperation endet, nachdem alle Eingabewerte einer Ein-gabe ausgewertet wurden. Die übrigen Werte der anderen Eingabe werden nicht verarbeitet.

ThemaErläutern Sie, wie Merge-verknüpfungen verarbeitet werden.

EinstiegIn dieser Präsentation sehen Sie, wie Mergever-knüpfungen verarbeitet werden.

Methodischer Hinweis Aktivieren Sie in Microsoft Windows Media Player im Menü Ansicht die Option Beschreibung, um die Untertitel der Präsentation anzuzeigen.

Anmerkung

Page 793: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 14: Analysieren von Abfragen 43

Überlegungen zum Verwenden von Mergeverknüpfungen

� Verknüpfte Spalten müssen sortiert sein

� Auswerten sortierter Werte

� Verwenden einer vorhandenen Indexstruktur

� Nutzen der Sortieroperationen

� Führt eigene Sortieroperationen durch

� Leistungsaspekte

USE creditSELECT m.lastname, p.payment_amtFROM member AS m INNER JOIN payment AS p ON m.member_no = p.member_no WHERE p.payment_amt < 7000 AND m.firstname < 'Jak'

USE creditSELECT m.lastname, p.payment_amtFROM member AS m INNER JOIN payment AS p ON m.member_no = p.member_no WHERE p.payment_amt < 7000 AND m.firstname < 'Jak'

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Bei einer Mergeverknüpfung werden zwei sortierte Eingaben verwendet, die dann verknüpft werden.

Verknüpfte Spalten müssen sortiert sein Wenn Sie eine Abfrage mit Verknüpfungsoperationen ausführen und die ver-knüpften Spalten in sortierter Reihenfolge vorliegen, verarbeitet der Abfrage-optimierer die Abfrage mit Hilfe einer Mergeverknüpfungsstrategie. Eine Mergeverknüpfung ist sehr effizient, da die Spalten bereits sortiert sind und weniger Seiten-E/A erforderlich sind.

Auswerten sortierter Werte Damit der Abfrageoptimierer die Mergeverknüpfung verwendet, müssen die Eingaben sortiert sein. Der Abfrageoptimierer wertet sortierte Werte in der folgenden Reihenfolge aus:

1. Verwenden einer vorhandenen Indexstruktur (am häufigsten). Der Abfrage-optimierer kann die Indexstruktur eines gruppierten Indexes oder eines ab-gedeckten, nicht gruppierten Indexes verwenden.

2. Nutzen der Sortieroperationen, die von den GROUP BY-, ORDER BY- und CUBE-Klauseln verwendet werden. Die Sortieroperation muss nur einmal durchgeführt werden.

3. Führt eigene Sortieroperationen durch, in denen ein SORT-Operator darge-stellt wird, wenn der Ausführungsplan grafisch angezeigt wird. Dies wird vom Abfrageoptimierer sehr selten durchgeführt.

ThemaWeisen Sie auf die Details einer Mergeverknüpfungs-operation hin.

EinstiegBei einen Mergeverknüp-fung werden zwei sortierte Eingaben verwendet, die dann verknüpft werden.

Page 794: Programmieren Einer Microsoft SQL Server 2000-Datenbank

44 Unterrichtseinheit 14: Analysieren von Abfragen

In diesem Beispiel ist für die member_no-Spalte der payment-Tabelle ein gruppierter Index vorhanden, und ein eindeutiger gruppierter Index ist für die member_no-Spalte der member-Tabelle vorhanden. Mit Hilfe des gruppierten Indexes für jede Tabelle scannt der Abfrageoptimierer die member-Tabelle und die payment-Tabelle. Nach dem Scannen des Inhalts jeder Tabelle führt der Abfrageoptimierer eine Mergeverknüpfung zwischen beiden Tabellen durch, da beide Eingaben bereits von den gruppierten Indizes sortiert wurden. Dies ist eine Mergeverknüpfung/innere Verknüpfung.

USE credit SELECT m.lastname, p.payment_amt FROM member AS m INNER JOIN payment AS p ON m.member_no = p.member_no WHERE p.payment_amt < 7000 AND m.firstname < 'Jak'

In diesem Beispiel ist ein eindeutiger gruppierter Index für die member_no-Spalte der member-Tabelle vorhanden, und in der Abfrage ist explizit eine ORDER BY-Klausel für die member_no-Spalte der payment-Tabelle angegeben.

USE credit SELECT m.lastname, m.firstname, p.payment_dt FROM member AS m INNER JOIN payment AS p ON m.member_no = p.member_no ORDER BY p.member_no

LeistungsaspekteBerücksichtigen Sie die folgenden Aspekte dazu, wie der Abfrageoptimierer die Mergeverknüpfung verwendet:

� SQL Server führt eine Mergeverknüpfung für alle Typen von Verknüp-fungsoperationen durch (mit Ausnahme von CROSS JOIN-Operationen oder FULL JOIN-Operationen), einschließlich der UNION-Operationen.

� Eine Mergeverknüpfungsoperation kann eine 1:1-, 1:n- oder n:n-Operation sein. Wenn es sich bei der Mergeverknüpfung um eine n:n-Operation handelt, verwendet SQL Server eine temporäre Tabelle, um die Zeilen zu speichern. Treten bei den Eingaben doppelte Werte auf, so muss eine Eingabe bis zum ersten doppelten Wert zurückgespult werden, während alle doppelten Werte der anderen Eingabe verarbeitet werden.

� Die Abfrageleistung ist bei einer Mergeverknüpfung sehr hoch, die Kosten können ebenfalls hoch sein, wenn der Abfrageoptimierer eine eigene Sor-tieroperation durchführen muss. Wenn die Datenmenge umfangreich ist und die gewünschten Daten vorsor-tiert aus den Indizes der vorhandenen B-Bäume (Balanced Tree) abgerufen werden können, ist die Mergeverknüpfung häufig der schnellste Verknüp-fungsalgorithmus.

� Eine Mergeverknüpfung wird normalerweise verwendet, wenn die beiden Verknüpfungseingaben viele Daten aufweisen und in den Verknüpfungs-spalten sortiert sind (wenn z. B. die Verknüpfungseingaben beim Scannen sortierter Indizes gewonnen wurden).

� Mergeverknüpfungsoperationen können nur mit einem Gleichheitsoperator im Verknüpfungsprädikat durchgeführt werden.

Beispiel 1

Beispiel 2

Page 795: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 14: Analysieren von Abfragen 45

Verarbeiten von Hashverknüpfungen

Hashschlüssel

xxxxxxzzzzzzyyyyyynnnnnn

..

..

..

member_nomember_nomember_no

11......

98179817......

Ergebnis member_nomember_nomember_no lastnamelastnamelastname ………98179817 DeBrouxDeBroux ……

HashbucketHashHashbbucketucket

.

.

.

.

.

.

DatenzeilenDatDatenzeilenenzeilen

yyy

98179817......

DeBrouxDeBroux ……

1068610686......

ZuvelZuvel ……

83428342......

HjellenHjellen ……

xxx

Untersuchungseingabe Erstellungseingabe

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Mit der Hashingstrategie werden Daten basierend auf einer gegebenen Eigen-schaft oder einem gegebenen Merkmal in gleich große Sätze von handlicher Größe unterteilt. Mit den gruppierten Daten kann dann ermittelt werden, ob ein bestimmtes Datenelement mit einem vorhandenen Wert übereinstimmt.

Doppelte Daten oder Bereiche von Daten sind für Hashverknüp-fungen nicht nützlich, da die Daten nicht organisiert oder sortiert sind.

Wann eine Hashverknüpfung verwendet wird Der Abfrageoptimierer verwendet eine Hashverknüpfungsoption, wenn diese Option voraussichtlich effizienter ist als das Verarbeiten von Abfragen mit Hilfe einer Nested Loop- oder Mergeverknüpfung. Normalerweise werden Hashverknüpfungen verwendet, wenn kein Index vorhanden ist oder vorhan-dene Indizes nicht nützlich sind.

Zuweisen einer Erstellungs- und Untersuchungseingabe Der Abfrageoptimierer weist eine Erstellungs- und Untersuchungseingabe zu. Wenn der Abfrageoptimierer die Erstellungs- und Untersuchungseingabe nicht ordnungsgemäß zuweist (dies ist aufgrund von ungenauen Schätzungen der Dichte möglich), werden sie dynamisch umgekehrt. Die Funktion zum dyna-mischen Ändern der Rolle wird als Role reversal bezeichnet.

Erstellungseingaben bestehen aus den Spaltenwerten einer Tabelle mit der geringsten Zeilenanzahl. Durch Erstellungseingaben wird eine Hashtabelle im Arbeitsspeicher erstellt, um diese Werte zu speichern.

ThemaErläutern Sie, wie Hash-verknüpfungen verarbeitet werden.

EinstiegDer Abfrageoptimierer ver-wendet eine Hashverknüp-fung, wenn diese Option voraussichtlich effizienter ist als das Verarbeiten von Abfragen mit Hilfe einer Nested Loop- oder Mergeverknüpfung.

Anmerkung

Page 796: Programmieren Einer Microsoft SQL Server 2000-Datenbank

46 Unterrichtseinheit 14: Analysieren von Abfragen

Hashbucket ist der Speicherort in der Hashtabelle, in den alle Zeilen der Erstel-lungseingabe eingefügt wird. Zeilen aus einer der Verknüpfungstabellen werden in dem Hashbucket platziert, bei dem der Hashschlüsselwert der Zeile mit dem Hashschlüsselwert des Buckets übereinstimmt. Hashbuckets werden als ver-knüpfte Listen gespeichert und enthalten nur die Spalten, die für die Abfrage notwendig sind.

Eine Hashtabelle enthält Hashbuckets. Eine Hashtabelle wird aus der Erstel-lungseingabe erstellt.

Die Untersuchungseingabe besteht aus den Spaltenwerten der Tabellen mit den meisten Zeilen. Die Erstellungseingabe überprüft die Untersuchungseingabe, um im Hashbucket eine übereinstimmende Zeile zu finden.

Mit Hilfe von Spalten- oder Indexstatistiken ermittelt der Abfrage-optimierer, welche der Eingaben kleiner ist.

Verarbeiten einer Hashverknüpfung In der folgenden Liste ist auf vereinfachte Weise dargestellt, wie der Abfrage-optimierer eine Hashverknüpfung verarbeitet. Diese Liste ist nicht vollständig, da der Algorithmus sehr komplex ist. SQL Server:

1. Lesen der Untersuchungseingabe. Von jeder Untersuchungseingabe wird eine Zeile zur Zeit verarbeitet.

2. Durchführen des Hashalgorithmus für jede Untersuchungseingabe und Erzeugen eines Hashschlüsselwertes.

3. Bestimmen des Hushbuckets, der mit dem Hashschlüsselwert überein-stimmt.

4. Zugreifen auf den Hashbucket und Suchen nach der übereinstimmenden Zeile.

5. Zurückgeben der Zeile, wenn eine übereinstimmende Zeile gefunden wird.

LeistungsaspekteBeachten Sie die folgenden Aspekte zu Hashverknüpfungen, die vom Abfrage-optimierer verwendet werden:

� Ähnlich wie Mergeverknüpfungen ist eine Hashverknüpfung sehr effizient, da ein Hashbucket verwendet wird. Hashbuckets sind mit einem dyna-mischen Index vergleichbar, aber mit weniger Verwaltungsaufwand zum Kombinieren von Zeilen verbunden.

� Hashverknüpfungen können für alle Arten von Verknüpfungsoperationen (mit Ausnahme von CROSS JOIN-Operationen) durchgeführt werden, ein-schließlich UNION- und DIFFERENCE-Operationen.

� Ein Hashoperator kann doppelte Werte entfernen und Daten gruppieren, wie z. B. SUM (Gehalt) GROUP BY Abteilung. Der Abfrageoptimierer ver-wendet nur eine Eingabe für die Erstellungs- und Untersuchungsrollen.

� Bei umfangreichen Eingaben mit ähnlicher Größe entspricht die Leistung einer Hashverknüpfungsoperation etwa einer Mergeverknüpfung mit vor-herigem Sortiervorgang. Wenn jedoch die Größe der Verknüpfungseingaben sehr unterschiedlich ist, weist die Hashverknüpfung häufig eine viel bessere Leistung auf.

Anmerkung

Page 797: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 14: Analysieren von Abfragen 47

� Hashverknüpfungen können große, nicht sortierte, nicht indizierte Eingaben effizient verarbeiten. Hashverknüpfungen sind bei komplexen Abfragen nützlich, da für die Zwischenergebnisse Folgendes gilt:

• Sie werden nicht indiziert (es sei denn, sie werden auf einem Datenträger gespeichert und dann indiziert).

• Sie werden häufig für die nächste Operation im Ausführungsplan nicht sortiert.

� Der Abfrageoptimierer kann falsche Schätzungen identifizieren und dynamisch Korrekturen vornehmen, damit die Abfrage effizienter ver-arbeitet wird.

� Eine Hashverknüpfung reduziert die Notwendigkeit der Datenbank-denormalisierung. Denormalisierung wird normalerweise verwendet, um eine bessere Leistung durch Reduzieren der Verknüpfungsoperationen zu erreichen, trotz Redundanz durch z. B. inkonsistente Aktualisierungen. Durch Hashverknüpfungen haben Sie die Option, als Teil des physischen Datenbankentwurfs Daten vertikal zu partitionieren. Durch vertikales Partitionieren werden Gruppen von Spalten einer einzigen Tabelle in ge-trennten Dateien oder Indizes dargestellt.

Weitere Informationen zu Hashverknüpfungen finden Sie unter „Grundlegendes zu Hashverknüpfungen“ in der SQL Server-Onlinedokumen-tation.

Anmerkung

Page 798: Programmieren Einer Microsoft SQL Server 2000-Datenbank

48 Unterrichtseinheit 14: Analysieren von Abfragen

Übungseinheit B: Analysieren von Abfragen mit unterschiedlichen Verknüpfungsstrategien

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

LernzieleAm Ende dieser Übungseinheit werden Sie in der Lage sein, das Verarbeiten einer Abfrage mit Hilfe von Nested Loop-, Merge- und Hashstrategien auszu-werten.

VoraussetzungenUm diese Übungseinheit zu bearbeiten, benötigen Sie Folgendes:

• Die Skriptdateien für diese Übungseinheit, die sich in C:\Moc\2328A\Labfiles\L14 befinden.

Einrichten der Übungseinheit Um diese Übungseinheit zu bearbeiten, ist eine der folgenden Aktionen erforderlich:

� Bearbeiten der vorherigen Übungseinheit. � Ausführen der Batchdatei C:\Moc\2328A\Batches\Restore14B.cmd.

Mit dieser Befehlsdatei wird die credit-Datenbank wieder in den Zustand zurückversetzt, der für diese Übungseinheit erforderlich ist.

Weitere Informationen Sollten Sie beim Ausführen von Dateien Hilfe benötigen, suchen Sie in der Hilfe von SQL Query Analyzer nach „Ausführen einer Abfrage“.

Daneben sind die folgenden Informationsquellen verfügbar:

� Das credit-Datenbankschema. � Die Microsoft SQL Server-Onlinedokumentation.

ThemaGeben Sie eine Einführung in die Übungseinheit.

EinstiegIn dieser Übungseinheit be-obachten Sie den Ausfüh-rungsplan und werten die Abfrageoptimierung mit Hilfe unterschiedlicher Verknüp-fungsstrategien aus.

Erläutern Sie die Lernziele der Übungseinheit.

Page 799: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 14: Analysieren von Abfragen 49

SzenarioDer Aufbau des Schulungsraumes soll die Organisation des weltweit agieren-den Handelsunternehmens Northwind Traders widerspiegeln. Das Unternehmen hat den fiktiven Domänennamen nwtraders.msft. Der primäre DNS-Server für nwtraders.msft ist der Kursleitercomputer, dessen IP-Adresse (Internetproto-koll) 192.168.x.200 lautet (wobei x die zugewiesene Schulungsraumnummer ist). Der Name des Kursleitercomputers ist London.

Die folgende Tabelle stellt den Benutzernamen, den Computernamen und die IP-Adresse für jeden Kursteilnehmercomputer in der fiktiven Domäne nwtraders.msft bereit. Suchen Sie den Ihrem Computer zugewiesenen Benutzernamen und notieren Sie ihn.

Benutzername Computername IP-Adresse

SQLAdmin1 Vancouver 192.168.x.1

SQLAdmin2 Denver 192.168.x.2

SQLAdmin3 Perth 192.168.x.3

SQLAdmin4 Brisbane 192.168.x.4

SQLAdmin5 Lisbon 192.168.x.5

SQLAdmin6 Bonn 192.168.x.6

SQLAdmin7 Lima 192.168.x.7

SQLAdmin8 Santiago 192.168.x.8

SQLAdmin9 Bangalore 192.168.x.9

SQLAdmin10 Singapore 192.168.x.10

SQLAdmin11 Casablanca 192.168.x.11

SQLAdmin12 Tunis 192.168.x.12

SQLAdmin13 Acapulco 192.168.x.13

SQLAdmin14 Miami 192.168.x.14

SQLAdmin15 Auckland 192.168.x.15

SQLAdmin16 Suva 192.168.x.16

SQLAdmin17 Stockholm 192.168.x.17

SQLAdmin18 Moscow 192.168.x.18

SQLAdmin19 Caracas 192.168.x.19

SQLAdmin20 Montevideo 192.168.x.20

SQLAdmin21 Manila 192.168.x.21

SQLAdmin22 Tokyo 192.168.x.22

SQLAdmin23 Khartoum 192.168.x.23

SQLAdmin24 Nairobi 192.168.x.24

Veranschlagte Zeit für die Übungseinheit: 30 Minuten

Page 800: Programmieren Einer Microsoft SQL Server 2000-Datenbank

50 Unterrichtseinheit 14: Analysieren von Abfragen

Übung 1 Verarbeiten von Nested Loop-Verknüpfungen

In dieser Übung werden Sie Indizes für die member-Tabelle und die charge-Tabelle erstellen und beobachten, wie der Abfrageoptimierer die Abfrage mit Hilfe einer Nested Loop-Verknüpfungsstrategie verarbeitet.

Sie können Abschnitte der Skriptdatei NestedLoopJoin.sql in C:\Moc\2328A\Labfiles\L14 öffnen, überprüfen und ausführen oder die bereitgestellten Transact-SQL-Anweisungen eingeben und ausführen.

� So erstellen Sie Indizes In diesem Verfahren werden Sie Indizes für die member-Tabelle und die charge-Tabelle erstellen. 1. Melden Sie sich mit Hilfe der Informationen in der folgenden Tabelle an der

Schulungsraumdomäne nwtraders an.

Option Eingabe

Benutzername SQLAdminx (wobei x die Ihrem Computernamen zugewiesene Nummer ist, wie in der Schulungsraumdomäne nwtraders.msftfestgelegt)

Kennwort password

2. Öffnen Sie SQL Query Analyzer und melden Sie sich gegebenenfalls mit Microsoft Windows-Authentifizierung am (lokalen) Server an. Sie verfügen über die Berechtigung, sich bei SQL Server anzumelden und SQL Server zu verwalten, da Sie als SQLAdminx angemeldet sind, und SQLAdminx ein Mitglied der lokalen Windows 2000-Gruppe Administ-ratoren ist. Alle Mitglieder dieser Gruppe werden automatisch der sysadmin-Rolle von SQL Server zugeordnet.

3. Geben Sie mit SQL Query Analyzer diese Anweisung ein und führen Sie sie aus, um vorhandene Indizes für die member-Tabelle und die charge-Tabelle zu löschen: USE credit EXEC index_cleanup member EXEC index_cleanup charge

4. Geben Sie diese Anweisung ein und führen Sie sie aus, um einen eindeuti-gen, nicht gruppierten zusammengesetzten Index für die lastname-Spalte und die firstname-Spalte der member-Tabelle zu erstellen: USE credit CREATE UNIQUE nonclustered INDEX mbr_name ON member(lastname, firstname)

5. Geben Sie diese Anweisung ein und führen Sie sie aus, um einen nicht grup-pierten Index für die member_no-Spalte der charge-Tabelle zu erstellen: USE credit CREATE nonclustered INDEX chg_mem_no ON charge(member_no)

Page 801: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 14: Analysieren von Abfragen 51

� So beobachten Sie, wie eine Abfrage mit Hilfe der Nested Loop-Verknüpfungsstrategie verarbeitet wird

In diesem Verfahren werden Sie für die Statistikoption ON festlegen, eine Abfrage ausführen und statistische Informationen aufzeichnen. 1. Geben Sie diese Anweisung ein, und führen Sie sie aus, um für die Statistik-

option ON festzulegen: SET STATISTICS IO ON

2. Klicken Sie im Menü Abfrage auf Ausführungsplan anzeigen.3. Geben Sie die SELECT-Anweisung ein, und führen Sie sie aus, um die

Mitgliedsnummer, den Nachnamen und die Gebührennummer zu Mit-gliedern mit dem Nachnamen Barr und dem Vornamen Bos abzurufen. USE credit SELECT member.member_no, lastname, charge_no FROM member JOIN charge ON member.member_no = charge.member_no WHERE member.lastname = 'BARR' AND firstname = 'BOS'

4. Zeichnen Sie die statistischen Informationen für die member-Tabelle auf.

Informationen Ergebnis

Scananzahl 1

Anzahl logischer Lesevorgänge 3

Anzahl und Name der Indizes zum Verarbeiten der Abfrage 1 (mbr_name)

5. Zeichnen Sie die statistischen Informationen für die charge-Tabelle auf.

Informationen Ergebnis

Scananzahl 1

Anzahl logischer Lesevorgänge 26

Anzahl und Name der Indizes zum Verarbeiten der Abfrage 1 (chg_mem_no)

Warum sind für die member-Tabelle drei E/A-Vorgänge erforderlich und für die charge-Tabelle 26 E/A-Vorgänge? Zu einer Zeile der „member“-Tabelle sind mehrere Zeilen in der „charge“-Tabelle vorhanden. Dies weist auf eine standardmäßige 1:n-Beziehung hin. ____________________________________________________________

____________________________________________________________

Page 802: Programmieren Einer Microsoft SQL Server 2000-Datenbank

52 Unterrichtseinheit 14: Analysieren von Abfragen

6. Klicken Sie auf die Registerkarte Ausführungsplan, um den Ausführungs-plan grafisch anzuzeigen.

7. Untersuchen Sie den Ausführungsplan. Nach welcher Strategie hat der Abfrageoptimierer die Zeilen in beiden Tabellen gesucht? Nested Loop-/innere Verknüpfung. Der Abfrageoptimierer verwendet den nicht gruppierten Index, um den Mitgliedsnamen „BOS BARR“ in der „member“-Tabelle zu suchen. Nachdem das richtige Mitglied ge-funden wurde, wurde mit Hilfe der „member_no“-Spalte nach über-einstimmenden Zeilen im „chg_mem_no“-Index der „charge“-Tabelle gesucht. Dies ist eine Nested Loop-/innere Verknüpfung. ____________________________________________________________

____________________________________________________________

____________________________________________________________

____________________________________________________________

Page 803: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 14: Analysieren von Abfragen 53

Übung 2 Verarbeiten von Mergeverknüpfungen

In dieser Übung werden Sie alle Indizes für die member-Tabelle und die charge-Tabelle löschen, eine Abfrage ausführen und den Ausführungsplan auswerten. Sie werden dann Indizes für die member-Tabelle und die charge-Tabelle erstellen, eine Abfrage erneut ausführen und die Seiten-E/A ver-gleichen.

Sie können Abschnitte der Skriptdatei MergeJoin.sql in C:\Moc\2328A\Labfiles\L14 öffnen, überprüfen und ausführen oder die bereitgestellten Transact-SQL-Anweisungen eingeben und ausführen.

� So beobachten Sie, wie der Abfrageoptimierer eine Abfrage für eine Tabelle ohne Indizes verarbeitet

In diesem Verfahren werden Sie alle Indizes für die member-Tabelle und die charge-Tabelle löschen, eine Abfrage ausführen und die statistischen Infor-mationen auswerten. 1. Geben Sie diese Anweisungen ein, und führen Sie sie aus, um vorhandene

Indizes für die member-Tabelle und die charge-Tabelle zu löschen: USE credit EXEC index_cleanup member EXEC index_cleanup charge

2. Legen Sie ON für die Option STATISTICS IO fest, geben Sie diese SELECT-Anweisung ein, und führen Sie sie aus, um die Mitgliedsnummer, den Nachnamen und die Gebührennummer zu Mitgliedern mit dem Nach-namen Hahn abzurufen. USE credit SELECT member.member_no, lastname, charge_no FROM member JOIN charge ON member.member_no = charge.member_no WHERE member.lastname = 'HAHN'

Diese Abfrage wird im Verlauf dieser Übung als ursprüngliche Abfrage bezeichnet.

3. Zeichnen Sie die statistischen Informationen für die member-Tabelle auf.

Informationen Ergebnis

Scananzahl 1

Anzahl logischer Lesevorgänge 145

Anzahl und Name der Indizes zum Verarbeiten der Abfrage Keine (Tabellenscan)

Anmerkung

Page 804: Programmieren Einer Microsoft SQL Server 2000-Datenbank

54 Unterrichtseinheit 14: Analysieren von Abfragen

4. Zeichnen Sie die statistischen Informationen für die charge-Tabelle auf.

Informationen Ergebnis

Scananzahl 1

Anzahl logischer Lesevorgänge 582

Anzahl und Name der Indizes zum Verarbeiten der Abfrage Keine (Tabellenscan)

� So erstellen Sie Indizes und werten aus, wie der Abfrageoptimierer eine Abfrage für eine Tabelle mit Indizes verarbeitet

In diesem Verfahren werden Sie Indizes für die member-Tabelle und die charge-Tabelle erstellen, die ursprüngliche Abfrage erneut ausführen und auswerten, wie der Abfrageoptimierer die Abfrage mit Hilfe einer Merge-verknüpfungsstrategie verarbeitet. 1. Geben Sie diese Anweisung ein und führen Sie sie aus, um einen nicht

gruppierten zusammengesetzten Index für die member_no-Spalte und die lastname-Spalte der member-Tabelle zu erstellen: USE credit CREATE nonclustered INDEX mbr_name ON member(member_no, lastname)

2. Geben Sie diese Anweisung ein und führen Sie sie aus, um einen nicht gruppierten zusammengesetzten Index für die member_no-Spalte und die charge_no-Spalte der charge-Tabelle zu erstellen: USE credit CREATE nonclustered INDEX chg_charge_no ON charge(member_no, charge_no)

3. Führen Sie die ursprüngliche Abfrage aus, mit der der Mitgliedsname, der Nachname und die Gebührennummer zu Mitgliedern mit dem Nachnamen Hahn abgerufen werden. USE credit SELECT member.member_no, lastname, charge_no FROM member JOIN charge ON member.member_no = charge.member_no WHERE member.lastname = 'HAHN'

4. Zeichnen Sie die statistischen Informationen für die member-Tabelle auf.

Informationen Ergebnis

Scananzahl 1

Anzahl logischer Lesevorgänge 32

Anzahl und Name der Indizes zum Verarbeiten der Abfrage 1 (mbr_name)

Ursprüngliche Abfrage

Page 805: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 14: Analysieren von Abfragen 55

5. Zeichnen Sie die statistischen Informationen für die charge-Tabelle auf.

Informationen Ergebnis

Scananzahl 1

Anzahl logischer Lesevorgänge 235

Anzahl und Name der Indizes zum Verarbeiten der Abfrage 1(chg_charge_no)

6. Vergleichen Sie die statistischen Informationen einer Abfrage, die für eine Tabelle ohne Indizes ausgeführt wurde, mit der gleichen Abfrage, die für eine Tabelle mit nützlichen Indizes ausgeführt wurde. Wurden die E/A-Vorgänge durch das Hinzufügen von Indizes reduziert? Ja. Wenn Indizes vorhanden sind, liest der Abfrageoptimierer nur die Seiten, die erforderlich sind, um die Ergebnisse zurückzugeben. ____________________________________________________________

____________________________________________________________

7. Klicken Sie auf die Registerkarte Ausführungsplan, um den Ausführungs-plan grafisch anzuzeigen.

8. Untersuchen Sie den Ausführungsplan. Mit welcher Verknüpfungsstrategie hat der Abfrageoptimierer die Verknüp-fung verarbeitet? Mergeverknüpfung/innere Verknüpfung. Der Abfrageoptimierer scannt Teile des Indexes für die „charge“-Tabelle und Teile des Indexes für die „member“-Tabelle. Der Abfrageoptimierer konnte diese Infor-mationen verknüpfen (zusammenführen) und die angeforderten Infor-mationen zurückgeben. ____________________________________________________________

____________________________________________________________

____________________________________________________________

____________________________________________________________

Warum hat der Abfrageoptimierer diese Strategie ausgewählt? Der Abfrageoptimierer hat diese Strategie ausgewählt, da er die Ab-frage für jede Tabelle abdecken konnte. Da der Abfrageoptimierer die Abfrage abgedeckt hat, hat er nur die Seiten auf Blattebene der nicht gruppierten Indizes gescannt, die in sortierter Reihenfolge gepflegt wer-den. Dadurch konnte die Mergeverknüpfung die Vorteile der Eingaben von jeder Tabelle nutzen, die bereits sortiert waren. ____________________________________________________________

____________________________________________________________

____________________________________________________________

____________________________________________________________

Page 806: Programmieren Einer Microsoft SQL Server 2000-Datenbank

56 Unterrichtseinheit 14: Analysieren von Abfragen

Übung 3 Verarbeiten von Hashverknüpfungen

In dieser Übung werden Sie alle Indizes für die member-Tabelle und die charge-Tabelle löschen, eine Abfrage ausführen und beobachten, wie der Abfrageoptimierer die Abfrage mit Hilfe einer Hashverknüpfungsstrategie verarbeitet.

Sie können Abschnitte der Skriptdatei HashJoin.sql in C:\Moc\2328A\Labfiles\L14 öffnen, überprüfen und ausführen oder die bereitgestellten Transact-SQL-Anweisungen eingeben und ausführen.

� So beobachten Sie, wie eine Abfrage mit Hilfe der Hashverknüpfungs-strategie verarbeitet wird

In diesem Verfahren werden Sie alle Indizes für die member-Tabelle und die charge-Tabelle löschen, eine Abfrage ausführen und auswerten, wie der Ab-frageoptimierer die Abfrage verarbeitet. 1. Geben Sie diese Anweisungen ein, und führen Sie sie aus, um vorhandene

Indizes für die member-Tabelle und die charge-Tabelle zu löschen: USE credit EXEC index_cleanup member EXEC index_cleanup charge

2. Geben Sie die SELECT-Anweisung ein, und führen Sie sie aus, um die Mitgliedsnummer, den Nachnamen und die Gebührennummer zu Mit-gliedern mit dem Nachnamen Barr und dem Vornamen Bos abzurufen: USE credit SELECT m.member_no, lastname, charge_no FROM member m JOIN charge c ON m.member_no = c.member_no WHERE m.lastname = 'BARR' AND firstname = 'BOS'

3. Klicken Sie auf die Registerkarte Ausführungsplan, um den Ausführungs-plan grafisch anzuzeigen.

4. Untersuchen Sie den Ausführungsplan. Mit welcher Strategie hat der Abfrageoptimierer diese Zeilen gefunden? Begründung? Hashübereinstimmung/innere Verknüpfung. Wenn keine Indizes vor-handen sind, muss der Abfrageoptimierer beide Tabellen scannen, um die angeforderten Zeilen zu finden. Dann erstellt der Abfrageoptimie-rer eine Hashtabelle aus den qualifizierenden Zeilen der „member“-Tabelle, verarbeitet jede Zeile der „charge“-Tabelle und gibt die über-einstimmenden Zeilen zurück. ____________________________________________________________

____________________________________________________________

____________________________________________________________

____________________________________________________________

Page 807: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 14: Analysieren von Abfragen 57

Empfohlene Methoden

Definieren eines Indexes für eine Spalte mit hoher SelektivitätDefinieren eines Indexes für eine Spalte mit hoher Selektivität

Sicherstellen, dass nützliche Indizes für alle Spalten vorhandensind, auf die im OR-Operator verwiesen wirdSicherstellen, dass nützliche Indizes für alle Spalten vorhandensind, auf die im OR-Operator verwiesen wird

Minimieren der Verwendung von HashverknüpfungenMinimieren der Verwendung von Hashverknüpfungen

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Beim Analysieren von Abfragen, in denen der AND-Operator und der OR-Operator oder Verknüpfungsoperationen verwendet werden, sollten Sie die folgenden Methoden berücksichtigen:

� Definieren eines Indexes für eine Spalte mit hoher Selektivität. Die beste Methode zum Indizieren für Abfragen mit dem AND-Operator ist es, wenn mindestens ein sehr selektives Suchkriterium vorhanden ist und ein Index für die Spalte definiert wurde.

� Sicherstellen, dass nützliche Indizes für alle Spalten vorhanden sind, auf die im OR-Operator verwiesen wird.

� Minimieren der Verwendung von Hashverknüpfungen durch das Erstellen nützlicher Indizes und das Schreiben effizienter Abfragen.

ThemaListen Sie die empfohlenen Methoden beim Analysieren von Abfragen auf, in denen der AND-Operator und der OR-Operator oder Verknüp-fungsoperationen verwendet werden.

EinstiegBeim Analysieren von Ab-fragen, in denen der AND-Operator und der OR-Operator oder Verknüp-fungsoperationen verwendet werden, sollten Sie die folgenden Methoden berücksichtigen.

Page 808: Programmieren Einer Microsoft SQL Server 2000-Datenbank

58 Unterrichtseinheit 14: Analysieren von Abfragen

Lernzielkontrolle

� Abfragen mit dem AND-Operator

� Abfragen mit dem OR-Operator

� Abfragen mit Verknüpfungsoperationen

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

1. Sie schreiben Abfragen für eine Anwendung. Sie kennen die Vorteile nicht genau, die das Verwenden mehrerer Einschränkungen in der WHERE-Klausel mit Hilfe des AND-Operators bietet. Nennen Sie einige Vorteile, die das Verwenden mehrerer AND-Operatoren in den Abfragen bietet. Je mehr AND-Operatoren Sie verwenden, desto einschränkender wird die Abfrage. Durch das Verwenden mehrerer AND-Operatoren könnte die Abfrage viele Indizes verwenden, oder es wird eine bessere Auswahl von Indizes angeboten.

2. Eine Abfrage weist eine schlechte Leistung auf. Der Abfrageoptimierer führt gerade einen Tabellenscan durch, obwohl für einige der Spalten, auf die in der WHERE-Klausel verwiesen wird, Indizes vorhanden sind. Wo-durch könnte die schlechte Leistung der folgenden Abfrage verursacht sein? SELECT * FROM member WHERE lastname = 'GOHAN' OR expr_dt < '31.12.1999' OR region_no = 7

Wenn der OR-Operator in einer Abfrage verwendet wird, muss jede Spalte, die den OR-Operator verwendet, einen Index oder einen nütz-lichen Index aufweisen. Wenn nur eine Spalte keinen Index oder keinen nützlichen Index aufweist, führt der Abfrageoptimierer einen Tabellen-scan durch.

ThemaVertiefen Sie die Lernziele dieser Unterrichtseinheit, indem Sie die Kernpunkte wiederholen.

EinstiegDie Fragen zur Lernziel-kontrolle beziehen sich auf einige der Schlüsselkon-zepte, die Inhalt dieser Unterrichtseinheit sind.

Page 809: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 14: Analysieren von Abfragen 59

3. Eine der Abfragen weist eine ausreichende Leistung auf, aber Sie möchten ermitteln, ob Sie die Leistung verbessern können. Zurzeit führt der Abfrage-optimierer eine Hashverknüpfungsoperation durch. Welche Schritte können durchgeführt werden, um die Leistung möglicherweise zu verbessern? Eine Hashverknüpfung weist nicht unbedingt eine schlechte Leistung auf. Um die Leistung zu verbessern, überprüfen Sie, ob die Verknüp-fungsspalten über Indizes oder nützliche Indizes verfügen. Sie können außerdem überprüfen, ob die Abfrage eine WHERE-Klausel enthält, ob die Suchbedingung die Suche beschränkt und ob nützliche Indizes für die Spalten vorhanden sind, auf die in der WHERE-Klausel ver-wiesen wird.

Page 810: Programmieren Einer Microsoft SQL Server 2000-Datenbank

2 Unterrichtseinheit 14: Analysieren von Abfragen

This page is intentionally left blank.

Page 811: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 15: Verwalten von Transaktionen und Sperren

Inhalt

Übersicht 1

Einführung in Transaktionen und Sperren 2

Verwalten von Transaktionen 4

SQL Server-Sperren 13

Verwalten von Sperren 22

Empfohlene Methoden 33

Übungseinheit A: Verwalten von Transaktionen und Sperren 34

Lernzielkontrolle 45

Page 812: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Die in diesen Unterlagen enthaltenen Angaben und Daten können ohne vorherige Ankündigung geändert werden. Die in diesen Unterlagen genannten Firmen, Produkte, Menschen, Charaktere und/oder Daten sind frei erfunden und sollen keine wirklichen Individuen, Gesellschaften, Produkte oder Veranstaltungen darstellen, soweit nichts anderes angegeben ist. Die Benutzer/innen sind verpflichtet, sich an alle anwendbaren Urheberrechtsgesetze zu halten. Ohne ausdrückliche schriftliche Erlaubnis der Microsoft Corporation darf kein Teil dieser Unterlagen für irgendwelche Zwecke vervielfältigt oder übertragen werden, unabhängig davon, auf welche Art und Weise oder mit welchen Mitteln, elektronisch oder mechanisch, dies geschieht. Wenn auf dieses Dokument nur auf elektronischem Wege zugegriffen werden kann, sind Sie hiermit berechtigt, eine (1) Kopie zum persönlichen Gebrauch auszudrucken.

Microsoft Corporation kann Inhaber von Patenten oder Patentanträgen, Marken, Urheberrechten oder anderen gewerblichen Schutzrechten sein, die den Inhalt dieses Dokuments betreffen. Die Bereitstellung dieses Dokuments gewährt keinerlei Lizenzrechte an diesen Patenten, Marken, Urheberrechten oder anderen gewerblichen Schutzrechten, es sei denn, dies wurde ausdrücklich durch einen schriftlichen Lizenzvertrag mit der Microsoft Corporation vereinbart.

2000 Microsoft Corporation. Alle Rechte vorbehalten.

Microsoft, ActiveX, BackOffice, MS-DOS, PowerPoint, Visual Basic, Visual C++, Visual Studio, Windows und Windows NT sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern.

Andere in diesem Dokument aufgeführte Produkt- und Firmennamen sind möglicherweise Marken der jeweiligen Eigentümer.

Project Lead: Rich Rose Instructional Designers: Rich Rose, Cheryl Hoople, Marilyn McGill Instructional Software Design Engineers: Karl Dehmer, Carl Raebler, Rick Byham Technical Lead: Karl Dehmer Subject Matter Experts: Karl Dehmer, Carl Raebler, Rick Byham Graphic Artist: Kirsten Larson (Independent Contractor) Editing Manager: Lynette Skinner Editor: Wendy Cleary Copy Editor: Edward McKillop (S&T Consulting) Production Manager: Miracle Davis Production Coordinator: Jenny Boe Production Support: Lori Walker (S&T Consulting) Test Manager: Sid Benavente Courseware Testing: TestingTesting123 Classroom Automation: Lorrin Smith-Bates Creative Director, Media/Sim Services: David Mahlmann Web Development Lead: Lisa Pease CD Build Specialist: Julie Challenger Online Support: David Myka (S&T Consulting) Localization Manager: Rick Terek Operations Coordinator: John Williams Manufacturing Support: Laura King; Kathy Hershey Lead Product Manager, Release Management: Bo Galford Lead Product Manager, Data Base: Margo Crandall Group Manager, Courseware Infrastructure: David Bramble Group Product Manager, Content Development: Dean Murray General Manager: Robert Stewart

Page 813: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 15: Verwalten von Transaktionen und Sperren iii

Hinweise für den Kursleiter Diese Unterrichtseinheit vermittelt den Kursteilnehmern Informationen darüber, wie Transaktionen und Sperren verwendet werden, um die Integrität von Trans-aktionen bei gleichzeitiger Verwendung sicherzustellen. Anschließend folgt eine Diskussion darüber, wie Transaktionen ausgeführt werden und wie ein Rollback für die Transaktion ausgeführt wird. Eine kurze Animation soll ver-deutlichen, wie die Transaktionsverarbeitung abläuft.

Als Nächstes wird beschrieben, wie Microsoft® SQL Server™ 2000-Sperren die Datenkonsistenz und Parallelität aufrechterhalten. Es werden Ressourcen, die gesperrt werden können, verschiedene Typen von Sperren und die Kompatibili-tät von Sperren werden vorgestellt. Im letzten Abschnitt werden einige Sperr-optionen erläutert, Deadlocks beschrieben, und es wird erklärt, wie Informatio-nen zu aktiven Sperren angezeigt werden.

In der Übungseinheit definieren die Kursteilnehmer eine Transaktion und beob-achten die Auswirkungen von BEGIN TRAN-, COMMIT TRAN- und ROLLBACK TRAN-Anweisungen. Danach beobachten sie, welche Auswir-kungen es hat, verschiedene Sperroptionen auf eine Transaktion anzuwenden.

Am Ende dieser Unterrichtseinheit werden die Kursteilnehmer in der Lage sein, die folgenden Aufgaben auszuführen:

� Beschreiben der Transaktionsverarbeitung. � Ausführen oder Abbrechen einer Transaktion bzw. Ausführen eines Roll-

backs für eine Transaktion. � Identifizieren von Problemen mit der Parallelität von Sperren. � Identifizieren der Ressourcen, die gesperrt werden können, und der Typen

von Sperren. � Beschreiben der Kompatibilität von Sperren. � Beschreiben, wie Microsoft SQL Server 2000 dynamisches Sperren ver-

wendet. � Festlegen von Sperroptionen und Anzeigen von Sperrinformationen.

Unterlagen und Vorbereitung In diesem Abschnitt werden die erforderlichen Unterlagen und vorbereitenden Aufgaben erläutert, die nötig sind, um diese Unterrichtseinheit zu unterrichten.

Erforderliche Unterlagen Um diese Unterrichtseinheit zu unterrichten, benötigen Sie folgende Unterlagen:

� Die Microsoft PowerPoint®-Datei 2328A_15.ppt� Die Beispieldatei C:\Moc\2328A\Demo\D15_Ex.sql, die alle Beispiel-

skripts der Unterrichtseinheit enthält, soweit in der Unterrichtseinheit nichts anderes angegeben ist.

Präsentation:45 Minuten

Übungseinheit:60 Minuten

Page 814: Programmieren Einer Microsoft SQL Server 2000-Datenbank

iv Unterrichtseinheit 15: Verwalten von Transaktionen und Sperren

Vorbereitende Aufgaben Zur Vorbereitung dieser Unterrichtseinheit gehen Sie folgendermaßen vor:

� Lesen Sie alle Unterlagen für diese Unterrichtseinheit. � Arbeiten Sie die Übungseinheit durch. � Machen Sie sich mit der Präsentation einschließlich der Animation vertraut. � Gehen Sie alle relevanten Whitepaper durch, die sich auf der Kursleiter-CD

befinden.

MultimediapräsentationIn diesem Abschnitt werden die Verfahren für die Multimediapräsentation zur Verfügung gestellt, die weder in den Randnotizen enthalten noch für die Unter-lagen der Kursteilnehmer geeignet sind.

SQL Server-Transaktionen � So bereiten Sie die Multimediapräsentation vor • Klicken Sie auf die Schaltfläche auf der Folie, um die Multimediapräsen-

tation zu starten. Bei dieser Multimediapräsentation wird die SQL Server-Transaktionsver-arbeitung vorgestellt. Es wird mit der Definition einer Transaktion begon-nen, und es werden die beiden Typen von Transaktionen erläutert: die impli-ziten und die expliziten Transaktionen. Anschließend wird erklärt, wie es möglich ist, eine Transaktion abzubrechen oder einen Rollback für eine Transaktion auszuführen. In der Präsentation wird anschließend das Transaktionsprotokoll beschrie-ben, das die Datenbankkonsistenz aufrechterhält, und es wird erklärt, wie Änderungen im Protokoll auf dem Datenträger aufgezeichnet werden, bevor sie in die Datenbank geschrieben werden. Es wird außerdem beschrieben, wie Prüfpunkte im Protokoll anzeigen, welche Transaktionen auf die Daten-bank angewendet wurden. Abschließend wird der automatische Wiederher-stellungsvorgang beschrieben.

Page 815: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 15: Verwalten von Transaktionen und Sperren v

Sonstige Aktivitäten In diesem Abschnitt werden Verfahren bereitgestellt, mit denen interaktive Aktivitäten zum Anzeigen und Überprüfen von Informationen implementiert werden, wie Spiele oder Übungen mit Rollenspielen.

Anzeigen der Animation Alle Animationen sind durch ein Hyperlinksymbol in der unteren linken Ecke der Folie gekennzeichnet.

� So zeigen Sie die Folie zur Transaktionswiederherstellung und zu den Prüfpunkten an

Diese Folie zeigt, wie SQL Server im Falle eines Systemausfalls auf einfache Weise Transaktionen wiederherstellen kann. 1. Zeigen Sie die Folie mit dem Thema an, auf der die für eine Transaktions-

wiederherstellung erforderlichen Aktionen angezeigt werden. 2. Fahren Sie mit der ersten Animation fort, bei der der Pfeil für die Trans-

aktion 1 vor der Markierung für den Prüfpunkt endet. Es ist keine Aktion erforderlich, da die Transaktion in der Datenbank widergespiegelt wird.

3. Fahren Sie mit der nächsten Animation fort, bei der der Pfeil für die Trans-aktion 2 vor der Markierung für den Prüfpunkt beginnt und nach der Mar-kierung endet. Für die Transaktion muss ein Rollforward ausgeführt werden, da ein Teil der Transaktion nach dem Prüfpunkt stattgefunden hat.

4. Fahren Sie mit der nächsten Animation fort, bei der der Pfeil für die Trans-aktion 3 vor der Markierung für den Prüfpunkt beginnt und erst nach der Markierung für den Systemausfall endet. Für die Transaktion muss ein Rollback ausgeführt werden.

5. Fahren Sie mit der nächsten Animation fort, bei der der Pfeil anzeigt, dass für die Transaktion 4 nach dem Prüfpunkt ein Commit ausgeführt wird. Sie muss aus dem Protokoll rekonstruiert werden (Rollforward).

6. Fahren Sie mit der letzten Animation fort, bei der der Pfeil für die Trans-aktion 5 nach der Markierung für den Prüfpunkt beginnt und erst nach der Markierung für den Systemausfall endet. Für die Transaktion muss ein Rollback ausgeführt werden.

Page 816: Programmieren Einer Microsoft SQL Server 2000-Datenbank

vi Unterrichtseinheit 15: Verwalten von Transaktionen und Sperren

Strategie für die Unterrichtseinheit Verwenden Sie die folgende Strategie, um diese Unterrichtseinheit zu präsentieren:

� Einführung in Transaktionen und Sperren Geben Sie eine Einführung in die Begriffe und Konzepte, die in der Unter-richtseinheit verwendet werden. Gehen Sie sicher, dass die Kursteilnehmer den Zusammenhang zwischen den Konzepten verstehen.

� Verwalten von Transaktionen Spielen Sie die Multimediapräsentation ab. Beschreiben Sie, wie eine Transaktion definiert wird, beschreiben Sie Einschränkungen für Trans-aktionen, erläutern Sie, wie SQL Server Transaktionen verarbeitet, und gehen Sie auf die Transaktionswiederherstellung und auf Prüfpunkte ein. Stellen Sie sicher, dass die Kursteilnehmer verstehen, was Transaktionen sind und wie eine Transaktion bei einer automatischen Wiederherstellung verwendet wird.

� SQL Server-Sperren Beschreiben Sie Probleme mit der Parallelität von Sperren, Ressourcen, die gesperrt werden können, Typen von Sperren und die Kompatibilität von Sperren. Weisen Sie darauf hin, dass fehlende Sperren zu Problemen führen können und dass SQL Server diese Probleme automatisch behebt. Machen Sie die Kursteilnehmer darauf aufmerksam, dass sich Änderungen an ihren Transaktionen negativ auf die Leistung auswirken können.

� Verwalten von Sperren Beschreiben Sie Sperroptionen auf Sitzungs- und auf Tabellenebene, er-klären Sie, was Deadlocks sind, und beschreiben Sie, wie Sperrinforma-tionen angezeigt werden. Betonen Sie, dass die Kursteilnehmer Trans-aktionen entwerfen sollten, um die Anzahl von Deadlocks zu reduzieren. Sie sollten die Transaktionen außerdem testen, um zu ermitteln, ob in einer Transaktion ein Deadlock auftritt.

Page 817: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 15: Verwalten von Transaktionen und Sperren vii

AnpassungsinformationenDieser Abschnitt beschreibt die Anforderungen zum Einrichten der Übungs-einheiten für eine Unterrichtseinheit sowie die Konfigurationsänderungen, die während der Übungseinheiten an den Kursteilnehmercomputern vorgenommen werden. Diese Informationen sollen Ihnen beim Replizieren oder Anpassen der Microsoft Official Curriculum-Courseware (MOC) helfen.

Die Übungseinheit in dieser Unterrichtseinheit hängt auch von der Schulungsraumkonfiguration ab, die im Abschnitt „Anpassungsinformationen“ am Ende des Dokuments Handbuch für das Einrichten von Schulungs-computern für Kurs 2328A, Programmieren einer Microsoft SQL Server 2000-Datenbank, angegeben ist.

Einrichten der Übungseinheit Anforderung zum Einrichten der Übungseinheit Für die Übungseinheit in dieser Unterrichtseinheit muss sich die ClassNorthwind-Datenbank in einem für die Übungseinheit erforderlichen Status befinden. Um die Kursteilnehmercomputer so vorzubereiten, dass sie diese Anforderung erfüllen, führen Sie eine der beiden folgenden Aktionen durch:

� Bearbeiten der vorherigen Übungseinheit. � Ausführen der Batchdatei C:\Moc\2328A\Batches\Restore15.cmd.

Ergebnisse der Übungseinheit Auf den Kursteilnehmercomputern gibt es keine Konfigurationsänderungen, die die Replikation oder die Anpassung betreffen.

Wichtig

Page 818: Programmieren Einer Microsoft SQL Server 2000-Datenbank

viii Unterrichtseinheit 15: Verwalten von Transaktionen und Sperren

This page is intentionally left blank.

Page 819: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 15: Verwalten von Transaktionen und Sperren 1

Übersicht

� Einführung in Transaktionen und Sperren

� Verwalten von Transaktionen

� SQL Server-Sperren

� Verwalten von Sperren

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

LernzieleAm Ende dieser Unterrichtseinheit werden Sie in der Lage sein, die folgenden Aufgaben auszuführen:

� Beschreiben der Transaktionsverarbeitung. � Ausführen oder Abbrechen einer Transaktion bzw. Ausführen eines Roll-

backs für eine Transaktion. � Identifizieren von Problemen mit der Parallelität von Sperren. � Identifizieren der Ressourcen, die gesperrt werden können, und der Typen

von Sperren. � Beschreiben der Kompatibilität von Sperren. � Beschreiben, wie Microsoft® SQL Server™ 2000 dynamisches Sperren

verwendet. � Festlegen von Sperroptionen und Anzeigen von Sperrinformationen.

ThemaGeben Sie eine Übersicht über die Themen und Lern-ziele dieser Unterrichts-einheit.

EinstiegIn dieser Unterrichtseinheit werden die folgenden Themen behandelt...

Page 820: Programmieren Einer Microsoft SQL Server 2000-Datenbank

2 Unterrichtseinheit 15: Verwalten von Transaktionen und Sperren

Einführung in Transaktionen und Sperren

� Transaktionen stellen sicher, dass mehrereDatenänderungen zusammen verarbeitet werden

� Sperren verhindern Aktualisierungskonflikte

� Transaktionen sind serialisierbar

� Das Sperren geschieht automatisch

� Sperren ermöglichen die parallele Verwendungvon Daten

� Parallelitätssteuerung

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Transaktionen verwenden Sperren, um zu verhindern, dass andere Benutzer Daten in einer nicht abgeschlossenen Transaktion ändern oder lesen. Sperren werden in OLTP (Online Transaction Processing, Onlinetransaktions-Verarbei-tung) für Mehrbenutzersysteme benötigt. SQL Server stellt mit Hilfe des Trans-aktionsprotokolls sicher, dass Aktualisierungen abgeschlossen und wiederherstellbar sind.

TransaktionenMit Hilfe von Transaktionen ist sichergestellt, dass mehrere Datenänderungen als Einheit verarbeitet werden. Dieses Merkmal wird als Unteilbarkeit bezeich-net. Es wäre z. B. möglich, dass bei einer Banktransaktion einem Konto ein Be-trag gutgeschrieben und ein anderes Konto belastet wird. Beide Schritte müssen zusammen ausgeführt werden. SQL Server unterstützt die Transaktionsverar-beitung, um mehrere Transaktionen zu verwalten.

SperrenSperren verhindern Aktualisierungskonflikte. Benutzer können Daten, die gerade von anderen Benutzern geändert werden, weder lesen noch ändern. Wenn Sie z. B. eine Summe berechnen und sicherstellen möchten, dass keine andere Transaktion die zur Berechnung der Summe verwendeten Daten ändert, können Sie das veranlassen, dass das System die Daten mit Sperren belegt. Berücksichtigen Sie die folgenden Aspekte in Bezug auf Sperren:

� Sperren ermöglichen die Serialisierung von Transaktionen, sodass nur jeweils eine Person ein Datenelement ändern kann. Beispielsweise stellen Sperren in einem Flugreservierungssystem sicher, dass ein bestimmter Sitzplatz nur für eine Person reserviert wird.

� SQL Server legt die richtige Sperrebene während einer Transaktion dynamisch fest und passt sie an. Darüber hinaus können Sie manuell steuern, wie einige Sperren verwendet werden.

ThemaGeben Sie eine Einführung in dieses Thema.

EinstiegTransaktionen und Sperren stellen die Integrität von Transaktionen sicher.

Methodischer Hinweis Diese Unterrichtseinheit be-handelt schwerpunktmäßig OLTP (Online Transaction Processing, Onlinetrans-aktions-Verarbeitung) an-stelle von abfrageintensiven Anwendungen wie z. B. Data Warehousing- und Decision Support-Anwen-dungen.

Page 821: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 15: Verwalten von Transaktionen und Sperren 3

� Sperren werden für parallele Transaktionen benötigt, damit Benutzer zur gleichen Zeit auf Daten zugreifen und diese aktualisieren können. Eine hohe Parallelität bedeutet, dass eine Reihe von Benutzern auf Daten zugreifen können und dabei gute Antwortzeiten mit wenigen Konflikten zu verzeich-nen sind. Die wichtigsten Aspekte aus der Sicht des Systemadministrators sind hierbei die Anzahl der Benutzer, die Anzahl der Transaktionen und der Durchsatz. Aus der Sicht des Benutzer spielt die Antwortzeit die wichtigste Rolle.

Parallelitätssteuerung Durch eine Parallelitätssteuerung ist sichergestellt, dass Änderungen, die ein Benutzer vornimmt, nicht die Änderungen anderer Benutzer beeinträchtigt. Es gibt zwei Typen.

� Die Steuerung durch eingeschränkte Parallelität ermöglicht das Sperren von Daten, wenn sie zur Vorbereitung auf eine Aktualisierung gelesen werden. Andere Benutzer können in diesem Fall keine Aktionen ausführen, die die zugrunde liegenden Daten ändern würden, bis der Benutzer, der die Sperre angewendet hat, die Daten vollständig gelesen hat. Verwenden Sie die ein-geschränkte Parallelität, wenn ein hohes Konfliktrisiko für Daten besteht und die Kosten für das Schützen der Daten mit Sperren niedriger sind als die Kosten, die entstehen, wenn im Falle von Parallelitätskonflikten für Trans-aktionen ein Rollback ausgeführt wird.

� Bei der Steuerung durch vollständige Parallelität werden Daten beim ersten Lesen nicht gesperrt. Stattdessen führt SQL Server im Falle einer Aktuali-sierung eine Überprüfung durch, um zu ermitteln, ob die zugrunde liegen-den Daten seit dem ersten Lesen geändert wurden. Ist dies der Fall, erhält der Benutzer eine Fehlermeldung, für die Transaktion wird ein Rollback ausgeführt, und der Benutzer muss noch einmal von vorn anfangen. Ver-wenden Sie die vollständige Parallelität, wenn ein geringes Konfliktrisiko für Daten besteht und die Kosten, die entstehen, wenn gelegentlich für eine Transaktion ein Rollback ausgeführt wird, niedriger sind als die Kosten für das Sperren von Daten, wenn sie gelesen werden.

SQL Server unterstützt eine Vielzahl von Steuerungsmechanismen durch vollständige und eingeschränkte Parallelität. Benutzer geben den Typ der Steuerung durch Parallelität anhand der Transaktionsisolationsstufe einer Verbindung an.

Page 822: Programmieren Einer Microsoft SQL Server 2000-Datenbank

4 Unterrichtseinheit 15: Verwalten von Transaktionen und Sperren

���� Verwalten von Transaktionen

� Multimediapräsentation: SQL Server-Transaktionen

� Transaktionswiederherstellung und Prüfpunkte

� Überlegungen zum Verwenden von Transaktionen

� Festlegen der Option für implizite Transaktionen

� Einschränkungen für benutzerdefinierte Transaktionen

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

In diesem Abschnitt wird beschrieben, wie Transaktionen definiert werden, was bei der Verwendung von Transaktionen zu berücksichtigen ist, wie die Option für implizite Transaktionen festgelegt wird und welche Einschränkungen für die Verwendung von Transaktionen gelten. Außerdem wird die Verarbeitung und die Wiederherstellung von Transaktionen erläutert.

ThemaGeben Sie eine Übersicht über dieses Thema.

EinstiegIn diesem Abschnitt werden folgende Themen behan-delt...

Page 823: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 15: Verwalten von Transaktionen und Sperren 5

Multimediapräsentation: SQL Server-Transaktionen

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

In SQL Server werden zwei Arten von Transaktionen unterschieden:

� In einer impliziten Transaktion wird jede Transact-SQL-Anweisung, wie z. B. eine INSERT-, UPDATE- oder DELETE-Anweisung, als Transaktion ausgeführt.

� In einer expliziten bzw. benutzerdefinierten Transaktion werden die Anwei-sungen der Transaktion zwischen einer BEGIN TRANSACTION- und einer COMMIT TRANSACTION-Klausel gruppiert.

Ein Benutzer kann einen Sicherungspunkt (auch Marker genannt) innerhalb einer Transaktion festlegen. Ein Sicherungspunkt definiert einen Standort, an den eine Transaktion zurückkehren kann, wenn ein Teil der Transaktion abge-brochen wird. Die Transaktion muss dann abgeschlossen werden, oder für die gesamte Transaktion muss ein Rollback ausgeführt werden.

SQL Server-Transaktionen verwenden folgende Syntax.

BEGIN TRAN[SACTION] [transaction_name | @tran_name_variable [WITH MARK [‘description’]]]

Die Option transaction_name gibt einen benutzerdefinierten Transaktions-namen an. Der Name tran_name_variable bezeichnet eine benutzerdefinierte Variable, die einen gültigen Transaktionsnamen enthält. WITH MARK gibt an, dass die Transaktion im Transaktionsprotokoll markiert ist. Die Zeichenfolge Description beschreibt eine Markierung zum Wiederherstellen eines Trans-aktionsprotokolls bis zu einer benannten Markierung. WITH MARK zeigt an, dass diese Markierung zulässig ist.

SAVE TRAN[SACTION] {savepoint_name | @savepoint_variable}

BEGIN DISTRIBUTED TRAN[SACTION] [transaction_name | @tran_name_variable]

COMMIT [TRAN[SACTION] [transaction_name | @tran_name_variable]]

ThemaZeigen Sie ein Beispiel für eine Transaktionsverarbei-tung an.

EinstiegIn dieser Präsentation wird vorgeführt, wie Trans-aktionen verarbeitet werden und wie das Transaktions-protokoll funktioniert.

Methodischer Hinweis Aktivieren Sie in Microsoft Windows Media Player im Menü Ansicht die Option Beschreibung, um die Untertitel der Präsentation anzuzeigen.

KernpunktEine Transaktion, für die ein Commit durchgeführt wurde, kann nicht rückgängig ge-macht oder per Rollback zurückgesetzt werden.

Syntax

Syntax

Syntax

Syntax

Page 824: Programmieren Einer Microsoft SQL Server 2000-Datenbank

6 Unterrichtseinheit 15: Verwalten von Transaktionen und Sperren

ROLLBACK [TRAN[SACTION] [transaction_name | @tran_name_variable | savepoint_name | @savepoint_variable]]

In diesem Beispiel wird eine Transaktion zum Überweisen von Beträgen vom laufenden Konto auf das Sparkonto eines Kunden definiert.

BEGIN TRAN fund_transfer EXEC debit_checking 100, 'account1' EXEC credit_savings 100, 'account1'COMMIT TRAN fund_transfer

Beschreiben des Transaktionsprotokolls Um die Datenbankkonsistenz zu gewährleisten und eine problemlose Wieder-herstellung zu ermöglichen, werden sämtliche Transaktionen in einem Trans-aktionsprotokoll aufgezeichnet. Das Protokoll ist ein Speicherbereich, der auto-matisch alle Änderungen an einer Datenbank mit Ausnahme von nicht protokol-lierten Vorgängen nachverfolgt. Die Änderungen werden während ihrer Aus-führung und noch bevor sie in die Datenbank geschrieben werden im Protokoll auf dem Datenträger aufgezeichnet.

Syntax

Beispiel

Das Beispiel kann nicht aus-geführt werden, da die ver-wendeten gespeicherten Prozeduren nicht vorhanden sind.

Page 825: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 15: Verwalten von Transaktionen und Sperren 7

Transaktionswiederherstellung und Prüfpunkte

Transaktionswiederherstellung Erforderliche Aktion

Keine

Prüfpunkt Systemausfall

11

22

33

44

55

Rollforward

Rollback

Rollforward

Rollback

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Da das Transaktionsprotokoll alle Transaktionen aufzeichnet, kann SQL Server im Fall eines Stromausfalls, eines Absturzes der Systemsoftware, eines Client-problems oder einer Aufforderung zum Abbruch einer Transaktion die Daten automatisch wiederherstellen.

SQL Server gewährleistet automatisch, dass alle Transaktionen, für die ein Commit ausgeführt wurde, im Fall eines Systemausfalls in der Datenbank widergespiegelt werden. SQL Server führt mit Hilfe des Transaktionsprotokolls ein Rollforward für alle Transaktionen aus, für die ein Commit ausgeführt wurde, und ein Rollback für alle Transaktionen, für die kein Commit ausgeführt wurde. Auf der Folie wird anhand des Beispiels Folgendes gezeigt:

� Für Transaktion 1 wird ein Commit vor dem Prüfpunkt ausgeführt, sodass sie in der Datenbank widergespiegelt wird.

� Für die Transaktionen 2 und 4 wurde ein Commit nach dem Prüfpunkt ausgeführt, sodass sie aus dem Protokoll rekonstruiert werden müssen (Rollforward).

� Für die Transaktionen 3 und 5 wurde kein Commit ausgeführt, sodass SQL Server ein Rollback für sie ausführt.

Zu Beginn sind die Seiten im Datencache und auf dem Datenträger identisch. Anschließend läuft der folgende Vorgang ab:

� Änderungen werden im Datencache gespeichert, während für die Trans-aktionen ein Commit ausgeführt wird.

� Wenn sich der Cache füllt, werden die geänderten Seiten auf den Daten-träger geschrieben.

ThemaErläutern Sie den Wieder-herstellungsvorgang.

EinstiegDa das Transaktionsprotokoll alle Änderungen aufzeichnet, können Daten im Fall eines Systemausfalls problemlos wiederhergestellt werden.

Methodischer Hinweis Verwenden Sie die Folie als Diskussionsgrundlage. Fragen Sie die Kursteilneh-mer, warum die einzelnen Aktionen erforderlich sind.

Page 826: Programmieren Einer Microsoft SQL Server 2000-Datenbank

8 Unterrichtseinheit 15: Verwalten von Transaktionen und Sperren

� Findet SQL Server einen Prüfpunkt, so wird der Cache auf den Datenträger geschrieben. Danach weist der Datenträger wieder den gleichen Inhalt wie der Cache auf.

Verwenden Sie nur dann einen Festplattencontroller mit Schreibcache mit SQL Server, wenn er für die Verwendung mit einem Datenbankserver ent-worfen wurde. Andernfalls ist die Verwendung nicht möglich, da SQL Server u. a. keine Transaktionen verwalten kann. Bei Verwendung eines Festplatten-controllers mit Schreibcache kann es so aussehen, als seien Write-Ahead-Proto-kolle vollständig, obwohl sie es tatsächlich nicht sind.

Wichtig

Page 827: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 15: Verwalten von Transaktionen und Sperren 9

Überlegungen zum Verwenden von Transaktionen

� Richtlinien für Transaktionen

� Halten Sie Transaktionen so kurz wie möglich

� Verwenden Sie bestimmte Transact-SQL-Anweisungenmit Vorsicht

� Vermeiden Sie Transaktionen, die Interaktion seitens der Benutzer erfordern

� Aspekte im Zusammenhang mit der Schachtelung von Transaktionen

� Schachtelung ist möglich, aber nicht empfehlenswert

� Verwenden Sie @@trancount zum Ermitteln der Schachtelungsebene

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Es ist im Allgemeinen ratsam, Transaktionen kurz zu halten und das Schachteln von Transaktionen zu vermeiden.

Richtlinien für Transaktionen Transaktionen sollten so kurz wie möglich sein. Bei längeren Transaktionen ist die Wahrscheinlichkeit größer, dass Benutzer nicht auf gesperrte Daten zugrei-fen können. Im Folgenden werden einige Methoden genannt, mit denen Trans-aktionen kurz gehalten werden können:

� Um die Transaktionszeit auf ein Minimum zu reduzieren, sollten Sie be-stimmte Transact-SQL-Anweisungen, wie z. B. die WHILE-Anweisung oder DDL-Anweisungen (Data Definition Language), mit besonderer Vorsicht verwenden.

� Verzichten Sie auf Benutzereingaben während einer Transaktion. Über-denken Sie alle Schritte, die einen Benutzereingriff erfordern, vor Beginn der Transaktion. Wenn Sie z. B. einen Kundendatensatz aktualisieren, sollten Sie die benötigten Informationen vom Benutzer abrufen, bevor Sie die Transaktion starten.

� INSERT, UPDATE und DELETE sollten die Hauptanweisungen in einer Transaktion sein und so geschrieben werden, dass sie sich auf die geringst-mögliche Anzahl von Zeilen auswirken. Eine Transaktion sollte nie kürzer als eine logische Arbeitseinheit sein.

� Öffnen Sie nach Möglichkeit keine Transaktion während des Durchsuchens von Daten. Transaktionen sollten erst gestartet werden, wenn die anfäng-liche Datenanalyse abgeschlossen ist.

� Während einer Transaktion sollte auf so wenige Daten wie möglich zuge-griffen werden. Dadurch wird die Anzahl von gesperrten Zeilen verringert, und es treten weniger Konflikte auf.

ThemaGehen Sie auf die Aspekte ein, die beim Verwenden von Transaktionen eine Rolle spielen.

EinstiegTransaktionen sollten im Allgemeinen so kurz wie möglich gehalten werden.

Page 828: Programmieren Einer Microsoft SQL Server 2000-Datenbank

10 Unterrichtseinheit 15: Verwalten von Transaktionen und Sperren

Aspekte im Zusammenhang mit der Schachtelung von TransaktionenBei der Schachtelung von Transaktionen sollten die folgenden Aspekte berück-sichtigt werden:

� Transaktionen können geschachtelt werden; allerdings hat die Schachtelung keine Auswirkung auf die Verarbeitung der Transaktion durch SQL Server. Sie sollten Schachtelungen vermeiden oder zumindest mit Vorsicht verwen-den, da Sperren auf unbestimmte Zeit bestehen bleiben, wenn für eine Transaktion kein Commit oder Rollback ausgeführt werden konnte. Nur das äußerste BEGIN...COMMIT-Anweisungspaar wird angewendet. Die Transaktionsschachtelung tritt normalerweise auf, wenn sich ge-speicherte Prozeduren mit BEGIN...COMMIT-Anweisungspaaren oder Trigger gegenseitig aufrufen.

� Mit Hilfe der globalen Variablen @@trancount können Sie ermitteln, ob geöffnete Transaktionen vorhanden sind und wie tief sie geschachtelt sind.

• @@trancount hat den Wert 0, wenn keine geöffneten Transaktionen vorhanden sind.

• Eine BEGIN TRAN-Anweisung erhöht @@trancount um den Wert 1, eine ROLLBACK TRAN-Anweisung legt @@trancount auf 0 fest.

Sie können die DBCC OPENTRAN-Anweisung während der aktuellen Sitzung auch verwenden, um Informationen zu aktiven Transaktionen abzurufen.

Anmerkung

Page 829: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 15: Verwalten von Transaktionen und Sperren 11

Festlegen der Option für implizite Transaktionen

� Die Transaktion wird automatisch beim Ausführenbestimmter Anweisungen gestartet

� Geschachtelte Transaktionen sind nicht zulässig

� Die Transaktion muss explizit mit COMMIT oderROLLBACK TRANSACTION abgeschlossen werden

� Die Einstellung ist standardmäßig deaktiviert

SET IMPLICIT_TRANSACTIONS ONSET IMPLICIT_TRANSACTIONS ON

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

In den meisten Fällen sollten Transaktionen explizit mit der BEGIN TRANSACTION-Anweisung definiert werden. Allerdings kann für Anwen-dungen, die ursprünglich auf anderen Systemen als SQL Server entwickelt wurden, die Verwendung der Option SET IMPLICIT_TRANSACTIONS sinn-voll sein. Sie legt den impliziten Transaktionsmodus für eine Verbindung fest.

SET IMPLICIT_TRANSACTIONS {ON OFF}

Berücksichtigen Sie die folgenden Aspekte beim Festlegen von impliziten Transaktionen:

� Wenn der implizite Transaktionsmodus für eine Verbindung aktiviert ist, löst die Ausführung einer der folgenden Anweisungen den Beginn einer Transaktion aus:

ALTER TABLE INSERT

CREATE OPEN

DELETE REVOKE

DROP SELECT

FETCH TRUNCATE TABLE

GRANT UPDATE

� Geschachtelte Transaktionen sind nicht zulässig. Befindet sich die Verbin-dung bereits in einer geöffneten Transaktion, so starten diese Anweisungen keine neue Transaktion.

� Ist die Einstellung aktiviert, muss der Benutzer am Ende der Transaktion explizit einen Commit oder einen Rollback für die Transaktion ausführen. Andernfalls wird für die Transaktion und alle Datenänderungen ein Roll-back ausgeführt, wenn der Benutzer die Verbindung trennt.

� Die Einstellung ist standardmäßig deaktiviert.

ThemaErläutern Sie, wie implizite Transaktionen festgelegt werden.

EinstiegDas Festlegen von impli-ziten Transaktionen kann sinnvoll sein, wenn Anwen-dungen nach SQL Server migriert werden.

Syntax

Page 830: Programmieren Einer Microsoft SQL Server 2000-Datenbank

12 Unterrichtseinheit 15: Verwalten von Transaktionen und Sperren

Einschränkungen für benutzerdefinierte Transaktionen

� ALTER DATABASE

� BACKUP LOG

� CREATE DATABASE

� DROP DATABASE

� RECONFIGURE

� RESTORE DATABASE

� RESTORE LOG

� UPDATE STATISTICS

� Bestimmte Anweisungen dürfen nicht eingeschlossen werden:

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Für benutzerdefinierte Transaktionen gelten einige Einschränkungen:

• Bestimmte Anweisungen dürfen nicht in eine explizite Transaktion einge-schlossen werden. Bei einigen Anweisungen handelt es sich z. B. um Vor-gänge mit langer Ausführungszeit, die Sie wahrscheinlich nicht in einer Transaktion verwenden werden. Im Folgenden werden eingeschränkte Anweisungen aufgeführt:

• ALTER DATABASE

• BACKUP LOG

• CREATE DATABASE

• DROP DATABASE

• RECONFIGURE

• RESTORE DATABASE

• RESTORE LOG

• UPDATE STATISTICS

ThemaVerweisen Sie auf die Elemente, die nicht in benutzerdefinierten Trans-aktionen verwendet werden können.

EinstiegFür benutzerdefinierte Transaktionen gelten einige Einschränkungen.

Page 831: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 15: Verwalten von Transaktionen und Sperren 13

���� SQL Server-Sperren

� Durch Sperren verhinderte Parallelitätsprobleme

� Ressourcen, die gesperrt werden können

� Sperrtypen

� Kompatibilität von Sperren

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

In diesem Abschnitt werden neben Aspekten der Parallelität auch die Ressourcen, die gesperrt werden können, die Typen von Sperren, mit denen diese Ressourcen belegt werden können, und die Möglichkeiten zum Kombi-nieren von Sperren behandelt.

ThemaGeben Sie eine Übersicht über dieses Thema.

EinstiegIn diesem Abschnitt werden folgende Themen behan-delt...

Page 832: Programmieren Einer Microsoft SQL Server 2000-Datenbank

14 Unterrichtseinheit 15: Verwalten von Transaktionen und Sperren

Durch Sperren verhinderte Parallelitätsprobleme

� Verlorene Aktualisierung

� Abhängigkeit von Daten, für die kein Commitausgeführt wurde (Dirty Read)

� Inkonsistente Analyse (nicht wiederholbarerLesevorgang)

� Lesen eines Phantoms

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Sperren können folgende Situationen verhindern, die die Transaktionsintegrität gefährden:

Eine Aktualisierung kann verloren gehen, wenn eine Transaktion die Änderungen einer anderen Transaktion überschreibt. So können z. B. zwei Benutzer die gleichen Daten aktualisieren, doch nur die letzte ge-speicherte Änderung wird in der Datenbank widergespiegelt.

Es kommt dann zu einer Abhängigkeit von Daten, für die kein Commit ausge-führt wurde, wenn eine Transaktion Daten einer anderen Transaktion liest und für diese Daten kein Commit ausgeführt wurde. Eine Transaktion bringt unter Umständen Änderungen mit sich, die auf ungenauen oder nicht vorhandenen Daten basieren.

Eine inkonsistente Analyse wird durchgeführt, wenn eine Transaktion die gleiche Zeile mehrmals liest und die Zeile zwischen den beiden (oder mehreren) Lesevorgängen von einer anderen Transaktion geändert wird. Da die Zeile zwischen Lesevorgängen innerhalb der gleichen Transaktion geändert wurde, führt jeder Lesevorgang zu anderen Werten und damit zu inkonsistenten Daten.

Angenommen, ein Redakteur liest dasselbe Dokument zweimal, doch zwischen den einzelnen Lesedurchgängen schreibt der Verfasser das Dokument um. Wenn der Redakteur das Dokument zum zweiten Mal liest, unterscheidet es sich vollständig von der ersten Version. Der ursprüngliche Lesevorgang lässt sich nicht wiederholen, was zu Verwirrung führt. Es wäre sinnvoller, wenn der Redakteur das Dokument erst dann liest, wenn der Verfasser den Schreib-vorgang vollständig beendet hat.

ThemaBeschreiben Sie häufig auftretende Probleme im Zusammenhang mit der Parallelität von Sperren.

EinstiegSperren stellen eine sinn-volle Maßnahme dar, mit der die Transaktions-integrität in folgenden Situationen sichergestellt werden kann...

Verlorene Aktualisierung

Abhängigkeit von Daten, für die kein Commit ausgeführt wurde (Dirty Read)

Inkonsistente Analyse (nicht wiederholbarer Lesevorgang)

Page 833: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 15: Verwalten von Transaktionen und Sperren 15

Phantome können auftreten, wenn Transaktionen nicht vollständig voneinander getrennt sind. So könnten Sie z. B. eine Aktualisierung aller Datensätze in einem Bereich zur gleichen Zeit vornehmen, zu der eine andere Transaktion einen neuen Datensatz für den Bereich einfügt. Wenn die Transaktion die Daten das nächste Mal liest, ist ein weiterer Datensatz vor-handen.

Lesen eines Phantoms

Page 834: Programmieren Einer Microsoft SQL Server 2000-Datenbank

16 Unterrichtseinheit 15: Verwalten von Transaktionen und Sperren

Ressourcen, die gesperrt werden können

ObjektObjekt BeschreibungBeschreibung

RID Zeilen-ID

Schlüssel Zeilensperre innerhalb eines Indexes

Seite

Block

Tabelle

Eine Datenseite oder Indexseite

Eine Gruppe von Daten- oder Indexseiten

Eine vollständige Tabelle

Datenbank Eine vollständige Datenbank

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Eine optimale Leistung wird erreicht, wenn die Anzahl der von SQL Server auf-rechterhaltenen Sperren auf die Datenmenge abgestimmt ist, die jede Sperre hält. Um die Sperrkosten auf ein Minimum zu reduzieren, sperrt SQL Server automatisch Ressourcen auf einer für die Aufgabe geeigneten Ebene. SQL Server kann die folgenden Arten von Ressourcen sperren.

Objekt Beschreibung

RID Eine Zeilen-ID, die verwendet wird, um eine einzelne Zeile in einer Tabelle zu sperren.

Schlüssel Eine Zeilensperre innerhalb eines Indexes, die verwendet wird, um Schlüsselbereiche in serialisierbaren Transaktionen zu schützen.

Seite Eine Datenseite oder Indexseite mit 8 KB.

Block Eine zusammenhängende Gruppe von Datenseiten oder Indexseiten, die während der Speicherreservierung verwendet wird.

Tabelle Eine vollständige Tabelle mit sämtlichen Daten und Indizes.

Datenbank Eine vollständige Datenbank - wird während der Wiederherstellung einer Datenbank verwendet.

ThemaListen Sie die Ressourcen auf, die von SQL Server gesperrt werden können.

EinstiegDie Anzahl der Sperren muss auf die Datenmenge abgestimmt sein, die jede Sperre hält.

Page 835: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 15: Verwalten von Transaktionen und Sperren 17

Sperrtypen

� Standardsperren

� Gemeinsame Sperren

� Exklusive Sperren

� Sperren für besondere Situationen

� Beabsichtigte Sperren

� Aktualisierungssperren

� Schemasperren

� Massenaktualisierungssperren

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

SQL Server verfügt über zwei Haupttypen von Sperren: Standardsperren und Sperren für besondere Situationen.

StandardsperrenIm Allgemeinen erhalten Lesevorgänge gemeinsame Sperren und Schreibvor-gänge exklusive Sperren.

Gemeinsame Sperren SQL Server verwendet gemeinsame Sperren (Lesesperren) in der Regel für Vorgänge, bei denen Daten weder geändert noch aktualisiert werden. Falls SQL Server eine Ressource mit einer gemeinsamen Sperre belegt hat, kann auch eine zweite Transaktion eine gemeinsame Sperre erhalten, selbst wenn die erste Transaktion noch nicht abgeschlossen ist.

Berücksichtigen Sie die folgenden Aspekte in Bezug auf gemeinsame Sperren:

� Sie werden für Nur-Lese-Vorgänge verwendet; Daten können nicht geändert werden.

� SQL Server hebt gemeinsame Sperren für einen Datensatz auf, sobald der nächste Datensatz gelesen wird.

� Eine gemeinsame Sperre bleibt erhalten, bis alle Zeilen, die die Abfrage erfüllen, an den Client zurückgegeben wurden.

ThemaListen Sie die Sperrtypen auf.

EinstiegSQL Server verfügt über zwei Haupttypen von Sperren: Standardsperren und Sperren für besondere Situationen.

Page 836: Programmieren Einer Microsoft SQL Server 2000-Datenbank

18 Unterrichtseinheit 15: Verwalten von Transaktionen und Sperren

Exklusive Sperren SQL Server verwendet exklusive Sperren (Schreibsperren) für die Datenände-rungsanweisungen INSERT, UPDATE und DELETE.

Berücksichtigen Sie die folgenden Aspekte in Bezug auf exklusive Sperren:

� Nur eine Transaktion kann eine exklusive Sperre für eine Ressource er-halten.

� Eine Transaktion kann keine gemeinsame Sperre für eine Ressource ein-richten, die bereits mit einer exklusiven Sperre belegt wurde.

� Eine Transaktion kann erst dann eine exklusive Sperre einrichten, wenn alle gemeinsamen Sperren aufgehoben wurden.

Sperren für besondere Situationen Je nach Situation kann SQL Server auch andere Typen von Sperren verwenden:

Beabsichtigte Sperren SQL Server verwendet beabsichtigte Sperren intern, um die Sperrkonflikte möglichst gering zu halten. Beabsichtigte Sperren richten eine Sperrhierarchie ein, sodass andere Transaktionen keine Sperren auf höheren Ebenen einrichten können. Wenn z. B. eine Transaktion eine exklusive Sperre auf Zeilenebene für einen bestimmten Kundendatensatz eingerichtet hat, verhindert die beabsich-tigte Sperre, dass eine andere Transaktion eine exklusive Sperre auf Tabellen-ebene einrichtet.

Zu den beabsichtigten Sperren gehören beabsichtigte gemeinsame Sperren (Intent Shared, IS), beabsichtigte exklusive Sperren (Intent Exclusive, IX) und gemeinsame mit beabsichtigten exklusiven Sperren (Shared With Intent Exclusive, SIX).

AktualisierungssperrenSQL Server verwendet Aktualisierungssperren, wenn eine Seite zu einem späteren Zeitpunkt geändert werden soll. Bevor die Seite geändert wird, stuft SQL Server die Aktualisierungssperre für die Seite auf eine exklusive Seiten-sperre herauf, um Sperrkonflikte zu verhindern.

Berücksichtigen Sie die folgenden Aspekte in Bezug auf Aktualisierungs-sperren. Für Aktualisierungssperren gilt Folgendes:

� Aktualisierungssperren werden zu Beginn eines Aktualisierungsvorgangs beim ersten Einlesen der Seiten eingerichtet.

� Aktualisierungssperren sind mit gemeinsamen Sperren kompatibel.

SchemasperrenSchemasperren stellen sicher, dass eine Tabelle oder ein Index nicht gelöscht bzw. das zugehörige Schema nicht geändert wird, falls eine andere Sitzung auf die Tabelle oder den Index verweist.

In SQL Server stehen zwei Arten von Schemasperren zur Verfügung:

� Schemastabilität (Schema Stability, Sch-S), die sicherstellt, dass eine Ressource nicht gelöscht wird.

� Schemaänderung (Schema Modification, Sch-M), die sicherstellt, dass keine anderen Sitzungen auf eine Ressource verweisen, die gerade geändert wird.

Page 837: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 15: Verwalten von Transaktionen und Sperren 19

MassenaktualisierungssperrenMassenaktualisierungssperren ermöglichen das parallele Massenkopieren von Daten in dieselbe Tabelle, während verhindert wird, dass andere Prozesse, die keine Massenkopien von Daten durchführen, auf die Tabelle zugreifen.

SQL Server verwendet Massenaktualisierungssperren, wenn folgende Optionen angegeben werden: Der TABLOCK-Hinweis oder die Option table lock on bulk load, die mit Hilfe der gespeicherten Systemprozedur sp_tableoptionfestgelegt wird.

Page 838: Programmieren Einer Microsoft SQL Server 2000-Datenbank

20 Unterrichtseinheit 15: Verwalten von Transaktionen und Sperren

Kompatibilität von Sperren

� Sperren können mit anderen Sperren kompatibel sein

� Beispiele

� Gemeinsame Sperren sind mit allen Sperren außerexklusiven Sperren kompatibel

� Exklusive Sperren sind mit allen anderen Sperren nichtkompatibel

� Aktualisierungssperren sind nur mit gemeinsamenSperren kompatibel

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Sperren können mit anderen Sperren kompatibel sein. Sperren verfügen über eine Kompatibilitätsmatrix, die anzeigt, welche Sperren mit anderen Sperren, die für dieselbe Ressource eingerichtet werden, kompatibel sind. Die Sperren in der folgenden Tabelle werden beginnend bei der Sperre mit den geringsten Ein-schränkungen (gemeinsam) bis zu den Sperren mit den meisten Einschrän-kungen (exklusiv) aufgelistet.

Vorhandene erteilte Sperre

Angeforderte Sperre IS S U IX SIX X Beabsichtigte gemeinsame Sperre (Intent Shared, IS)

Ja Ja Ja Ja Ja Nein

Gemeinsame Sperre (Shared, S)

Ja Ja Ja Nein Nein Nein

Aktualisierungssperre (Update, U)

Ja Ja Nein Nein Nein Nein

Beabsichtigte exklusive Sperre (Intent Exclusive, IX)

Ja Nein Nein Ja Nein Nein

Gemeinsame Sperre mit beabsichtigter exklusiver Sperre (Shared With Intent Exclusive, SIX)

Ja Nein Nein Nein Nein Nein

Exclusive Sperre (Exclusive, X)

Nein Nein Nein Nein Nein Nein

Eine Sperre des Typs IX ist mit einer anderen Sperre des Typs IX kompatibel, da IX nur die Absicht zur Aktualisierung einiger Zeilen anstatt aller Zeilen anzeigt.

ThemaErläutern Sie, welche Sperren miteinander kompatibel sind.

EinstiegSperren können mit anderen Sperren kompatibel sein.

Methodischer Hinweis Stellen Sie anhand der Beispiele auf der Folie die Sperrmatrix vor.

Anmerkung

Page 839: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 15: Verwalten von Transaktionen und Sperren 21

Die Kompatibilität für Schemasperren stellt sich außerdem wie folgt dar:

� Sperren des Typs Sch-M (Schemaänderung) sind mit allen Sperren inkompatibel.

� Die Sperre des Typs Sch-S (Schemastabilität) ist mit allen Sperren mit Ausnahme der Sperre des Typs Sch-M (Schemaänderung) kompatibel.

Page 840: Programmieren Einer Microsoft SQL Server 2000-Datenbank

22 Unterrichtseinheit 15: Verwalten von Transaktionen und Sperren

���� Verwalten von Sperren

� Sperroptionen auf Sitzungsebene

� Dynamische Sperrenarchitektur

� Sperroptionen auf Tabellenebene

� Deadlocks

� Anzeigen von Sperrinformationen

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

In diesem Abschnitt werden Sperroptionen beschrieben, die Sie auf der Sitzungs- und Tabellenebene angeben können. Außerdem wird in dem Abschnitt erläutert, wie SQL Server mit Deadlocks umgeht und wie Sie Informationen zu Sperren anzeigen können.

ThemaGeben Sie eine Übersicht über dieses Thema.

EinstiegIn diesem Abschnitt werden folgende Themen behan-delt...

Page 841: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 15: Verwalten von Transaktionen und Sperren 23

Sperroptionen auf Sitzungsebene

� Transaktionsisolationsstufe� READ COMMITTED (Standard)� READ UNCOMMITTED� REPEATABLE READ� SERIALIZABLE

� Sperrtimeout� Begrenzt den Zeitraum in dem auf eine gesperrte

Ressource gewartet wird� Verwenden Sie SET LOCK_TIMEOUT

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

SQL Server ermöglicht es Ihnen, Sperroptionen auf der Sitzungsebene zu steuern, indem die Transaktionsisolationsstufe festgelegt wird.

TransaktionsisolationsstufeEine Isolationsstufe schützt eine angegebene Transaktion vor anderen Trans-aktionen. Die Transaktionsisolationsstufe ermöglicht Ihnen das Festlegen der Isolationsstufe für alle Transaktionen während einer Sitzung. Beim Festlegen der Isolationsstufe geben Sie das Standardsperrverhalten für alle Anweisungen in der Sitzung an.

Durch das Festlegen von Isolationsstufen für Transaktionen müssen Program-mierer zwar ein erhöhtes Risiko in Bezug auf Integritätsprobleme hinnehmen, können jedoch eine Ausweitung des gleichzeitigen Zugriffs auf Daten ermög-lichen. Je höher die Isolationsstufe ist, desto länger werden Sperren aufrechterhalten und desto mehr Einschränkung gelten für die Sperren.

Eine Isolationsstufe auf Sitzungsebene kann mit Hilfe einer Sperrspezifikation in einzelnen Anweisungen überschrieben werden. Mit Hilfe der DBCC USEROPTIONS-Anweisung können Sie außerdem eine Transaktionsisolation für eine Anweisung angeben.

ThemaGeben Sie eine Einführung in die Transaktionsisola-tionsstufe.

EinstiegSQL Server ermöglicht es Ihnen, Sperroptionen auf der Sitzungsebene zu steuern.

Page 842: Programmieren Einer Microsoft SQL Server 2000-Datenbank

24 Unterrichtseinheit 15: Verwalten von Transaktionen und Sperren

SET TRANSACTION ISOLATION LEVEL {READ COMMITTED | READ UNCOMMITTED | REPEATABLE READ | SERIALIZABLE}

In der folgenden Tabelle werden die Sperroptionen auf Isolationsstufe beschrieben.

Option Beschreibung

READ COMMITTED Weist SQL Server an, während Lesevorgängen gemeinsame Sperren zu verwenden. Auf dieser Ebene treten keine Dirty Reads auf.

READ UNCOMMITTED

Weist SQL Server an, keine gemeinsamen Sperren auszu-geben und exklusive Sperren nicht anzuerkennen. Dirty Reads können auftreten.

REPEATABLE READ Zeigt an, dass weder Dirty Reads noch wiederholte Lese-vorgänge auftreten können. Lesesperren werden bis zum Ende der Transaktion aufrechterhalten.

SERIALIZABLE Verhindert, dass andere Benutzer neue Zeilen aktualisieren oder einfügen, die mit den Kriterien in der WHERE-Klausel der Transaktion übereinstimmen. Phantome sind nicht möglich.

Im folgenden Beispiel wird die Isolationsstufe für die aktuelle Sitzung auf READ UNCOMMITTED festgelegt und anschließend DBCC USEROPTIONS überprüft, um festzustellen, ob SQL Server die Änderung vorgenommen hat.

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED DBCC USEROPTIONS

set option value

textsize 64512 language deutsch dateformat dmy datefirst 7 ...isolation level read uncommitted

(13 row(s) affected)

Bei Ausführung von DBCC wird immer folgende Meldung ausgegeben:DBCC-Ausführung abgeschlossen. Falls DBCC Fehlermeldungen ausgegeben hat, wenden Sie sich bitte an den System-administrator.

Syntax

Beispiel

Ergebnis

Anmerkung

Page 843: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 15: Verwalten von Transaktionen und Sperren 25

SperrtimeoutMit der Option SET LOCK_TIMEOUT kann die maximale Zeit festgelegt werden, die SQL Server eine Transaktion auf die Freigabe einer blockierten Ressource warten lässt.

SET LOCK_TIMEOUT timeout_period

timeout_period entspricht der Anzahl von Millisekunden, die verstreichen, bevor SQL Server einen Sperrfehler zurückgibt. Der Wert -1 (Standardwert) zeigt an, dass kein Timeoutzeitraum festgelegt wurde. Wird der Wert geändert, gilt die neue Einstellung danach für den Rest der Sitzung.

Dieses Beispiel legt den Zeitraum für das Sperrtimeout auf 180.000 Milli-sekunden fest.

SET LOCK_TIMEOUT 180000

Wenn Sie den aktuellen Sitzungswert ermitteln möchten, fragen Sie die globale Variable @@lock_timeout ab.

Dieses Beispiel zeigt die aktuelle @@lock_timeout-Einstellung an.

SELECT @@lock_timeout

180000

(1 row(s) affected)

Methodischer Hinweis Führen Sie Sperrtimeouts mit Hilfe mehrerer Abfrage-fenster vor.

Syntax

Beispiel

Beispiel

Ergebnis

Page 844: Programmieren Einer Microsoft SQL Server 2000-Datenbank

26 Unterrichtseinheit 15: Verwalten von Transaktionen und Sperren

Dynamische Sperrenarchitektur

DynamischeSperren

TabelleSeiteZeile

Kosten

GranularitätSperrkostenParallelitätskosten

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

SQL Server verwendet eine dynamische Sperrenarchitektur, um die kosten-günstigsten Sperren zu ermitteln. Wird eine Abfrage ausgeführt, wird auto-matisch ermittelt, welche Sperren im Hinblick auf die Merkmale des Schemas und der Abfrage am sinnvollsten sind.

SQL Server erhöht bzw. verringert dynamisch die Granularität und die Anzahl der Sperrtypen. Der Abfrageoptimierer wählt normalerweise die richtige Granu-larität der Sperre, wenn der Ausführungsplan kompiliert wird, sodass es nur noch selten notwendig ist, Sperren auszuweiten.

Wenn eine Aktualisierung z. B. eine große Anzahl von Zeilensperren aktiviert und einen signifikanten Prozentsatz einer Tabelle gesperrt hat, werden die Zei-lensperren zu einer Tabellensperre ausgeweitet. Die Transaktion erhält in die-sem Fall die Zeilensperren aufrecht, sodass der Verwaltungsaufwand für Sper-ren verringert wird.

Das dynamische Sperren bietet die folgenden Vorteile:

� Vereinfachte Datenbankverwaltung, da sich Datenbankadministratoren nicht mehr mit dem Anpassen von Schwellenwerten für Sperrausweitungen be-schäftigen müssen

� Höhere Leistung, da SQL Server den Systemverwaltungsaufwand auf ein Minimum reduziert, indem Sperren verwendet werden, die auf den jewei-ligen Task abgestimmt sind

ThemaFühren Sie vor, wie die kostengünstigsten Sperren ermittelt werden.

EinstiegDie dynamische Sperren-architektur hilft dabei, die kostengünstigsten Sperren zu ermitteln.

Page 845: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 15: Verwalten von Transaktionen und Sperren 27

Sperroptionen auf Tabellenebene

� Sollten mit Vorsicht verwendet werden

� Sie können eine oder mehrere Sperroptionen für eine Tabelle angeben

� Verwenden Sie den optimizer_hints-Teil der FROM-Klausel in einer SELECT- oder UPDATE-Anweisung

� Setzen Sperroptionen auf Sitzungsebene außer Kraft

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Auch wenn SQL Server die dynamische Sperrenarchitektur verwendet, um die am besten geeignete Sperre für den jeweiligen Client auszuwählen, ist es mög-lich, Sperroptionen auf Tabellenebene anzugeben. Ein Tabellenhinweis kann eine Sperrmethode für den Abfrageoptimierer bezüglich einer bestimmten Tabelle und für eine Anweisung angeben.

Verwenden Sie nur dann Sperroptionen auf Tabellenebene, wenn Sie genau verstanden haben, wie Ihre Anwendung funktioniert, und wenn Sie ermittelt haben, dass die angeforderte Sperre auch noch nach einer gewissen Zeit derjenigen vorzuziehen ist, die SQL Server verwenden würde.

Sperroptionen auf Tabellenebene weisen folgende Merkmale auf:

� Sie können eine oder mehrere Sperroptionen für eine Tabelle angeben. � Verwenden Sie den optimizer_hints-Teil der FROM-Klausel in einer

SELECT- oder UPDATE-Anweisung. � Die Sperroptionen auf Tabellenebene setzen entsprechende Optionen auf

Sitzungsebene (Transaktionsisolationsstufe) außer Kraft, die zuvor mit der SET-Anweisung angegeben wurden.

ThemaGeben Sie eine Einführung in die Sperroptionen auf Tabellenebene.

EinstiegIm Normalfall sollten Sie keine Sperroption auf Tabellenebene angeben.

Anmerkung

Page 846: Programmieren Einer Microsoft SQL Server 2000-Datenbank

28 Unterrichtseinheit 15: Verwalten von Transaktionen und Sperren

In der folgenden Tabelle werden die Sperroptionen auf Tabellenebene beschrieben.

Option Beschreibung

HOLDLOCK SERIALIZABLE REPEATABLEREAD READCOMMITTED READUNCOMMITTEDNOLOCK

Steuern das Sperrverhalten für eine Tabelle und setzen die Sperren außer Kraft, mit denen die Isolationsstufe der aktuellen Transaktion erzwungen würde.

ROWLOCK PAGLOCK TABLOCK TABLOCKX

Geben die Größe und den Typ der Sperren an, die für diese Tabelle verwendet werden sollen.

READPAST Überspringt gesperrte Zeilen.

UPDLOCK Verwendet Aktualisierungssperren anstelle von gemein-samen Sperren.

Page 847: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 15: Verwalten von Transaktionen und Sperren 29

Deadlocks

� Wie SQL Server einen Deadlock beendet

� Wie das Auftreten von Deadlocks eingeschränkt wird

� Wie die Einstellung für das Sperrtimeout angepasst wird

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Ein Deadlock tritt auf, wenn zwei Transaktionen separate Objekte mit Sperren belegt haben und jede Transaktion eine Sperre für das Objekt der anderen Transaktion anfordert. Jede Transaktion muss warten, bis die andere Trans-aktion die Sperre aufgehoben hat.

Ein Deadlock kann auch dann auftreten, wenn mehrere lang andauernde Trans-aktionen gleichzeitig in derselben Datenbank ausgeführt werden. Ein Deadlock kann auch aufgrund der Reihenfolge auftreten, in der der Optimierer eine kom-plexe Abfrage, wie z. B. eine Verknüpfung, verarbeitet, bei der sich die Reihen-folge der Verarbeitung nicht unbedingt steuern lässt.

Wie SQL Server einen Deadlock beendet SQL Server beendet einen Deadlock, indem eine der Transaktionen automatisch beendet wird. In der folgenden Liste ist der von SQL Server verwendete Vor-gang angegeben.

1. Ausführen eines Rollbacks für die Transaktion des Deadlockopfers. Im Falle eines Deadlocks räumt SQL Server der Transaktion Priorität ein, die die längste Verarbeitungszeit aufweist; diese Transaktion wird fort-gesetzt. Für die Transaktion mit der geringsten Verarbeitungsdauer führt SQL Server dagegen einen Rollback durch.

2. Die Anwendung des Deadlockopfers wird benachrichtigt (mit Meldung Nummer 1205).

3. Die aktuelle Anforderung des Deadlockopfers wird abgebrochen.

ThemaErläutern Sie, wie und warum ein Deadlock auf-treten kann.

EinstiegEin Deadlock tritt auf, wenn zwei Transaktionen separate Objekte mit Sperren belegt haben und jede Transaktion eine Sperre für das Objekt der anderen Transaktion anfordert.

Methodischer Hinweis Gehen Sie auf den Unter-schied zwischen Deadlocks und blockierenden Sperren ein.

Page 848: Programmieren Einer Microsoft SQL Server 2000-Datenbank

30 Unterrichtseinheit 15: Verwalten von Transaktionen und Sperren

4. Die anderen Transaktionen dürfen fortgesetzt werden.

In einer Mehrbenutzerumgebung sollte jeder Client in regelmäßigen Abständen nach Meldung Nummer 1205 suchen. Diese Meldung zeigt an, dass für eine Transaktion ein Rollback ausgeführt wurde. Falls Meldung 1205 gefun-den wird, sollte die Anwendung erneut versuchen, die Transaktion auszuführen.

Wie das Auftreten von Deadlocks eingeschränkt wird Auch wenn es nicht möglich ist, Deadlocks ganz zu verhindern, können Sie doch das Risiko eines Deadlocks verringern, indem Sie folgende Richtlinien beachten:

� Verwenden Sie Ressourcen in allen Transaktionen in der gleichen Reihen-folge. So sollten Sie z. B. in allen Transaktionen, die auf mehrere Tabellen verweisen, nach Möglichkeit in der gleichen Reihenfolge auf die Tabellen verweisen.

� Verkürzen Sie Transaktionen, indem Sie die Anzahl der Schritte möglichst gering halten.

� Verkürzen Sie die Transaktionszeiten, indem Sie Abfragen vermeiden, die sich auf zahlreiche Zeilen beziehen.

Wie die Einstellung für das Sperrtimeout angepasst wird Wenn eine Transaktion beim Warten auf eine Ressource gesperrt wird und deshalb ein Deadlock auftritt, beendet SQL Server eine der beteiligten Trans-aktionen ohne Timeout.

Wenn kein Deadlock auftritt, blockiert SQL Server die Transaktion, die die Sperre anfordert, so lange, bis die andere Transaktion die Sperre aufhebt. Stan-dardmäßig gibt es keine obligatorische Timeoutzeitspanne, die von SQL Server überprüft wird. Es gibt nur eine Möglichkeit zu testen, ob eine Ressource, die Sie sperren möchten, bereits gesperrt ist: Wenn versucht wird, auf die Daten zuzugreifen, kann dies dazu führen, dass die Daten auf unbestimmte Zeit ge-sperrt werden.

Mit Hilfe der LOCK_TIMEOUT-Einstellung kann eine Anwendung eine Höchstdauer festlegen, die angibt, wie lange eine Anweisung auf eine blo-ckierte Ressource wartet, bis die blockierte Anweisung automatisch abge-brochen wird. Der Abbruch führt nicht dazu, dass ein Rollback für die Trans-aktion ausgeführt oder die Transaktion abgebrochen wird. Die Anwendung muss den Fehler auffangen, um auf die Timeoutsituation zu reagieren und Ab-hilfemaßnahmen zu ergreifen, z. B. indem die Transaktion erneut abgesendet oder ein Rollback für die Transaktion ausgeführt wird.

Der KILL-Befehl beendet einen Benutzerprozess basierend auf der System-prozess-ID (SPID).

Wichtig

Page 849: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 15: Verwalten von Transaktionen und Sperren 31

Anzeigen von Sperrinformationen

� Das Fenster „Aktuelle Aktivität“� Gespeicherte Systemprozedur „sp_lock“ � SQL Profiler� Systemmonitor von Windows 2000 � Weitere Informationen

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

In der Regel verwenden Sie SQL Server Enterprise Manager oder die ge-speicherte Systemprozedur sp_lock zum Anzeigen eines Berichts über die aktiven Sperren. Mit Hilfe von SQL Profiler können Sie Informationen zu einer bestimmten Gruppe von Transaktionen abrufen. Sie können auch System-monitor von Microsoft Windows® 2000 verwenden, um Sperrverläufe von SQL Server anzuzeigen.

Das Fenster „Aktuelle Aktivität“ Das Fenster Aktuelle Aktivität in SQL Server Enterprise Manager zeigt Informationen zu der derzeit bestehenden Sperraktivität an. Sie können die Serveraktivität pro Benutzer, die Detailaktivität pro Verbindung und Sperr-informationen pro Objekt anzeigen.

Gespeicherte Systemprozedur „sp_lock“ Die gespeicherte Systemprozedur sp_lock gibt Informationen zu aktiven Sperren in SQL Server zurück.

EXECUTE sp_lock

Ein typisches Resultset sieht ähnlich wie das folgende Resultset aus.

spid dbid ObjId IndId Type Resource Mode Status

12 5 0 0 DB S GRANT 12 5 0 0 DB S GRANT 12 2 0 0 EXT 1:280 X GRANT 12 5 0 0 PAG 1:528 IX GRANT 12 5 981578535 0 RID 1:528:0 X GRANT 12 1 5575058 0 TAB IS GRANT 12 5 981578535 0 TAB IX GRANT 13 1 0 0 DB S GRANT

Die ersten vier Spalten beziehen sich auf verschiedene IDs: Serverprozess-ID (SPID), Datenbank-ID (DBID), Objekt-ID (OBJID) und die Index-ID (INDID).

ThemaGehen Sie auf die verschie-denen Informationen ein, die zu aktiven Sperren ange-zeigt werden können.

EinstiegFühren Sie die gespeicherte Systemprozedur sp_lockaus, um einen Bericht zu den aktiven Sperren anzuzeigen.

Methodischer Hinweis Zeigen Sie den Kursteilneh-mern das Fenster Aktuelle Aktivität in SQL Server Enterprise Manager und SQL Profiler.

Syntax

Ergebnis

Page 850: Programmieren Einer Microsoft SQL Server 2000-Datenbank

32 Unterrichtseinheit 15: Verwalten von Transaktionen und Sperren

Die Type-Spalte zeigt den Typ der derzeit gesperrten Ressource an. Zu den Ressourcentypen gehören die folgenden: DB (Datenbank), Block (Extent, EXT), Tabelle (Table, TAB), Schlüssel (Key, KEY), Seite (Page, PAG) und Zeilen-ID (Row Identifier, RID).

In der Resource-Spalte sind Informationen zum gesperrten Ressourcentyp enthalten. Eine Ressourcenbeschreibung von 1:528:0 zeigt an, dass Zeile Nummer 0 auf Seite Nummer 528 in Datei 1 mit einer Sperre belegt wurde.

In der Mode-Spalte wird der Sperrentyp beschrieben, der auf die Ressource angewendet wird. Zu den Sperrentypen gehören die folgenden: Gemeinsam (Shared, S), Exklusiv (X), Beabsichtigt (Intent, I), Aktualisierung (Update, U) oder Schema (Sch).

In der Status-Spalte wird angezeigt, ob die Sperre erteilt wurde (GRANT), wegen eines anderen Vorgangs blockiert ist (WAIT) oder zu einer anderen Sperre konvertiert wird (CNVRT).

SQL Profiler SQL Profiler ist ein Tool zum Überwachen der Serveraktivitäten. Sie können Informationen zu einer Vielzahl von Ereignissen sammeln, indem Sie Ablauf-verfolgungen erstellen, die ein detailliertes Profil von Serverereignissen liefern. Mit diesem Profil können Probleme mit Serverressourcen analysiert und gelöst, Anmeldeversuche und Verbindungen überwacht und Deadlockprobleme be-hoben werden.

Systemmonitor von Windows 2000 SQL Server-Sperrinformationen können mit Systemmonitor angezeigt werden. Verwenden Sie die Objekte SQL Server:Speicher-Manager und SQL Server:Sperren.

Weitere Informationen Wenn Sie Informationen zu Sperren und zur aktuellen Serveraktivität abrufen möchten, können Sie die Systemtabellen syslockinfo, sysprocesses, sysobjects und syslogins abfragen oder die gespeicherte Systemprozedur sp_who aus-führen.

Page 851: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 15: Verwalten von Transaktionen und Sperren 33

Empfohlene Methoden

Entwerfen Sie Transaktionen so, dass möglichst wenig Deadlocksauftreten könnenEntwerfen Sie Transaktionen so, dass möglichst wenig Deadlocksauftreten können

Verwenden Sie die SQL Server-Standardeinstellungen für SperrenVerwenden Sie die SQL Server-Standardeinstellungen für Sperren

Halten Sie Transaktionen so kurz wie möglichHalten Sie Transaktionen so kurz wie möglich

Gehen Sie bei der Verwendung von Sperroptionen mit besonderer Vorsicht vorGehen Sie bei der Verwendung von Sperroptionen mit besonderer Vorsicht vor

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

Sie sollten die folgenden empfohlenen Methoden beim Verwalten von Trans-aktionen und Sperren beachten:

� Halten Sie Transaktionen so kurz wie möglich. Dies verringert die Wahr-scheinlichkeit von Sperrkonflikten mit anderen Transaktionen. Eine Trans-aktion sollte nie kürzer als eine logische Arbeitseinheit sein.

� Entwerfen Sie Transaktionen so, dass möglichst wenig Deadlocks auftreten können, sodass Transaktionen nicht erneut gesendet werden müssen.

� Verwenden Sie die SQL Server-Standardeinstellungen für Sperren, da der Optimierer im Allgemeinen die besten Sperren auf Basis der jeweiligen Transaktion und anderer Aktivitäten in der Datenbank verwendet.

� Gehen Sie bei der Verwendung von Sperroptionen mit besonderer Vorsicht vor, und testen Sie die Transaktionen, um sicherzustellen, dass die gewähl-ten Sperren besser sind als die Standardsperren von SQL Server.

ThemaListen Sie die empfohlenen Methoden zum Verwalten von Transaktionen und Sperren auf.

EinstiegVerwenden Sie die folgen-den empfohlenen Methoden zum Verwalten von Trans-aktionen und Sperren.

Page 852: Programmieren Einer Microsoft SQL Server 2000-Datenbank

34 Unterrichtseinheit 15: Verwalten von Transaktionen und Sperren

Übungseinheit A: Verwalten von Transaktionen und Sperren

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

LernzieleAm Ende dieser Übungseinheit werden Sie in der Lage sein, die folgenden Aufgaben auszuführen:

� Definieren von Transaktionen mit den BEGIN TRANSACTION- und COMMIT TRANSACTION-Anweisungen.

� Ermitteln der Anzahl der aktiven Transaktionen durch Abfragen der globalen Variablen @@trancount.

� Verwenden der gespeicherten Systemprozedur sp_lock und SQL Server Enterprise Manager zum Anzeigen von Sperrinformationen.

� Verwenden der SET TRANSACTION ISOLATION LEVEL-Anweisung zum Steuern des Sperrverhaltens auf Sitzungsebene.

� Verwenden von Sperroptionen auf Tabellenebene zum Steuern des Sperr-verhaltens für bestimmte Tabellen.

� Verwenden der SET LOCK_TIMEOUT-Anweisung zum Steuern der maxi-malen Zeit, die eine Anweisung auf die Aufhebung einer Sperre wartet.

VoraussetzungenUm diese Übungseinheit zu bearbeiten, benötigen Sie Folgendes:

• Die Skriptdateien für diese Übungseinheit, die sich in C:\Moc\2328A\Labfiles\L15 befinden.

ThemaGeben Sie eine Einführung in die Übungseinheit.

EinstiegIn dieser Übungseinheit führen Sie Transaktionen aus, legen Sperroptionen fest und zeigen Sperr-ergebnisse an.

Erläutern Sie die Lernziele der Übungseinheit.

Page 853: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 15: Verwalten von Transaktionen und Sperren 35

Einrichten der ÜbungseinheitUm diese Übungseinheit zu bearbeiten, ist eine der folgenden Aktionen erforderlich:

� Bearbeiten der vorherigen Übungseinheit. � Ausführen der Batchdatei C:\Moc\2328A\Batches\Restore15.cmd.

Mit dieser Befehlsdatei wird die ClassNorthwind-Datenbank wieder in den Zustand zurückversetzt, der für diese Übungseinheit erforderlich ist.

Weitere Informationen Sollten Sie beim Ausführen von Dateien Hilfe benötigen, suchen Sie in der Hilfe von SQL Query Analyzer nach „Ausführen einer Abfrage“.

Darüber hinaus können Sie noch die folgenden Ressourcen verwenden:

� Das Northwind-Datenbankschema. � Die Microsoft SQL Server-Onlinedokumentation.

SzenarioDer Aufbau des Schulungsraumes soll die Organisation des weltweit agieren-den Handelsunternehmens Northwind Traders widerspiegeln. Das Unternehmen hat den fiktiven Domänennamen nwtraders.msft. Der primäre DNS-Server für nwtraders.msft ist der Kursleitercomputer, dessen IP-Adresse (Internetproto-koll) 192.168.x.200 lautet (wobei x die zugewiesene Schulungsraumnummer ist). Der Name des Kursleitercomputers ist London.

Die folgende Tabelle stellt den Benutzernamen, den Computernamen und die IP-Adresse für jeden Kursteilnehmercomputer in der fiktiven Domäne nwtraders.msft bereit. Suchen Sie den Ihrem Computer zugewiesenen Benutzernamen und notieren Sie ihn.

Benutzername Computername IP-Adresse

SQLAdmin1 Vancouver 192.168.x.1

SQLAdmin2 Denver 192.168.x.2

SQLAdmin3 Perth 192.168.x.3

SQLAdmin4 Brisbane 192.168.x.4

SQLAdmin5 Lisbon 192.168.x.5

SQLAdmin6 Bonn 192.168.x.6

SQLAdmin7 Lima 192.168.x.7

SQLAdmin8 Santiago 192.168.x.8

SQLAdmin9 Bangalore 192.168.x.9

SQLAdmin10 Singapore 192.168.x.10

SQLAdmin11 Casablanca 192.168.x.11

SQLAdmin12 Tunis 192.168.x.12

SQLAdmin13 Acapulco 192.168.x.13

SQLAdmin14 Miami 192.168.x.14

SQLAdmin15 Auckland 192.168.x.15

SQLAdmin16 Suva 192.168.x.16

Page 854: Programmieren Einer Microsoft SQL Server 2000-Datenbank

36 Unterrichtseinheit 15: Verwalten von Transaktionen und Sperren

(Fortsetzung) Benutzername Computername IP-Adresse

SQLAdmin17 Stockholm 192.168.x.17

SQLAdmin18 Moscow 192.168.x.18

SQLAdmin19 Caracas 192.168.x.19

SQLAdmin20 Montevideo 192.168.x.20

SQLAdmin21 Manila 192.168.x.21

SQLAdmin22 Tokyo 192.168.x.22

SQLAdmin23 Khartoum 192.168.x.23

SQLAdmin24 Nairobi 192.168.x.24

Veranschlagte Zeit für die Übungseinheit: 60 Minuten

Page 855: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 15: Verwalten von Transaktionen und Sperren 37

Übung 1 Erstellen und Ausführen einer Transaktion

In dieser Übung werden Sie die BEGIN TRANSACTION- und ROLLBACK TRANSACTION-Anweisungen verwenden, um zu sehen, welche Auswirkun-gen Anweisungen auf die Änderung von Daten haben. Außerdem wird gezeigt, wie SQL Server mit Hilfe der globalen Variablen @@trancount ermittelt, ob eine Transaktion aktiv ist.

� So erstellen Sie eine Transaktion und führen sie aus In diesem Verfahren steuern Sie mit Hilfe der Anweisungen BEGIN TRANSACTION und ROLLBACK TRANSACTION, wie eine UPDATE-Anweisung in der Customers-Tabelle verarbeitet wird. 1. Melden Sie sich an der Schulungsraumdomäne nwtraders mit Hilfe der

Informationen in der folgenden Tabelle an.

Option Eingabe

Benutzername SQLAdminx (wobei x die Ihrem Computernamen zugewiesene Nummer ist, wie in der Schulungsraumdomäne nwtraders.msftfestgelegt)

Kennwort password

2. Öffnen Sie SQL Query Analyzer, und melden Sie sich, wenn Sie dazu auf-gefordert werden, mittels Microsoft Windows®-Authentifizierung am (lokalen) Server an. Sie verfügen über die Berechtigung, sich bei SQL Server anzumelden und SQL Server zu verwalten, da Sie als SQLAdminx angemeldet sind und SQLAdminx ein Mitglied der lokalen Windows 2000-Gruppe Administ-ratoren ist. Alle Mitglieder dieser Gruppe werden automatisch der sysadmin-Rolle von SQL Server zugeordnet.

3. Klicken Sie in der Liste DB auf ClassNorthwind.4. Öffnen Sie C:\Moc\2328A\Labfiles\L15\Tran1.sql, und gehen Sie den

Inhalt der Datei durch. Beachten Sie dabei bitte, dass nach der BEGIN TRAN-Anweisung eine UPDATE-Anweisung eingefügt wurde, jedoch keine entsprechende COMMIT TRAN- oder ROLLBACK TRAN-Anweisung vorhanden ist. Die Anweisungen SELECT und PRINT und die globale Variable @@trancount im Skript sollen den Verarbeitungsfortschritt der Trans-aktion anzeigen.

Page 856: Programmieren Einer Microsoft SQL Server 2000-Datenbank

38 Unterrichtseinheit 15: Verwalten von Transaktionen und Sperren

5. Führen Sie das Skript aus, und sehen Sie sich die Ergebnisse an. Wird zu diesem Zeitpunkt für die mit der UPDATE-Anweisung vorge-nommenen Änderungen ein Commit in der Transaktion ausgeführt? Wie können Sie dabei vorgehen? Nein, die Transaktion muss mit einer COMMIT TRAN-Anweisung abgeschlossen werden. Die Transaktion ist noch aktiv und hält weiter-hin alle Sperren aufrecht, die sie abgerufen hat. Die globale Variable „@@trancount“ hat den Wert „1“, der anzeigt, dass eine BEGIN TRAN-Anweisung in der Sitzung verwendet wurde. ____________________________________________________________

____________________________________________________________

Könnten andere Transaktionen die geänderten Daten abfragen oder aktua-lisieren? Andere Transaktionen können die geänderten Daten erst dann ab-fragen oder ändern, wenn für die Transaktion ein Commit (oder Rollback) ausgeführt wurde. ____________________________________________________________

____________________________________________________________

6. Geben Sie eine COMMIT TRANSACTION-Anweisung im Abfragefenster ein. Markieren Sie dann die Anweisung, führen Sie die Anweisung aus, um die Transaktion abzuschließen und die Änderung dauerhaft zu bestätigen.

7. Markieren Sie eine der SELECT-Anweisungen für die Customers-Tabelle, und führen Sie die Anweisung aus, um zu überprüfen, ob die Änderung abgeschlossen wurde.

Page 857: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 15: Verwalten von Transaktionen und Sperren 39

Übung 2 Ausführen eines Rollbacks für eine Transaktion

In dieser Übung werden Sie die Anweisung ROLLBACK TRANSACTION verwenden, um zu sehen, welche Auswirkungen Anweisungen auf die Änderung von Daten innerhalb einer Transaktion haben.

� So verwenden Sie die ROLLBACK TRANSACTION-Anweisung In diesem Verfahren steuern Sie mit den Anweisungen BEGIN TRANSACTION und ROLLBACK TRANSACTION, wie eine UPDATE-Anweisung in der member-Tabelle verarbeitet wird. 1. Öffnen Sie C:\Moc\2328A\Labfiles\L15\Tran2.sql, und gehen Sie den

Inhalt der Datei durch. Das Skript ähnelt zwar Tran1.sql; aber der Name der Kontaktperson lautet anders, und eine ROLLBACK TRAN-Anweisung wurde hinzugefügt.

2. Führen Sie das Skript aus, und sehen Sie sich die Ergebnisse an. Wird die von der UPDATE-Anweisung vorgenommene Änderung per-manent in der Datenbank gespeichert? Nein. Für die Transaktion wurde ein Rollback ausgeführt, sodass alle während der Transaktion vorgenommenen Änderungen rückgängig gemacht werden. ____________________________________________________________

____________________________________________________________

Ist die Transaktion abgeschlossen? Ja. Die ROLLBACK TRAN-Anweisung schließt die Transaktion ab und hebt alle Sperren auf, die die Transaktion angefordert hat. Die Abfrage der globalen Variablen „@@trancount“ gibt den Wert NULL zurück. ____________________________________________________________

____________________________________________________________

Page 858: Programmieren Einer Microsoft SQL Server 2000-Datenbank

40 Unterrichtseinheit 15: Verwalten von Transaktionen und Sperren

Übung 3 Anzeigen von Sperrinformationen

In dieser Übung führen Sie mehrere Transaktionen gleichzeitig aus, um zu er-mitteln, welche Auswirkungen eine solche Aktivität auf die Sperren hat. Sie werden mehrere Verbindungen mit SQL Query Analyzer herstellen, um meh-rere Benutzer zu simulieren, die Transaktionen an SQL Server senden.

Die für die Übung verwendeten Skripts enthalten nicht immer COMMIT TRAN- oder ROLLBACK TRAN-Anweisungen. Das Fehlen dieser Anweisungen hält die Transaktionen aufrecht und die zugehörigen Sperren aktiv, sodass Sie die Sperrinformationen anzeigen können.

� So zeigen Sie Sperrinformationen an In diesem Verfahren steuern Sie mit Hilfe der BEGIN TRANSACTION-An-weisung und der ROLLBACK TRANSACTION-Anweisung, wie eine UPDATE-Anweisung in der Customers-Tabelle verarbeitet wird. 1. Starten Sie SQL Query Analyzer (Verbindung 1), und klicken Sie auf das

Symbol Fenster löschen.2. Führen Sie die gespeicherte Systemprozedur sp_lock aus, und sehen Sie

sich die Ausgabe an. 3. Starten Sie SQL Server Enterprise Manager. 4. Erweitern Sie in SQL Server Enterprise Manager in der Konsolenstruktur

Ihren Server, erweitern Sie Verwaltung und anschließend Aktuelle Aktivität. Sehen Sie sich die unter Prozessinfo, Sperren / Prozess-ID und Sperren / Objekte angezeigten Informationen an.

5. Stellen Sie eine zweite Verbindung mit SQL Query Analyzer her (Verbin-dung 2), und klicken Sie dann in der Liste DB auf ClassNorthwind.

6. Öffnen Sie C:\Moc\2328A\Labfiles\L15\Lock1.sql mit Hilfe der Verbin-dung 2, und gehen Sie den Inhalt der Datei durch. Beachten Sie, dass die Transaktion mit der BEGIN TRAN-Anweisung gestartet wurde, jedoch eine entsprechende COMMIT TRAN- oder ROLLBACK TRAN-Anweisung zum Beenden der Transaktion nicht vorhanden ist.

7. Führen Sie \Lock1.sql mit Verbindung 2 aus, und sehen Sie sich die Ergebnisse an.

8. Wechseln Sie zur Verbindung 1, führen Sie die gespeicherte Systempro-zedur sp_lock aus, und sehen Sie sich dann die Sperrinformationen an. Identifizieren Sie die verschiedenen Sperrentypen und die von der Trans-aktion gesperrten Ressourcen. Notieren Sie sich diese Informationen zur späteren Verwendung in Übung 4. ____________________________________________________________

____________________________________________________________

Page 859: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 15: Verwalten von Transaktionen und Sperren 41

9. Wechseln Sie zu SQL Server Enterprise Manager, klicken Sie mit der rechten Maustaste auf Aktuelle Aktivität, und klicken Sie dann auf Aktualisieren.

10. Sehen Sie sich in Aktuelle Aktivität die unter Prozessinfo, Sperren / Prozess-ID und Sperren / Objekte angezeigten Informationen an.

11. Wechseln Sie zur Verbindung 2, und brechen Sie die in Schritt 7 begonnene Transaktion ab, indem Sie eine ROLLBACK TRAN-Anweisung ausführen.

12. Wechseln Sie zur Verbindung 1, und führen Sie die gespeicherte System-prozedur sp_lock aus. Sie werden feststellen, dass die von der Transaktion in Schritt 6 abgerufenen Sperren nun aufgehoben wurden.

Page 860: Programmieren Einer Microsoft SQL Server 2000-Datenbank

42 Unterrichtseinheit 15: Verwalten von Transaktionen und Sperren

Übung 4 Einstellen von Sperroptionen

In dieser Übung werden Sie einige SQL Server-Sperroptionen verwenden, um zu ermitteln, wie sich diese auf die Verarbeitung von Transaktionen auswirken. Die mit SQL Query Analyzer in Übung 3 hergestellten Verbindungen sollen dabei mehrere Benutzer simulieren, die Transaktionen an SQL Server senden. Im Fenster Aktuelle Aktivität in SQL Server Enterprise Manager können Sie sich die Sperrinformationen für diese Übung ansehen.

� So legen Sie die Transaktionsisolationsstufe fest In diesem Verfahren verwenden Sie die SET TRANSACTION ISOLATION LEVEL-Anweisung, um das Sperrverhalten auf Sitzungsebene zu steuern. Hier-zu werden die mit SQL Query Analyzer in Übung 3 hergestellten Verbindungen verwendet. 1. Wechseln Sie zu SQL Query Analyzer (Verbindung 2). 2. Öffnen Sie die Skriptdatei C:\Moc\2328A\Labfiles\L15\Lock2.sql mit

Verbindung 2, sehen Sie sich den Inhalt an, und führen Sie das Skript dann aus.

3. Wechseln Sie zur Verbindung 1, führen Sie die gespeicherte System-prozedur sp_lock aus, und sehen Sie sich dann die Sperrinformationen an. Identifizieren und überprüfen Sie die verschiedenen Sperrentypen und die von der Transaktion gesperrten Ressourcen. Wurden von SQL Server andere Sperren verwendet als in Schritt 8 von Übung 3? Begründung? SQL Server hat diesmal eine exklusive Tabellensperre verwendet, da SQL Server durch die SET TRANSACTION ISOLATION LEVEL-Anweisung angewiesen wurde, den Sperrentyp zu verwenden, der für die angegebene Isolationsstufe erforderlich ist. ____________________________________________________________

____________________________________________________________

4. Wechseln Sie zur Verbindung 2, und brechen Sie die Transaktion ab, indem Sie eine ROLLBACK TRAN-Anweisung ausführen.

� So verwenden Sie Sperroptionen für Tabellen In diesem Verfahren steuern Sie das Sperrverhalten mit Hilfe von Sperr-optionen auf Tabellenebene.

1. Wechseln Sie zu SQL Query Analyzer (Verbindung 1). 2. Führen Sie die gespeicherte Systemprozedur sp_lock mit Verbindung 1 aus,

und sehen Sie sich die Ausgabe an. 3. Wechseln Sie zu SQL Query Analyzer (Verbindung 2).

Page 861: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 15: Verwalten von Transaktionen und Sperren 43

4. Öffnen Sie die Skriptdatei C:\Moc\2328A\Labfiles\L15\Lock3.sql mit Hilfe der Verbindung 2, und gehen Sie den Inhalt der Datei durch. Beachten Sie, dass eine Sperroption auf Tabellenebene in der FROM-Klausel der SELECT-Anweisung definiert wurde. Außerdem sollten Sie berücksichtigen, dass das Skript keine COMMIT TRAN- oder ROLLBACK TRAN-Anweisung enthält.

5. Führen Sie die Skriptdatei Lock3.sql mit Verbindung 2 aus. 6. Wechseln Sie zur Verbindung 1, und führen Sie die gespeicherte System-

prozedur sp_lock aus. Notieren Sie sich die verwendeten Sperrentypen und die gesperrten Ressourcen.____________________________________________________________

____________________________________________________________

7. Stellen Sie eine dritte Verbindung mit SQL Query Analyzer her (Verbin-dung 3), und klicken Sie in der Liste DB auf ClassNorthwind.

8. Öffnen Sie die Skriptdatei C:\Moc\2328A\Labfiles\L15\Lock1.sql mit Hilfe der Verbindung 3, und führen Sie sie dann aus.

9. Wechseln Sie zur Verbindung 1, und führen Sie die gespeicherte System-prozedur sp_lock aus. Kann eine der Transaktionen nicht ausgeführt werden? Falls dies der Fall ist, warum? Ja, die zweite Transaktion versucht, Daten zu aktualisieren, die von der ersten Transaktion gesperrt sind. Daher muss die zweite Transaktion warten, bis die erste Transaktion abgeschlossen ist. Sie können ermit-teln, ob eine Transaktion aufgrund eines Sperrkonflikts nicht ausge-führt werden kann, indem Sie die gespeicherte Systemprozedur „sp_lock“ verwenden und in der Statusspalte nach dem Wort WAIT suchen. In dem Beispiel muss die Transaktion an Verbindung 3 warten, bis die Transaktion an Verbindung 2 abgeschlossen ist. ____________________________________________________________

____________________________________________________________

Wie lange wartet eine Transaktion, bis eine gesperrte Ressource freigegeben wird? Eine Transaktion wartet unbegrenzt, bis eine gesperrte Ressource frei-gegeben wird, solange kein Deadlock vorliegt. Sie können ein Sperr-timeout für die Sitzung festlegen und so steuern, wie lange SQL Server wartet, bis gesperrte Ressourcen freigegeben sind. ____________________________________________________________

____________________________________________________________

Page 862: Programmieren Einer Microsoft SQL Server 2000-Datenbank

44 Unterrichtseinheit 15: Verwalten von Transaktionen und Sperren

10. Wechseln Sie zu Verbindung 3, und klicken Sie in der Symbolleiste auf das Symbol Abfrageausführung abbrechen.

11. Wechseln Sie zur Verbindung 1, und führen Sie die gespeicherte System-prozedur sp_lock aus, um zu überprüfen, ob die anstehende Transaktion abgebrochen wurde.

� So legen Sie das Sperrtimeout für eine Transaktion fest In diesem Verfahren legen Sie einen Zeitraum für das Sperrtimeout fest, sodass die Transaktion erst so lange wartet wie angegeben, bis sie eine Sperre abruft.

1. Wechseln Sie zur Verbindung 3, und bearbeiten Sie die Skriptdatei C:\Moc\2328A\Labfiles\L15\Lock1.sql, indem Sie die folgende Anwei-sung unmittelbar vor der BEGIN TRAN-Anweisung hinzufügen: SET lock_timeout 500

2. Führen Sie das bearbeitete Skript mit Verbindung 3 aus. Was ist passiert und warum? Die Transaktion an Verbindung 3 wartete auf Ressourcen, die von der Transaktion an Verbindung 2 gesperrt waren. SQL Server hat die Transaktion an Verbindung 3 abgebrochen, da der von Ihnen ange-gebene Zeitraum für das Sperrtimeout verstrichen ist. ____________________________________________________________

____________________________________________________________

3. Schließen Sie alle Fenster in SQL Query Analyzer.

Page 863: Programmieren Einer Microsoft SQL Server 2000-Datenbank

Unterrichtseinheit 15: Verwalten von Transaktionen und Sperren 45

Lernzielkontrolle

� Einführung in Transaktionen und Sperren

� Verwalten von Transaktionen

� SQL Server-Sperren

� Verwalten von Sperren

**********NUR FÜR DIE VERWENDUNG DURCH DEN KURSLEITER ZULÄSSIG**********

1. Sie entwickeln zurzeit ein neues Auftragseingangssystem für Ihre Firma. Sie erwarten dabei eine starke Beanspruchung des Systems, da 450 Mitarbeiter Kundenbestellungen rund um die Uhr annehmen. Sollten die Mitarbeiter alle Artikel, die ein Kunde während eines einzigen Telefonanrufs bestellt, in einer einzelnen Transaktion verarbeiten? Wahrscheinlich ist es am sinnvollsten, jedes bestellte Produkt als separate Transaktion zu behandeln.

2. Einmal im Monat müssen Sie eine Aktualisierung der products-Tabelle in Ihrem Auftragseingangssystem vornehmen. Die products-Tabelle enthält Millionen von Einträgen. Jede monatliche Aktualisierung soll mindestens 65 % der Zeilen in der Tabelle betreffen. Sie können eine einzige, komplexe UPDATE-Anweisung schreiben, um die Aktualisierung auszuführen. Die Ausführung dauert im Normalfall mindestens 30 Minuten, Ist dies die beste Methode, um die Aktualisierung durchzuführen? Nein, teilen Sie die Anweisung nach Möglichkeit in eine Gruppe von kleineren Transaktionen auf, um die Anzahl der Sperrkonflikte mit anderen Benutzern möglichst gering zu halten.

ThemaVertiefen Sie die Lernziele dieser Unterrichtseinheit, indem Sie die Kernpunkte wiederholen.

EinstiegDie Fragen zur Lernziel-kontrolle beziehen sich auf einige der Schlüsselkon-zepte, die Inhalt dieser Unterrichtseinheit sind.

Gehen Sie anhand dieser Fragen die Themen der Unterrichtseinheit durch.

Klären Sie andere offene Fragen der Kursteilnehmer, bevor Sie fortfahren.

Page 864: Programmieren Einer Microsoft SQL Server 2000-Datenbank

46 Unterrichtseinheit 15: Verwalten von Transaktionen und Sperren

3. Sie erhalten Anrufe von Benutzern. Die Anrufer informieren Sie darüber, dass sich die Antwortzeit des Auftragseingangssystems in regelmäßigen Abständen um 20 Sekunden erhöht. Sie haben den Benutzern jedoch eine Antwortzeit von drei Sekunden zugesichert. Sie haben den Verdacht, dass das Problem durch Sperrkonflikte innerhalb des Systems verursacht wird. Wie würden Sie die Ursache des Problems ermitteln? Verwenden Sie die gespeicherte Systemprozedur „sp_lock“ oder das Fenster „Aktuelle Aktivität“ in SQL Server Enterprise Manager, um das Problem zu identifizieren. Ändern Sie anschließend die betroffenen Transaktionen.