Inhaltsverzeichnis

Alle Kapitel aufklappen
Alle Kapitel zuklappen
Vorwort
35
TEIL I Grundlagen
37
1 Installation und Aktualisierung von SQL Server 2016
39
1.1 Überblick über die verfügbaren SQL-Server-2016-Versionen
39
1.2 Installationsvoraussetzungen
40
1.3 Installation von SQL Server 2016
41
1.4 Installation des Management Studios
49
1.5 Installation der SQL-Server-Beispieldatenbank
51
1.5.1 Behandlung eines möglichen Fehlers während der Installation der Beispieldatenbank
54
1.6 Aktualisierung auf SQL Server 2016
55
2 Datenbankgrundlagen
61
2.1 Server und Client
61
2.2 Relationale Datenbanken
62
2.2.1 Struktureller Aufbau von Tabellen
65
2.2.2 Im Zusammenhang mit Tabellen gebräuchliche Fachbegriffe
66
2.2.3 Schlüssel
67
2.2.4 Beziehungsarten
77
2.3 Datenbankmanagementsystem
80
2.4 Integritätsarten
83
3 Logischer Datenbankentwurf
85
3.1 Grundlagen des Datenbankentwurfs
85
3.2 Normalisierungsregeln (Normalformen)
86
3.2.1 Erste Normalform
87
3.2.2 Zweite Normalform
90
3.2.3 Dritte Normalform
91
3.3 Normalisierung in der Praxis
93
3.4 Denormalisierung
96
3.5 Entity-Relationship-Diagramme
97
4 Die Oberfläche von SQL Server 2016
101
4.1 Das SQL Server Management Studio
101
4.1.1 Der Objekt-Explorer
108
4.2 Das Bearbeiten von SQL-Anweisungen im Management Studio
118
4.2.1 Der SQL-Abfrage-Editor
118
4.2.2 Der Ergebnisbereich
125
4.2.3 Der Abfrage-Designer
128
4.3 SQL-Server-Dokumentation und Hilfen zur Programmierung
130
4.3.1 Die SQL-Server-Dokumentation
131
4.3.2 SQL-Server-IntelliSense
132
4.3.3 Der Vorlagen-Explorer
133
4.3.4 Die Skriptgenerierung
136
4.4 Überblick über die SQL-Server-Dienste
138
4.5 Das Dienstprogramm »sqlcmd«
139
4.6 SQL-Server-Integration in die Windows PowerShell
142
4.6.1 Allgemeiner Aufruf der PowerShell
143
4.6.2 Aufruf der PowerShell mit SQL-Server-Integration
144
4.6.3 Zugriff auf SQL Server mit der Windows PowerShell
145
4.6.4 Die SQL-Server-Cmdlets
149
TEIL II SQL-Programmierung
151
5 Grundlegende Abfragetechniken
153
5.1 Einführung in SQL
153
5.2 SQL-Grundlagen
154
5.2.1 Formatierung
154
5.2.2 Bezeichner
155
5.2.3 Systemdatentypen
156
5.2.4 Informationen zu den Datentypen einer Tabelle
161
5.2.5 Verwendung und Kennzeichnung von Zahlen, Zeichenketten und Datums-/Uhrzeitwerten
162
5.2.6 Kommentare
162
5.3 Grundlegende Operatoren
163
5.3.1 Arithmetische Operatoren
163
5.3.2 Zeichenkettenoperator
164
5.3.3 Vergleichsoperatoren
164
5.3.4 Logische Operatoren
165
5.4 Einfache Abfragen
167
5.4.1 »USE«
167
5.4.2 »SELECT … FROM«
168
5.4.3 Berechnete Spalten in Abfragen
171
5.4.4 »DISTINCT«
172
5.4.5 »ORDER BY«-Klausel
173
5.4.6 »WHERE«-Klausel
176
5.5 Auswahloperatoren
181
5.5.1 »IS (NOT) NULL«-Auswahloperator
181
5.5.2 »BETWEEN«-Auswahloperator
183
5.5.3 »IN«-Auswahloperator
184
5.5.4 »LIKE«-Auswahloperator
185
5.6 Aggregatfunktionen
189
5.7 Unterabfragen
192
5.7.1 Definition der Werteliste des »IN«-Operators durch eine Unterabfrage
193
5.7.2 Verwendung der Operatoren »ALL« und »ANY« mit Unterabfragen
195
5.7.3 Korrelierte Unterabfragen
197
5.8 Zusammenfassung, Gruppierung und Beschränkung von Abfrageergebnissen
198
5.8.1 Verknüpfung mehrerer Abfrageergebnisse durch »UNION«
198
5.8.2 Beschränkung des Abfrageergebnisses mit »TOP (n)«
199
5.8.3 Seitenweises Abrufen von Datensätzen
202
5.8.4 »GROUP BY«-Klausel
204
5.9 Die Mengen-Operatoren »EXCEPT« und »INTERSECT«
209
5.9.1 Der »EXCEPT«-Operator
210
5.9.2 Der »INTERSECT«-Operator
210
5.10 Ausgaben mit »PRINT« und »SELECT«
211
6 Grundlagen der SQLProgrammierung
213
6.1 Das Stapeltrennzeichen »GO«
213
6.2 (Lokale) Variablen
215
6.2.1 Variablendeklaration
215
6.2.2 Wertezuweisung an eine Variable
216
6.2.3 Kombinierte Deklaration und Wertezuweisung
217
6.2.4 Inkrement und Dekrement
217
6.2.5 Gültigkeitsbereich von Variablen
218
6.2.6 Verwendung von Variablen
219
6.2.7 Lokale und globale Variablen in SQL Server
219
6.2.8 Wertezuweisung an Variablen durch Abfragen
220
6.3 Ablaufsteuerung
223
6.3.1 Blöcke
223
6.3.2 »IF … ELSE«
224
6.3.3 »IF EXISTS«
226
6.3.4 »DROP IF EXISTS«
228
6.3.5 »WHILE«-Schleife
228
6.3.6 »RETURN«
231
6.3.7 »GOTO«
231
6.3.8 »WAITFOR«
232
6.4 Fallunterscheidungen
233
6.4.1 Die »CASE«-Funktion
234
6.4.2 Die »IIF«-Funktion
239
6.4.3 Die »CHOOSE«-Funktion
240
6.4.4 Die »ISNULL«-Funktion
240
6.5 Funktionen
241
6.5.1 Konfigurationsfunktionen
241
6.5.2 Datums-/Uhrzeitfunktionen
242
6.5.3 Zeichenfolgenfunktionen
248
6.5.4 Mathematische Funktionen
252
6.5.5 Funktionen zur Statusabfrage
252
6.5.6 Konvertierungsfunktionen
253
6.5.7 Formatierung von Ausdrücken mit der »FORMAT«-Funktion
259
6.6 Dynamische SQL-Anweisungen
261
6.6.1 Ausführung dynamischer Anweisungen mit »EXECUTE«
262
6.6.2 Ausführung dynamischer Anweisungen mit »sp_executesql«
262
6.7 Fehler in SQL Server und ihre Behandlung
263
6.7.1 Struktur von Fehlermeldungen in SQL Server
263
6.8 Fehlerbehandlung
266
6.8.1 Fehlerbehandlung mit »TRY« und »CATCH«
266
6.8.2 Funktionen zur Fehlerbehandlung
270
6.8.3 Gegenüberstellung von »TRY … CATCH« und »@@ERROR«
272
6.8.4 Abbruchverursachende Fehler
275
6.8.5 Erstellung benutzerdefinierter Fehlermeldungen
275
6.8.6 Programmgesteuerte Fehlerauslösung
277
6.8.7 Fehlerauslösung unter Verwendung von Parametern
279
6.8.8 Löschen von benutzerdefinierten Fehlermeldungen
285
7 Mehrtabellenabfragen
287
7.1 Tabellen verknüpfen (»JOIN«-Anweisung)
287
7.1.1 Einbindung zweier Tabellen in die »SELECT«-Anweisung
287
7.1.2 Innere Verknüpfung (»INNER JOIN«)
289
7.1.3 Äußere Verknüpfung (»OUTER JOIN«)
291
7.1.4 Mehrfache »JOIN«-Anweisungen
293
7.1.5 Kreuzverknüpfung (»CROSS JOIN«)
294
7.1.6 Umkehrung der Funktionsweise von »INNER JOIN«
295
7.2 Abfragen unter Verwendung mehrerer Server
296
7.2.1 Vollgekennzeichnete (vollqualifizierte) Namen
296
7.2.2 Einrichtung eines Verbindungsservers
297
8 Erstellen und Ändern von Datenbanken
299
8.1 Erstellen einer einfachen Datenbank
299
8.2 Einfluss der »model«-Datenbank auf das Erstellen neuer Datenbanken
306
8.3 Löschen von Datenbanken
308
8.4 Erstellen einer Datenbank mit mehreren Dateien
308
8.5 Nachträgliche Änderungen an Datenbankdateien
311
8.5.1 Dateien hinzufügen
311
8.5.2 Dateieigenschaften ändern
312
8.5.3 Dateien löschen
313
8.6 Erstellen einer Datenbank mit mehreren Dateigruppen
313
8.7 Datenbanken verkleinern
316
8.8 Datenbankdateien verkleinern
318
8.9 Gespeicherte Systemprozeduren (Stored Procedures) zur Datenbankverwaltung
319
8.10 Datenbank-Momentaufnahmen
320
8.10.1 Erstellen einer Datenbank-Momentaufnahme
320
8.10.2 Interne Verwaltung einer Datenbank-Momentaufnahme
323
8.10.3 Erstellen eines Snapshots für eine Datenbank mit mehreren Datendateien
327
8.10.4 Weitere Informationen zu Momentaufnahmen
328
8.10.5 Datenbank-Momentaufnahme löschen
329
8.11 Transparente Datenverschlüsselung
329
8.11.1 Die Struktur der transparenten Datenverschlüsselung in SQL Server
330
9 Erstellen von Tabellen
333
9.1 Die grundlegende Syntax zur Tabellenerstellung
333
9.1.1 Berechnete Spalten
335
9.1.2 Definition einer Identitätsspalte
336
9.1.3 »SPARSE«-Eigenschaft einer Tabellenspalte
337
9.1.4 Festlegung des physischen Speicherorts
341
9.1.5 Verwendung von FILESTREAM zur Speicherung von Daten im Dateisystem
342
9.2 Tabellen ändern
350
9.2.1 Spalten hinzufügen »ADD«
350
9.2.2 Spalten ändern »ALTER COLUMN«
351
9.2.3 Spalten löschen »DROP COLUMN«
352
9.3 Löschen von Tabellen
352
9.4 Implementierung der Datenintegrität
353
9.4.1 Die Einschränkungsarten im Überblick
353
9.4.2 Definition von Einschränkungen
354
9.4.3 Eigenschaften von Constraints
355
9.4.4 Lösch- und Änderungsweitergabe
359
9.5 Anwendungsbeispiel zu Einschränkungen
360
9.6 Nachträgliche Definition von Einschränkungen
362
9.7 Verwaltung von Einschränkungen
363
9.7.1 Deaktivierung und Aktivierung von Einschränkungen
364
9.7.2 Löschen einer Einschränkung
365
9.8 Temporäre Tabellen
365
9.8.1 Lokale temporäre Tabellen
365
9.8.2 Globale temporäre Tabellen
366
9.9 Partitionierung von Tabellen
367
9.9.1 Erstellung einer Partitionsfunktion
369
9.9.2 Erstellung eines Partitionsschemas
370
9.9.3 Erstellung einer partitionierten Tabelle
372
10 Speicherung von Daten in FileTables
377
10.1 Voraussetzungen für die Verwendung von FileTables
377
10.1.1 Aktivierung von FILESTREAM auf Serverebene
377
10.1.2 Vorhandensein einer Datenbank mit einer FILESTREAM-Dateigruppe und konfiguriertem, nicht transaktionalem Zugriff
378
10.2 Erstellung einer FileTable
380
10.3 Zugriff auf eine FileTable
382
10.4 Sichten zur Abfrage vorhandener FileTables in einer Datenbank
384
11 Verwendung der räumlichen und hierarchischen Datentypen
385
11.1 Räumliche Datentypen
385
11.1.1 Der »geometry«-Datentyp
386
11.1.2 Der »geography«-Datentyp
386
11.1.3 Koordinatenübergabe an räumliche Datentypen
386
11.1.4 Das Klassenmodell räumlicher Datentypen
387
11.1.5 Grundlegende Techniken zur Verwendung räumlicher Datentypen
393
11.1.6 Allgemeine Verwendung räumlicher Datentypen
397
11.1.7 Methoden zur Verarbeitung räumlicher Daten
398
11.1.8 Circular Arcs
408
11.1.9 Beispiel für die Verwertung des »geography«-Datentyps
412
11.1.10 Indizierung von Geodaten
415
11.2 Der hierarchische Datentyp
419
11.2.1 Die Methoden des hierarchischen Datentyps
422
12 Daten verwalten
429
12.1 Grundlegende Befehle zur Datensatzmanipulation
429
12.1.1 Einfügen von Datensätzen mit »INSERT«
429
12.1.2 Daten aktualisieren mit »UPDATE«
434
12.1.3 Löschen von Daten mit »DELETE«
437
12.2 Verwendung des Zeilenkonstruktors
438
12.3 Kombinierte Auswahl-/Einfügeanweisungen
439
12.3.1 »INSERT … SELECT«
439
12.3.2 »SELECT … INTO«
440
12.4 Die »MERGE«-Anweisung
441
12.4.1 Grundlagen der »MERGE«-Anweisung
442
12.4.2 Filterung von Datensätzen
445
12.4.3 Die »OUTPUT«-Klausel
447
12.5 Massenkopierprogramme
448
12.5.1 »BULK INSERT«
448
12.5.2 »bcp«
449
13 Benutzerverwaltung und Schemas
451
13.1 Authentifizierung am Server
452
13.1.1 Einrichten eines Logins mit Windows-Authentifizierung
453
13.1.2 Einrichten eines Logins mit SQL-Server-Authentifizierung
454
13.2 Datenbankzugriff erteilen
456
13.3 Zusammenfassung von Benutzern zu Rollen
458
13.3.1 Feste Serverrollen
459
13.3.2 Feste Datenbankrollen
460
13.3.3 Hinzufügen eines Benutzers zu einer Rolle
463
13.4 Rechtevergabe an Benutzer und Rollen
465
13.4.1 Objektberechtigungen
465
13.4.2 Anweisungsberechtigungen
465
13.4.3 SQL-Anweisungen zur Rechtevergabe
467
13.5 Deaktivierung und Aktivierung von Logins und Datenbankbenutzern
471
13.6 Vordefinierte Konten auf Server- und Datenbankebene
473
13.6.1 Das Login »system administrator« (»sa«)
474
13.6.2 Der Datenbankbenutzer »guest«
474
13.7 Schema
476
13.7.1 Objektverwaltung bis SQL Server 2000
477
13.7.2 Objektverwaltung seit SQL Server 2005
478
13.7.3 Erstellen eines Schemas
478
13.7.4 Namensauflösung bei fehlender Schema-Angabe
481
14 Eigenständige Datenbanken
483
14.1 Das Konzept der eigenständigen Datenbanken
483
14.2 Konfiguration des Servers zur Verwendung eigenständiger Datenbanken
483
14.3 Erstellung einer eigenständigen Datenbank
484
14.4 Identifizierung eigenständiger Datenbanken
485
14.5 Besonderheiten der Benutzerverwaltung eigenständiger Datenbanken
486
14.6 Verbindungsaufbau zu einer eigenständigen Datenbank
487
14.7 Konvertierung einer Datenbank in eine eigenständige Datenbank
489
14.7.1 Durchführung der Konvertierung
490
14.7.2 Konvertierung von Benutzern
491
14.7.3 Identifizierung datenbankübergreifender Elemente
491
14.8 Migration einer eigenständigen Datenbank auf einen anderen Server
492
14.8.1 Sicherung einer eigenständigen Datenbank auf dem Quellserver
493
14.8.2 Wiederherstellung einer eigenständigen Datenbank auf dem Zielserver
493
15 Sichten
495
15.1 Einsatz von Sichten
496
15.2 Verwalten von Sichten
498
15.2.1 Erstellen einer Sicht
498
15.2.2 Ändern einer Sicht
499
15.2.3 Löschen einer Sicht
500
15.3 Datenmanipulationsanweisungen auf eine Sicht
500
15.3.1 DML-Anweisungen auf eine Sicht ohne »WHERE«-Klausel
501
15.3.2 DML-Anweisungen auf eine Sicht mit »WHERE«-Klausel
502
15.4 Systemsichten von SQL Server
506
15.4.1 Informationsschemasichten
506
15.4.2 Systemsichten im Schema »sys«
507
16 Programmierung von gespeicherten Prozeduren
509
16.1 Überblick über die Verwendung von gespeicherten Prozeduren in SQL Server
509
16.2 Erstellung und Aufruf von gespeicherten Prozeduren
513
16.2.1 Grundlegende Syntax zu Erstellung einer gespeicherten Prozedur
513
16.2.2 Verwendung von Eingabeparametern
515
16.2.3 Die verschiedenen Arten der Parameterübergabe
518
16.2.4 Verweisbezogene Übergabe
520
16.2.5 Verwendung von Ausgabeparametern
522
16.2.6 Verwendung eines Rückgabestatuscodes
526
16.3 Tabellenübergabe an eine gespeicherte Prozedur
530
16.4 Optionen von gespeicherten Prozeduren
532
16.4.1 »ENCRYPTION«
532
16.4.2 »RECOMPILE«
534
16.4.3 »RESULT SETS«
536
16.4.4 »EXECUTE AS«
537
17 Programmierung von benutzerdefinierten Funktionen
539
17.1 Überblick über benutzerdefinierte Funktionen
539
17.2 Skalare Funktionen (Skalarwertfunktionen)
540
17.3 Inlinefunktionen (Tabellenwertfunktionen)
544
17.4 Tabellenwertfunktion mit mehreren Anweisungen
547
17.5 Ändern und Löschen von benutzerdefinierten Funktionen
549
17.5.1 Ändern einer benutzerdefinierten Funktion
549
17.5.2 Löschen einer benutzerdefinierten Funktion
550
17.6 Verwendung des Datentyps »table« als lokale Variable
550
17.6.1 Verwendung von Einschränkungen
552
18 Programmierung und Einsatz von Triggern
555
18.1 DML-Trigger
555
18.1.1 Programmierung von DML-Triggern
557
18.2 DDL-Trigger
576
18.2.1 DDL-Trigger mit Serverbereich
576
18.2.2 DDL-Trigger mit Datenbankbereich
578
18.2.3 Informationen zur Auslösung von DDL-Triggern
580
19 Nachverfolgung von Datenänderungen
583
19.1 Die Möglichkeiten zur Nachverfolgung von Datenänderungen: Change Data Capture und die Änderungsnachverfolgung
583
19.2 Change Data Capture
584
19.2.1 Konfiguration der Datenbank zur Verwendung von Change Data Capture
585
19.2.2 Konfiguration von Change Data Capture zur Überwachung einer Tabelle
586
19.2.3 Die Aufzeichnungsinstanz
589
19.2.4 Verwendung der Abfragefunktionen
591
19.2.5 Zyklische Abfragen
596
19.2.6 Abfragen auf einen Zeitbereich
596
19.2.7 Erstellung von Datetime-Wrapperfunktionen für die Abfrage auf Zeitbereiche
597
19.3 Änderungsnachverfolgung
598
20 Temporal tables
603
20.1 Die Funktionsweise von temporal tables
603
20.2 Erstellung von temporal tables
604
20.2.1 Eine temporal table mit einer automatisch angelegten history table erstellen?
605
20.2.2 Eine temporal table mit Anlegen einer benannten history table erstellen
606
20.2.3 Eine temporal table unter Verwendung einer vorhandenen history table erstellen
607
20.3 Verwaltung der Einträge in der temporal und history table
608
20.4 Abfragen von temporal tables
611
20.4.1 »AS OF«
612
20.4.2 »BETWEEN...AND«
613
20.4.3 »FROM...TO«
614
20.4.4 »CONTAINED IN«
614
20.4.5 »SYSTEM_TIME_ALL«
615
20.5 Löschen von temporal tables
615
21 Dynamische Datenmaskierung
617
21.1 Funktionen zur Maskierung von Spalteninhalten
617
21.2 Beispiel zur Erstellung einer Tabelle mit dynamischer Datenmaskierung
618
21.3 Zugriff auf dynamisch maskierte Spalteninhalte
620
22 Verschlüsselung von Spalten mit Always Encrypted
621
22.1 Voraussetzungen einer Client-Applikation für die Verwendung von Always Encrypted
622
22.2 Beispiel für die Konfiguration von Always Encrypted
622
22.2.1 Anlegen der Beispieltabelle
623
22.2.2 Erstellung des Spaltenhauptschlüssels
623
22.2.3 Erstellung des Spaltenverschlüsselungsschlüssels
625
22.2.4 Verschlüsselung zweier Spalten der Beispieltabelle
626
22.2.5 Abfrage auf die Beispieltabelle
631
22.3 Schlüsselmanagement
632
23 Zeilenbasierte Sicherheit
633
23.1 Das Prinzip der zeilenbasierten Sicherheit
633
23.1.1 Die Filterfunktion
633
23.1.2 Die Sicherheitsrichtlinie
634
23.2 Beispiel für die Implementierung der zeilenbasierten Sicherheit
634
23.2.1 Erstellung der Filterfunktion
636
23.2.2 Sicherheitsrichtlinie mit »FILTER«-Prädikat
636
23.2.3 Sicherheitsrichtlinie mit »BLOCK«-Prädikaten
637
24 Ereignisbenachrichtigungen (Event Notifications)
641
24.1 Konfiguration einer Datenbank zur Nutzung des Service Brokers
642
24.2 Konfiguration des Zieldienstes
643
24.2.1 Einrichtung der Warteschlange
643
24.2.2 Erstellung des Dienstes
643
24.2.3 Einrichtung der Route
644
24.3 Erstellen einer Ereignisbenachrichtigung
645
24.4 Auslösen und Empfangen einer Ereignisbenachrichtigung
646
24.5 Service-Broker-Aktivierung
647
24.5.1 Erstellung der Aktivierungsprozedur
647
24.5.2 Modifizierung der Warteschlange zur Verwendung der internen Aktivierung
650
24.6 Löschen der erstellten Objekte
651
25 Erstellung und Einsatz eines Cursors
653
25.1 Funktionsweise eines Cursors
653
25.2 Erstellung eines Cursors
655
25.3 Öffnen eines Cursors
657
25.4 Das Abrufen von Datensätzen aus einem Cursor
658
25.4.1 Aufruf einer »FETCH«-Anweisung ohne Verwendung von Variablen
658
25.4.2 Aufruf einer »FETCH«-Anweisung unter Verwendung von Variablen
659
25.4.3 Die Verwendung von Positionsangaben zum Abruf von Daten aus einem Cursor
659
25.5 Schließen und Löschen eines Cursors
666
25.6 Schleifenprogrammierung zum automatischen Durchlaufen eines Cursors
667
25.7 Daten in der Cursorauswahl aktualisieren und löschen
672
25.7.1 Aktualisieren
673
25.7.2 Löschen
673
26 Sequenzen
675
26.1 Erstellung einer Sequenz mit Standardeinstellungen
675
26.2 Informationen zu den vorhandenen Sequenzen in einer Datenbank
676
26.3 Abrufen von Sequenzwerten
676
26.3.1 Abruf einzelner Sequenzwerte
676
26.3.2 Anfordern eines Wertebereichs
677
26.4 Die Verwendung der Parameter »AS«, »START«, »INCREMENT«, »MINVALUE«, »MAXVALUE«, »CYCLE« und »CACHE«
678
26.4.1 »AS«, »START« und »INCREMENT«
678
26.4.2 »MAXVALUE«
680
26.4.3 »CYCLE«
682
26.4.4 »MINVALUE«
682
26.4.5 »CACHE«
683
27 Indizes
685
27.1 Der nicht gruppierte Index auf einem Heap
686
27.1.1 Vorgehensweise beim Durchlaufen eines Index
689
27.2 Der gruppierte Index
689
27.3 Der nicht gruppierte Index auf einem gruppierten Index
693
27.4 Der Columnstore-Index
696
27.5 Erstellung von Indizes
696
27.5.1 Manuelle Erstellung eines Index
696
27.5.2 Automatische Erstellung von Indizes
699
27.6 Verwaltung von Indizes
700
27.6.1 Fragmentierung
700
27.6.2 Neuerstellung von Indizes
703
27.6.3 Löschen eines Index
703
27.7 Statistiken
704
27.7.1 Löschen einer Statistik
707
27.7.2 Aktualisieren einer Statistik
707
27.7.3 Informationen zu Statistiken abrufen
708
27.8 Planung des Einsatzes von Indizes
709
27.8.1 Verwenden des Datenbankmodul-Optimierungsratgebers
710
27.8.2 Optimierung von Indizes mithilfe von Systemsichten
717
27.9 Weitere Optimierungsmöglichkeiten mithilfe von Indizes
718
27.9.1 Indizes mit eingeschlossenen Spalten
718
27.9.2 Gefilterte Indizes
723
27.9.3 Indizierte Sichten
724
27.9.4 Partitionierte Indizes
725
28 Columnstore-Indizes
727
28.1 Das Grundprinzip von Columnstore-Indizes
727
28.2 Erstellung eines nicht gruppierten Columnstore-Index
729
28.2.1 Beispiel für den Leistungsvergleich eines regulären nicht gruppierten Index mit einem nicht gruppierten Columnstore-Index
730
28.2.2 Steuerung der Verwendung nicht gruppierter Columnstore-Indizes
733
28.3 Erstellung eines gruppierten Columnstore-Index
734
28.4 Abfragen von Informationen über vorhandene Columnstore-Indizes
737
29 Transaktionen
739
29.1 Einführung in Transaktionen
739
29.2 ACID
741
29.3 Interne Transaktionsverarbeitung
744
29.4 Verhalten bei Systemfehlern
745
29.5 Programmierung expliziter Transaktionen
747
29.6 Implizite Transaktionen
750
29.7 Sperren
752
29.7.1 Sperrebenen
753
29.7.2 Gemeinsame Sperren (Shared Locks)
753
29.7.3 Exklusive Sperren (Exclusive Locks)
754
29.8 Isolationsstufen auf Verbindungsebene
755
29.8.1 »READ UNCOMMITTED«
756
29.8.2 »READ COMMITTED«
758
29.8.3 »REPEATABLE READ«
759
29.8.4 »SERIALIZABLE«
761
29.8.5 Snapshot
762
29.8.6 Zusammenfassung der Eigenschaften von Sperrstufen
763
29.8.7 Setzen eines Timeout-Werts
764
29.9 Sperrhinweise auf Tabellenebene
764
29.10 Informationen zu Sperren
766
29.11 Deadlocks
766
29.11.1 Vermeidung von Deadlocks
768
29.11.2 Beispiel zur Erzeugung eines Deadlocks
768
29.11.3 Erfassung von Deadlocks im Profiler
769
30 Speicheroptimierte Tabellen
771
30.1 Grundlagen der speicheroptimierten Tabellen
771
30.1.1 Vor- und Nachteile speicheroptimierter Tabellen
772
30.2 Beständigkeit speicheroptimierter Tabellen
772
30.2.1 Speicheroptimierte Tabellen mit nicht beständigen Inhalten
773
30.2.2 Speicheroptimierte Tabellen mit beständigen Inhalten
773
30.3 Konfiguration einer Datenbank zur Verwendung speicheroptimierter Tabellen
773
30.3.1 Hinzufügen einer Dateigruppe zur Speicherung speicheroptimierter Tabellen
774
30.3.2 Hinzufügen einer Datei zur Speicherung speicheroptimierter Tabellen
775
30.3.3 Festlegung der Isolationsstufe für speicheroptimierte Tabellen
776
30.4 Erstellung speicheroptimierter Tabellen
777
30.4.1 Erstellung einer speicheroptimierten Tabelle mit beständigen Inhalten
777
30.4.2 Erstellung einer speicheroptimierten Tabelle mit nicht beständigen Inhalten
778
30.5 Vergleich des Verhaltens beider Arten von speicheroptimierten Tabellen
779
31 Indizierung speicheroptimierter Tabellen
781
31.1 Unterschiede zwischen der Indizierung speicheroptimierter und dateibasierter Tabellen
781
31.2 Indexarten für die Verwendung mit speicheroptimierten Tabellen
782
31.2.1 Nicht gruppierte Indizes
782
31.2.2 Nicht gruppierte Hash-Indizes
782
31.3 Überlegungen zur Verwendung nicht gruppierter Indizes oder nicht gruppierter Hash-Indizes
787
31.4 Abfragen zu Indizes speicheroptimierter Tabellen
787
32 Systemintern kompilierte gespeicherte Prozeduren
789
32.1 Überblick über systemintern kompilierte gespeicherte Prozeduren und deren Verwendung
789
32.2 Erstellung systemintern kompilierter gespeicherter Prozeduren
790
32.2.1 Erstellung einer systemintern kompilierten gespeicherten Prozedur für den lesenden Zugriff auf eine speicheroptimierte Tabelle
792
32.2.2 Erstellung einer nativ kompilierten Prozedur zur Demonstration der Optionen »ATOMIC« und »LANGUAGE«
793
32.3 Ändern einer systemintern kompilierten gespeicherten Prozedur
794
32.4 Informationen zum Speicherort und den geladenen DLL-Dateien
795
TEIL III .NET-Programmierung
797
33 SQL Server als Laufzeitumgebung für .NET
799
33.1 Die Programmiermodelle im Vergleich
799
33.1.1 T-SQL
799
33.1.2 Erweiterte gespeicherte Prozeduren
800
33.1.3 Einbindung von COM-Objekten
801
33.1.4 Einsatz von Managed Code
801
33.2 Die CLR-Integration im Detail
803
33.2.1 CLR-Hosting
804
33.2.2 Thread- und Speichermanagement
805
33.2.3 I/O-Zugriffe
805
33.2.4 Assemblies Loading
805
33.2.5 Application Domain Management
806
33.3 Der Hosting-Layer
807
33.4 Verwaltung von Assemblies
809
33.5 Sicherheitsstufen
811
34 .NET-Programmierung
813
34.1 CLR-Unterstützung aktivieren
813
34.1.1 CLR-Unterstützung per Skript aktivieren
815
34.2 CLR-Prozeduren und Funktionen
815
34.2.1 CLR vs. T-SQL
815
34.2.2 Prozeduren vs. Funktionen
815
34.2.3 Veröffentlichung von Methoden
816
34.2.4 Implementierungsregeln
817
34.2.5 Parameter und Rückgabewerte
818
34.2.6 Sicherheitsaspekte
819
34.3 Gespeicherte Prozeduren
820
34.3.1 Eine gespeicherte Prozedur mit Visual Studio erstellen
820
34.3.2 Das »SqlProcedure«-Attribut
824
34.3.3 Parameter und Rückgabe
824
34.3.4 Temporäre Prozeduren
825
34.3.5 Assembly bereitstellen
825
34.3.6 Assembly ohne Visual Studio kompilieren
826
34.3.7 Installation mit »sqlcmd« durchführen
827
34.3.8 Prozeduren mit Visual Studio debuggen
827
34.4 Benutzerdefinierte Funktionen
828
34.4.1 Einschränkungen
828
34.4.2 Das »SqlFunction«-Attribut
829
34.4.3 Funktionen bereitstellen
830
34.4.4 Skalare Funktionen
831
34.4.5 Eine Skalarfunktion erstellen
831
34.4.6 Tabellenwertige Funktionen
832
34.4.7 Unterschiede zwischen T-SQL- und CLR-Funktionen
832
34.4.8 Eine tabellenwertige Funktion erstellen
833
34.5 Serverseitiger Datenzugriff mit ADO.NET
836
34.5.1 Der Kontext
837
34.5.2 Verbindung zur Datenbank herstellen
838
34.6 Pipes
838
34.6.1 Die »Send«-Methode
839
34.6.2 Die »ExecuteAndSend()«-Methode
841
34.6.3 Ausgabestrom steuern
842
34.7 Impersonalisierung
845
34.8 Benutzerdefinierte Typen
850
34.8.1 »Das SqlUserDefinedType«-Attribut
851
34.8.2 Einen benutzerdefinierten Datentyp erstellen
852
34.8.3 Das »INullable«-Interface
852
34.8.4 Die »ToString()«-Methode
853
34.8.5 »Die Parse()«-Methode
853
34.8.6 Erstellung des »CalendarWeek«-Datentyps
853
34.8.7 Den »CalendarWeek«-Typ installieren
856
34.8.8 Den »CalendarWeek-Typ« testen
856
34.8.9 Validierungen
857
34.8.10 Methoden implementieren
858
34.8.11 Serialisierung
860
34.8.12 Typen als Klassen abbilden
864
34.8.13 Zugriff vom Client
864
34.9 Benutzerdefinierte Aggregate
866
34.9.1 Das »SqlUserDefinedAggregate«-Attribut
866
34.9.2 Die »Init()«-Methode
867
34.9.3 Die »Accumulate()«-Methode
867
34.9.4 Die »Merge()«-Methode
868
34.9.5 Die »Terminate()«-Methode
868
34.9.6 Ein Beispielaggregat
868
34.9.7 Das »MaxRange«-Aggregat implementieren
869
34.9.8 Hinweise zur Implementierung
872
34.9.9 Aggregate installieren
873
34.10 Benutzerdefinierte Trigger
873
34.10.1 Das »SqlTrigger«-Attribut
874
34.10.2 Die »TriggerContext«-Klasse
875
34.10.3 Trigger implementieren
876
34.10.4 Hinweise zur Implementierung
879
34.10.5 Trigger installieren
880
34.11 Administration und Monitoring von CLR-Objekten
880
34.11.1 Informationen über die installierten Assemblies ermitteln
880
34.11.2 Laufzeitinformationen von CLR-Objekten ermitteln
882
35 T-SQL: erweiterte Themen
885
35.1 Kompatibilität festlegen
885
35.2 Änderungen der Kompatibilität ab SQL Server 2008
886
35.3 Änderungen bei nicht ANSI-konformen Abfragen
887
35.4 »CROSS APPLY« und »OUTER APPLY«
888
35.5 Kreuztabellen mit »PIVOT« erstellen
890
35.5.1 Entscheidungstabellen mit »PIVOT« erstellen
894
35.5.2 Kreuztabellen in flache Listen transformieren
895
35.6 Common Table Expressions
897
35.6.1 Verarbeitung von hierarchischen Daten
901
35.6.2 Maximale Rekursionsstufe einstellen
905
35.7 Fehlerbehandlung
905
35.7.1 Informationen über den Fehler ermitteln
907
35.7.2 Eigene Fehler auslösen
910
35.7.3 Verschachtelte Fehlerbehandlung
911
35.8 Ranking- und Windowing-Funktionen
912
35.8.1 Ergebnisse mit »RANK()« gewichten
913
35.8.2 Ranking ohne Lücken mit »DENSE_RANK()«
914
35.8.3 Gruppierte Ranglisten mit Windowing
914
35.8.4 Zeilen mit »ROW_NUMBER()« nummerieren
916
35.8.5 Paging mit »ROW_NUMBER()«
917
35.8.6 Daten mit »NTILE()« partitionieren
918
35.9 Die »OUTPUT«-Klausel
919
35.10 Die »TABLESAMPLE«-Klausel
921
35.11 »EXCEPT«- und »INTERSECT«-Statement
923
35.12 Tabellenwertparameter
925
35.12.1 Tabellenwertparameter definieren
925
35.12.2 Tabellenwertparameter verwenden
926
35.12.3 Prozeduren mit Tabellenwertparametern aufrufen
926
35.12.4 Aufruf vom Client mit ADO.NET
927
35.12.5 Limitationen
929
36 Einsatz von XML und JSON in der Datenbank
931
36.1 Warum XML?
932
36.2 HTML und XML
932
36.2.1 Auszeichnungssprachen
933
36.2.2 Auszeichnungen
934
36.3 XML-Fähigkeiten von SQL Server
936
36.4 Der XML-Datentyp
937
36.4.1 Vor- und Nachteile der XML-Datenspeicherung
937
36.4.2 XML-Felder anlegen
939
36.4.3 XML-Felder mit einem Schema verknüpfen
941
36.5 Auf gespeicherte XML-Daten zugreifen
943
36.5.1 Eine kurze Einführung in XPath
943
36.5.2 XQuery als Abfragesprache
945
36.5.3 Die Methoden des XML-Datentyps
946
36.5.4 Indizierung von XML-Feldern
951
36.6 Darstellung von Abfrageergebnissen im XML-Format
954
36.6.1 Der »RAW«-Modus
956
36.6.2 Allgemeine Optionen der »FOR XML«-Klausel
958
36.6.3 Der »AUTO«-Modus
961
36.6.4 Der »PATH«-Modus
963
36.6.5 Der »EXPLICIT«-Modus
964
36.7 XML-Schema ermitteln
970
36.8 XML-Daten in einem relationalen Modell speichern
972
36.8.1 Ein XML-Dokument in eine Tabelle importieren
973
36.9 Bereitstellung von Daten im JSON-Format
975
36.9.1 Eine kurze Beschreibung des JSON-Formats
975
36.9.2 Die »FOR JSON«-Direktive
976
36.9.3 Der »AUTO«-Modus
977
36.9.4 Der »PATH«-Modus
978
36.9.5 JSON-Daten mit »OPENJSON« konvertieren
982
36.9.6 Weitere JSON-Funktionen in SQL Server 2016
986
37 Datenbankzugriff mit ADO.NET
989
37.1 Einleitung
989
37.1.1 Projekte anlegen und speichern
990
37.1.2 Die Beispieldatenbank
991
37.2 Die Datenprovider
992
37.3 Die Verbindung zu einer Datenbank herstellen
993
37.3.1 Die Verbindungszeichenfolge
994
37.3.2 Die Verbindung mit einer bestimmten SQL-Server-Instanz aufbauen
995
37.3.3 Öffnen und Schließen einer Verbindung
999
37.3.4 Das Verbindungspooling
1003
37.3.5 Die Ereignisse eines »Connection«-Objekts
1007
37.3.6 Verbindungszeichenfolgen aus einer Konfigurationsdatei abrufen
1009
37.3.7 Die Klasse »SqlConnection« im Überblick
1011
37.3.8 Verbindungen mit dem OleDb-Datenprovider
1013
37.4 Die Datenbankabfrage
1015
37.4.1 Das »SqlCommand«-Objekt
1015
37.4.2 Abfragen, die genau ein Ergebnis liefern
1020
37.5 Das »SqlDataReader«-Objekt
1021
37.5.1 Datensätze einlesen
1021
37.5.2 Schließen des »SqlDataReader«-Objekts
1024
37.5.3 MARS (Multiple Active Resultsets)
1024
37.5.4 Batchabfragen mit »NextResult« durchlaufen
1026
37.5.5 Das Schema eines »SqlDataReader«-Objekts untersuchen
1027
37.6 Parametrisierte Abfragen
1029
37.6.1 Parametrisierte Abfragen mit dem SqlClient-Datenprovider
1030
37.6.2 Die Klasse »SqlParameter«
1032
37.6.3 Asynchrone Abfragen
1033
37.6.4 Gespeicherte Prozeduren (Stored Procedures)
1036
37.7 Der »SqlDataAdapter«
1043
37.7.1 Was ist ein »DataAdapter«?
1043
37.7.2 Die Konstruktoren der Klasse »DataAdapter«
1045
37.7.3 Die Eigenschaft »SelectCommand«
1046
37.7.4 Den lokalen Datenspeicher mit »Fill« füllen
1046
37.7.5 Tabellenzuordnung mit »TableMappings«
1050
37.7.6 Das Ereignis »FillError« des »SqlDataAdapters«
1055
37.8 Daten im lokalen Speicher – das »DataSet«
1056
37.8.1 Verwenden des »DataSet«-Objekts
1057
37.8.2 Dateninformationen in eine XML-Datei schreiben
1061
37.8.3 Dem »DataSet« Schemainformationen übergeben
1062
37.8.4 Schemainformationen bereitstellen
1064
37.8.5 Eigenschaften einer »DataColumn«, die der Gültigkeitsprüfung dienen
1064
37.8.6 Die Constraints-Klassen einer «DataTable«
1065
37.8.7 Das Schema mit Programmcode erzeugen
1066
37.8.8 Schemainformationen mit »SqlDataAdapter« abrufen
1068
37.8.9 Änderungen in einer »DataTable« vornehmen
1071
37.8.10 Was bei einer Änderung einer Datenzeile passiert
1076
37.8.11 Manuelles Steuern der Eigenschaft »DataRowState«
1080
37.9 Mit mehreren Tabellen arbeiten
1081
37.9.1 Der Weg über »JOIN«-Abfragen
1081
37.9.2 Mehrere Tabellen in einem »DataSet«
1083
37.9.3 Eine »DataRelation« erzeugen
1083
37.9.4 »DataRelations« und Einschränkungen
1084
37.9.5 In Beziehung stehende Daten suchen
1087
37.9.6 Ergänzung zum Speichern von Schemainformationen in einer XML-Schemadatei
1089
37.10 Aktualisieren der Datenbank
1089
37.10.1 Aktualisieren mit dem »CommandBuilder«-Objekt
1089
37.10.2 Manuell gesteuerte Aktualisierungen
1092
37.10.3 Aktualisieren mit »ExecuteNonQuery«
1093
37.10.4 Manuelles Aktualisieren mit dem »DataAdapter«
1101
37.10.5 Den zu aktualisierenden Datensatz in der Datenbank suchen
1104
37.10.6 Den Benutzer über fehlgeschlagene Aktualisierungen informieren
1109
37.10.7 Konfliktverursachende Datenzeilen bei der Datenbank abfragen
1112
38 LINQ
1119
38.1 Was ist LINQ?
1119
38.1.1 Verzögerte Ausführung
1121
38.1.2 LINQ-Erweiterungsmethoden an einem Beispiel
1121
38.2 LINQ to Objects
1125
38.2.1 Musterdaten
1125
38.2.2 Die allgemeine LINQ-Syntax
1127
38.3 Die Abfrageoperatoren
1129
38.3.1 Übersicht über die Abfrageoperatoren
1129
38.3.2 Die »from«-Klausel
1130
38.3.3 Mit »where« filtern
1132
38.3.4 Die Projektionsoperatoren
1134
38.3.5 Die Sortieroperatoren
1135
38.3.6 Gruppieren mit »GroupBy«
1137
38.3.7 Verknüpfungen mit »Join«
1138
38.3.8 Die Set-Operatoren-Familie
1142
38.3.9 Die Familie der Aggregatoperatoren
1144
38.3.10 Quantifizierungsoperatoren
1147
38.3.11 Aufteilungsoperatoren
1148
38.3.12 Die Elementoperatoren
1150
38.3.13 Die Konvertierungsoperatoren
1153
39 Einführung in das ADO.NET Entity Framework
1155
39.1 Kritische Betrachtung von ADO.NET
1156
39.1.1 Die Organisation der Daten in Klassen
1157
39.2 Ein erstes Entity Data Model (EDM) erstellen
1158
39.3 Das Entity Data Model im Designer
1163
39.3.1 Die übergeordneten Eigenschaften einer Entität
1163
39.3.2 Eigenschaftstypen eines Entitätsobjekts
1164
39.3.3 Assoziationen im Entity Data Model
1167
39.3.4 Der Kontext der Entitäten
1167
39.4 Der Aufbau des Entity Data Models
1168
39.5 Die Klassen des Entity Data Models (EDM)
1172
39.5.1 Die Klassen für die DbContext-API
1173
39.5.2 Die Entitäten für .NET Framework-4-ObjectContext
1174
39.5.3 Der »ObjectContext«
1178
39.6 Die Architektur des Entity Frameworks
1180
39.6.1 Object Services
1180
39.6.2 Die Schichten des Entity Frameworks
1181
40 Abfragen mit .NET 4 Framework-ObjectContext
1183
40.1 Abfragen mit LINQ to Entities
1184
40.1.1 Allgemeine Begriffe in LINQ
1184
40.1.2 Einfache Abfragen
1184
40.1.3 Navigieren in Abfragen
1191
40.1.4 Aggregatmethoden
1196
40.1.5 Joins in LINQ definieren
1198
40.1.6 In Beziehung stehende Daten laden
1201
40.2 Abfragen mit Entity SQL
1207
40.2.1 Ein erstes Beispiel mit Entity SQL
1207
40.2.2 Die fundamentalen Regeln der Entity-SQL-Syntax
1208
40.2.3 Filtern mit Entity SQL
1209
40.2.4 Parametrisierte Abfragen
1211
40.3 Der EntityClient-Provider
1212
40.3.1 Verbindungen mit »EntityConnection«
1213
40.3.2 Die Klasse »EntityCommand«
1214
40.4 Abfrage-Generator-Methoden (QueryBuilder-Methoden)
1215
40.5 SQL-Direktabfragen
1216
41 Entitätsaktualisierung und Zustandsverwaltung
1219
41.1 Aktualisieren von Entitäten
1219
41.1.1 Entitäten ändern
1219
41.1.2 Hinzufügen neuer Entitäten
1221
41.1.3 Löschen einer Entität
1225
41.2 Der Lebenszyklus einer Entität im Objektkontext
1228
41.2.1 Der Zustand einer Entität
1228
41.2.2 Das Team der Objekte im Überblick
1229
41.2.3 Neue Entitäten im Objektkontext
1230
41.2.4 Die Zustände einer Entität
1231
41.2.5 Zusätzliche Entitäten in den Datencache laden
1233
41.3 Das »ObjectStateEntry«-Objekt
1236
41.3.1 Die Current- und Originalwerte abrufen
1238
41.3.2 Die Methode »TryGetObjectStateEntry«
1239
41.3.3 Geänderte Entitäten mit »GetObjectStateEntries« abrufen
1240
41.3.4 Die Methode »GetModifiedProperties«
1241
41.4 Die Klasse »EntityKey«
1241
41.4.1 Die Methoden »GetObjectByKey« und »TryGetObjectByKey«
1242
41.5 Komplexere Szenarien
1243
41.5.1 Die Methode »ChangeState«
1244
41.5.2 Die Methoden »ApplyCurrentChanges« und »ApplyOriginalChanges«
1245
42 Konflikte behandeln
1249
42.1 Allgemeine Betrachtungen
1249
42.1.1 Das pessimistische Sperren
1250
42.1.2 Das optimistische Sperren
1250
42.2 Konkurrierende Zugriffe mit dem Entity Framework
1251
42.2.1 Das Standardverhalten des Entity Frameworks
1251
42.2.2 Das Aktualisierungsverhalten mit »Fixed« beeinflussen
1252
42.2.3 Auf die Ausnahme »OptimisticConcurrencyException« reagieren
1253
42.2.4 Das ClientWins-Szenario
1254
42.2.5 Das StoreWins-Szenario
1257
43 Die DbContext-API
1259
43.1 Datenabfragen mit »DbContext«
1259
43.1.1 Eine Entität mit »DbSet<>.Find« suchen
1261
43.1.2 Lokale Daten mit »Load« und »Local«
1262
43.1.3 In Beziehung stehende Daten laden
1264
43.2 Ändern von Entitäten
1269
43.2.1 Entitäten ändern
1269
43.2.2 Hinzufügen einer neuen Entität
1270
43.2.3 Löschen einer Entität
1271
43.3 Change Tracking (Änderungsnachverfolgung)
1274
43.3.1 Snapshot Change Tracking
1275
43.3.2 Change Tracking Proxies
1278
43.4 Kontextlose Entitäten ändern
1280
43.4.1 Entitätszustände
1281
43.4.2 »DbContext« eine neue Entität hinzufügen
1282
43.4.3 »DbContext« eine geänderte Entität hinzufügen
1283
43.4.4 »DbContext« eine zu löschende Entität angeben
1284
Index
1287