| |
Inhaltsverzeichnis |
6 |
|
| |
Vorwort |
14 |
|
| |
Kapitel 1 – Überblick |
16 |
|
| |
1.1 Better together |
17 |
|
| |
1.2 Microsoft-SQL-Server-2005-Produktfamilie |
21 |
|
| |
1.3 Datenbank-Anwendungen |
24 |
|
| |
1.4 Die Installation aus der Sicht des Entwicklers |
30 |
|
| |
1.5 Welche Werkzeuge muss der Entwickler kennen? |
38 |
|
| |
1.5.1 SQL Server Command Line Tool |
39 |
|
| |
1.5.2 SQL Server Configuration Manager |
45 |
|
| |
1.5.3 SQL Server Surface Area Configuration (SAC) |
46 |
|
| |
1.5.4 SQL Server Profiler |
47 |
|
| |
1.5.5 SQL Server Agent |
49 |
|
| |
1.5.6 SQL Server Import and Export Wizard |
49 |
|
| |
1.5.7 SQL Server Management Studio |
50 |
|
| |
1.5.8 SQL Server Business Intelligence Development Studio |
56 |
|
| |
1.6 Nachträgliches Passwort für sa? |
57 |
|
| |
1.7 AdventureWorks oder Northwind? |
57 |
|
| |
1.8 Wie geht es weiter? |
60 |
|
| |
Kapitel 2 – SQL vs. T-SQL |
62 |
|
| |
2.1 Was ist SQL? |
62 |
|
| |
2.2 Warum wird SQL verwendet? |
64 |
|
| |
2.3 Wie verwaltet SQL die Daten? |
67 |
|
| |
2.3.1 Datenbank-Objekte |
67 |
|
| |
2.3.2 SQL-Befehlsausführung |
70 |
|
| |
2.4 SQL-Zeichen |
74 |
|
| |
2.4.1 Kommentar |
75 |
|
| |
2.4.2 Anweisungsbegrenzer |
75 |
|
| |
2.4.3 Bezeichner und Namen |
77 |
|
| |
2.4.4 SQL-Schlüsselwörter |
79 |
|
| |
2.4.5 Sonderfall sp_ (special) |
80 |
|
| |
2.4.6 Unicode-Zeichen |
81 |
|
| |
2.5 SQL-Kommandoklassen |
82 |
|
| |
2.5.1 Data Definition Language (DDL) |
82 |
|
| |
2.5.2 Data Manipulation Language (DML) |
94 |
|
| |
2.5.3 Data Query Language (DQL) |
95 |
|
| |
2.5.4 Transaction Control Language (TCL) |
101 |
|
| |
2.5.5 Database Administration Language (DAL) |
101 |
|
| |
2.6 Operatoren |
103 |
|
| |
2.7 Funktionen |
108 |
|
| |
2.8 Wie geht es weiter? |
112 |
|
| |
Kapitel 3 – Datenbanken für den SQL Server 2005 |
114 |
|
| |
3.1 System- vs. Benutzerdatenbank |
114 |
|
| |
3.1.1 Sonderfall User Instance = True (nur Express Edition) |
115 |
|
| |
3.1.2 Normalfall einer eingehängten Benutzerdatenbank |
116 |
|
| |
3.2 Neue Datenbank anlegen |
117 |
|
| |
3.2.1 Interaktiv über das SSMS |
117 |
|
| |
3.2.2 Datenbank über ein T-SQL-Script anlegen |
119 |
|
| |
3.3 Leistungsfähige Datenbanken |
126 |
|
| |
3.3.1 Neue Anforderungen |
126 |
|
| |
3.3.2 Problemzone CPU |
128 |
|
| |
3.3.3 Problemzone Festplatte |
129 |
|
| |
3.3.4 Filegroup |
137 |
|
| |
3.4 Datenbank-Design |
141 |
|
| |
3.4.1 Anforderungen an eine Datenbank |
142 |
|
| |
3.4.2 Relationale Datenbank |
144 |
|
| |
3.5 Die Tabelle als Ablageplatz der Daten |
147 |
|
| |
3.5.1 Relationen |
148 |
|
| |
3.5.2 Sicht-Tabelle (View) |
148 |
|
| |
3.5.3 Normalisierung |
151 |
|
| |
3.5.4 Denormalisierung |
153 |
|
| |
3.5.5 Gefahrenstelle Hotspot |
154 |
|
| |
3.5.6 PRIMARY KEY – der Fingerabdruck eines Datensatzes |
157 |
|
| |
3.5.7 FOREIGN KEY – der Sicherheitsgurt |
166 |
|
| |
3.5.8 Temporäre Tabellen |
174 |
|
| |
3.6 Index |
175 |
|
| |
3.6.1 CLUSTERED INDEX – der Karteikasten |
176 |
|
| |
3.6.2 NONCLUSTERED INDEX – die Abkürzung für Lesezugriffe |
177 |
|
| |
3.6.3 Covering Index |
185 |
|
| |
3.6.4 Zusammenfassung: Primärschlüssel als Clustered Index |
186 |
|
| |
3.6.5 Zusammenfassung: Primärschlüssel als Nonclustered Index |
187 |
|
| |
3.7 Constraints |
187 |
|
| |
3.7.1 DEFAULT |
188 |
|
| |
3.7.2 CHECK |
191 |
|
| |
3.8 Computed Column |
192 |
|
| |
3.9 Datenbankbenutzer |
194 |
|
| |
3.9.1 SQL-Server-Login |
196 |
|
| |
3.9.2 Beispiel Internet-Anwendung |
201 |
|
| |
3.9.3 Fixed Server Roles |
201 |
|
| |
3.10 Backup und Restore |
201 |
|
| |
3.10.1 Wiederherstellungsmodell „Vollständig“ |
202 |
|
| |
3.10.2 Sind regelmäßige Datenbank-Backups ausreichend? |
206 |
|
| |
3.11 Wie geht es weiter? |
208 |
|
| |
Kapitel 4 – Transact-SQL im Detail |
210 |
|
| |
4.1 SELECT |
210 |
|
| |
4.1.1 Kartesisches Produkt – die schlechte Lösung |
211 |
|
| |
4.1.2 Die JOIN-Syntax |
211 |
|
| |
4.1.3 INNER JOIN |
214 |
|
| |
4.1.4 OUTER JOIN |
214 |
|
| |
4.1.5 SELF JOIN |
215 |
|
| |
4.1.6 CROSS JOIN |
216 |
|
| |
4.1.7 Correlated Subquery |
216 |
|
| |
4.1.8 Derived Table |
217 |
|
| |
4.1.9 CROSS APPLY und OUTER APPLY |
218 |
|
| |
4.1.10 WITH CUBE |
219 |
|
| |
4.1.11 GROUPING |
220 |
|
| |
4.1.12 WITH ROLLUP |
220 |
|
| |
4.1.13 Daten aus fremden Datenbankformaten abfragen |
221 |
|
| |
4.1.14 Daten aus externen Datenbanken abfragen |
222 |
|
| |
4.1.15 TOP(x) |
224 |
|
| |
4.1.16 EXCEPT und INTERSECT |
225 |
|
| |
4.1.17 RANK und DENSE_RANK |
226 |
|
| |
4.1.18 NTILE |
227 |
|
| |
4.1.19 TABLESAMPLE |
228 |
|
| |
4.1.20 ROW_NUMBER |
228 |
|
| |
4.1.21 Common Table Expressions (CTE) |
230 |
|
| |
4.1.22 PIVOT |
235 |
|
| |
4.1.23 UNPIVOT |
236 |
|
| |
4.1.24 SELECT generiert SQL-Anweisungen |
238 |
|
| |
4.1.25 CASE |
238 |
|
| |
4.2 INSERT, UPDATE und DELETE |
239 |
|
| |
4.2.1 BULK INSERT |
239 |
|
| |
4.2.2 UPDATE übernimmt Daten aus einer anderen Tabelle |
240 |
|
| |
4.2.3 TOP |
241 |
|
| |
4.2.4 OUTPUT |
242 |
|
| |
4.3 TRY..CATCH |
243 |
|
| |
4.3.1 Ein Blick zurück – das Verhalten im SQL Server 2000 |
243 |
|
| |
4.3.2 Die neuen Möglichkeiten vom SQL Server 2005 |
245 |
|
| |
4.3.3 Eleganter Migrationspfad |
247 |
|
| |
4.4 Neue Datentypen des SQL Server 2005 |
247 |
|
| |
4.4.1 VARCHAR(MAX) und VARBINARY(MAX) |
248 |
|
| |
4.4.2 XML |
249 |
|
| |
4.5 Verschlüsselung |
265 |
|
| |
4.5.1 Warum Daten zusätzlich verschlüsseln? |
265 |
|
| |
4.5.2 Service Master Key |
268 |
|
| |
4.5.3 Database Master Key |
268 |
|
| |
4.5.4 EncryptByPassPhrase |
270 |
|
| |
4.5.5 Symmetrischer Schlüssel |
272 |
|
| |
4.5.6 Asymmetrische Schlüssel |
273 |
|
| |
4.5.7 Zertifikat |
278 |
|
| |
4.5.8 Verschlüsselte Daten übertragen (Weg 1) |
281 |
|
| |
4.5.9 Verschlüsselte Daten übertragen (Weg 2) |
285 |
|
| |
4.5.10 Verschlüsselte Datenbank verschieben |
287 |
|
| |
4.6 Database Mail |
290 |
|
| |
4.7 Transaktionen |
297 |
|
| |
4.7.1 Synchronisationsprobleme |
297 |
|
| |
4.7.2 Transaktionen |
300 |
|
| |
4.7.3 Transaktionsmodelle |
307 |
|
| |
4.7.4 Sperrverfahren |
308 |
|
| |
4.7.5 Isolationsgrad einer Transaktion |
314 |
|
| |
4.7.6 Deadlock |
319 |
|
| |
4.7.7 Transaction Log |
324 |
|
| |
Kapitel 5 – Stored Procedure, Trigger und Function |
326 |
|
| |
5.1 Variablen |
326 |
|
| |
5.2 Steuerung des Ausführungsverlaufs |
328 |
|
| |
5.2.1 IF…ELSE |
328 |
|
| |
5.2.2 GOTO |
329 |
|
| |
5.2.3 WHILE |
330 |
|
| |
5.2.4 RETURN |
331 |
|
| |
5.2.5 WAITFOR |
332 |
|
| |
5.2.6 RAISERROR |
333 |
|
| |
5.3 Cursor |
335 |
|
| |
5.3.1 Cursortypen |
335 |
|
| |
5.3.2 Cursor verwenden |
336 |
|
| |
5.3.3 FAST_FORWARD-Cursor |
339 |
|
| |
5.3.4 FOR UPDATE-Cursor |
346 |
|
| |
5.3.5 Gefahrenstelle CURSOR |
348 |
|
| |
5.4 Stored Procedure |
350 |
|
| |
5.4.1 Vorteile von Stored Procedures |
350 |
|
| |
5.4.2 Die Hallo-Welt-Prozedur anlegen |
360 |
|
| |
5.4.3 Aufruf einer Stored Procedure |
362 |
|
| |
5.4.4 WITH EXECUTE AS |
368 |
|
| |
5.4.5 Debuggen einer T-SQL Stored Procedure |
369 |
|
| |
5.4.6 Stored Procedure aus .NET heraus debuggen |
375 |
|
| |
5.4.7 Rekursionen |
377 |
|
| |
5.4.8 ALTER PROCEDURE |
378 |
|
| |
5.4.9 Default-Parameter |
379 |
|
| |
5.4.10 Benannte Parameter |
380 |
|
| |
5.4.11 Dynamische Tabellennamen |
380 |
|
| |
5.4.12 Implementierung über sp_helptext einsehen |
382 |
|
| |
5.4.13 Microsoft-Beispiele |
383 |
|
| |
5.5 Trigger |
384 |
|
| |
5.5.1 AFTER-Trigger |
385 |
|
| |
5.5.2 INSTEAD OF-Trigger |
395 |
|
| |
5.5.3 DDL-Trigger |
398 |
|
| |
5.5.4 Trigger deaktivieren |
403 |
|
| |
5.5.5 Microsoft-Beispiel |
403 |
|
| |
5.6 User-Defined Function |
403 |
|
| |
5.6.1 Scalar Function |
404 |
|
| |
5.6.2 Table-Valued Function |
406 |
|
| |
5.7 Die Darstellung im Object Explorer |
408 |
|
| |
5.8 Wie geht es weiter? |
410 |
|
| |
Kapitel 6 – CLR-Integration |
412 |
|
| |
6.1 Ein Blick zurück |
412 |
|
| |
6.2 Was ist „managed Code“? |
416 |
|
| |
6.3 Grundsätze der Implementierung |
418 |
|
| |
6.3.1 Sicherheit, Sicherheit und nochmals Sicherheit! |
420 |
|
| |
6.3.2 Assemblies |
422 |
|
| |
6.3.3 AppDomain |
424 |
|
| |
6.3.4 CAS (Code Access Security) |
425 |
|
| |
6.3.5 TRUSTWORTHY |
430 |
|
| |
6.3.6 Zusammenfassung |
431 |
|
| |
6.4 CLR-Unterstützung aktivieren |
431 |
|
| |
6.5 Das Minimal-Beispiel mit Notepad |
432 |
|
| |
6.5.1 Schritt 1: OSNotepadSP.vb oder OSNotepadSP.cs |
433 |
|
| |
6.5.2 Schritt 2: Assembly im SQL Server 2005 installieren |
436 |
|
| |
6.5.3 Schritt 3: Aliasname in der Datenbank einrichten |
436 |
|
| |
6.6 Besonderheiten |
438 |
|
| |
6.6.1 Speicherverbrauch der CLR? |
438 |
|
| |
6.6.2 Verweise auf externe Assemblies |
441 |
|
| |
6.6.3 Datentypen |
441 |
|
| |
6.6.4 Eigene Exceptions auslösen |
444 |
|
| |
6.7 Das Visual-Studio-2005-Beispiel |
445 |
|
| |
6.7.1 SQL Server Projekt von Visual Studio 2005 |
446 |
|
| |
6.7.2 Deploy über Visual Studio 2005 |
449 |
|
| |
6.7.3 Remote Debugging der CLR Stored Procedure |
451 |
|
| |
6.8 Der Wettkampf: T-SQL vs. SQLCLR |
452 |
|
| |
6.8.1 Disziplin Zeichenkettenlänge berechnen |
452 |
|
| |
6.8.2 Disziplin Zeichen ersetzen |
453 |
|
| |
6.9 Zugriff über ADO.NET auf die Datenbank |
456 |
|
| |
6.10 Das UNSAFE-Beispiel |
457 |
|
| |
6.11 CLR User-Defined Function |
461 |
|
| |
6.11.1 CLR Scalar-Valued Function |
462 |
|
| |
6.11.2 CLR Table-Valued Function |
470 |
|
| |
6.12 CLR Trigger |
473 |
|
| |
6.13 User-Defined Types? |
476 |
|
| |
6.14 Microsoft-Beispiele |
477 |
|
| |
Kapitel 7 – Server Management Objects (SMO) |
478 |
|
| |
7.1 Windows Management Instrumentation (WMI) |
478 |
|
| |
7.1.1 Was ist WMI? |
478 |
|
| |
7.1.2 WMI und der SQL Server 2005 |
479 |
|
| |
7.2 Server Management Objects (SMO) |
483 |
|
| |
7.2.1 SMO-Objektmodell |
484 |
|
| |
7.2.2 SMO-Beispiel: Datenbankbackup |
485 |
|
| |
7.3 Microsoft-Beispiele |
490 |
|
| |
Kapitel 8 – SQL Server Reporting Services |
492 |
|
| |
8.1 Der Hallo-Welt-Bericht |
494 |
|
| |
8.2 Der Report Wizard |
505 |
|
| |
8.2.1 Schritt 1: Datenbanktabelle vorbereiten |
506 |
|
| |
8.2.2 Schritt 2: Neues Berichtsprojekt anlegen |
507 |
|
| |
8.2.3 Schritt 3: Bericht veröffentlichen |
515 |
|
| |
8.2.4 Schritt 4: Bericht in die eigene Anwendung integrieren |
518 |
|
| |
8.3 Report Manager |
524 |
|
| |
8.4 SQL Server Management Studio |
526 |
|
| |
8.5 Report Builder |
526 |
|
| |
8.5.1 Das Berichtsmodell |
527 |
|
| |
8.5.2 Der Report Builder |
532 |
|
| |
8.6 Das ReportViewer-Control |
534 |
|
| |
8.6.1 Das DataSet aus ADO.NET |
534 |
|
| |
8.6.2 ReportViewer |
537 |
|
| |
8.7 Microsoft-Beispiele |
539 |
|
| |
Kapitel 9 – Service Broker |
540 |
|
| |
9.1 Was ist ein Service Broker? |
540 |
|
| |
9.1.1 Der Microsoft SQL Server 2005 Service Broker (SSB) |
542 |
|
| |
9.1.2 Das Hello-World-Beispiel |
545 |
|
| |
9.1.3 Datenbankübergreifender Nachrichtenversand |
562 |
|
| |
9.1.4 Serverübergreifender Nachrichtenversand |
571 |
|
| |
9.1.5 Beispiel für den bidirektionalen Nachrichtenaustausch |
572 |
|
| |
9.1.6 Troubleshooting |
577 |
|
| |
9.1.7 Entscheidungskriterien |
578 |
|
| |
9.2 Event Notification |
579 |
|
| |
9.2.1 Das Prinzip |
579 |
|
| |
9.2.2 Das FOR CREATE_DATABASE-Beispiel |
582 |
|
| |
9.3 Query Notification |
585 |
|
| |
9.3.1 Das Prinzip |
586 |
|
| |
9.3.2 SqlDependency |
587 |
|
| |
9.3.3 SqlCacheDependency |
594 |
|
| |
9.3.4 SqlNotificationRequest |
594 |
|
| |
9.4 Microsoft-Beispiele |
595 |
|
| |
Kapitel 10 – Web Services |
596 |
|
| |
10.1 Wie funktioniert ein Web Service? |
597 |
|
| |
10.2 SQL Server 2005 Web Service |
599 |
|
| |
10.3 Das Beispiel für Windows XP |
601 |
|
| |
10.4 Der C#-Client für den SQL Server 2005 Web Service |
606 |
|
| |
10.5 Das Beispiel für Windows Server 2003 |
608 |
|
| |
10.6 Resümee |
612 |
|
| |
Anhang A – Einführung in ADO.NET |
614 |
|
| |
A.1 Die Ziele |
615 |
|
| |
A.2 Wichtige Klassen (Komponenten) |
617 |
|
| |
A.2.1 Grundregel zu SqlConnection |
619 |
|
| |
A.2.2 SqlDataAdapter |
621 |
|
| |
A.2.3 SqlCommandBuilder |
624 |
|
| |
A.2.4 DataSet |
625 |
|
| |
A.2.5 DataTable |
631 |
|
| |
A.3 Typisiertes vs. untypisiertes DataSet |
634 |
|
| |
A.4 TableAdapter – der typisierte SqlDataAdapter |
638 |
|
| |
A.5 Data Source |
639 |
|
| |
A.5.1 BindingSource |
643 |
|
| |
A.5.2 Data-Sources-Fenster von Visual Studio 2005 |
644 |
|
| |
A.5.3 TableAdapter und BindingSource |
645 |
|
| |
A.5.4 Master/Detail-Beziehungen |
648 |
|
| |
A.6 DataGridView |
650 |
|
| |
A.7 TableAdapter und Transaktionen |
655 |
|
| |
A.8 Resümee |
662 |
|
| |
Stichwortverzeichnis |
664 |
|