Am 14. September 2017 haben wir eine überarbeitete Fassung unserer Datenschutzrichtlinie veröffentlicht. Wenn Sie video2brain.com weiterhin nutzen, erklären Sie sich mit diesem überarbeiteten Dokument einverstanden. Bitte lesen Sie es deshalb sorgfältig durch.

SQL Grundkurs 1: Die Sprache erlernen

DML mit einer Sicht

LinkedIn Learning kostenlos und unverbindlich testen!

Jetzt testen Alle Abonnements anzeigen
Eine Sicht zeigt immer aktuelle Daten an. DML-Anweisungen greifen immer auf die der Sicht zugrunde liegende Tabelle durch. Unter welchen Voraussetzungen DML-Anweisungen auf eine Sicht angewendet werden können, das zeigt Ihnen dieser Film.

Transkript

In diesem Video zeige ich Ihnen in wieweit Sie Schreibzugriffe über eine View realisieren können. Zu diesem Zweck erzeuge ich mir die Sicht "Haushalt" die Artikel aus der Artikelgruppe "Haushalt" aus der Artikeltabelle filtert. Ich erzeuge mir die View und greife einmal darauf zu und wir sehen hier entsprechend den Inhalt dieser View. Das sind 278 Datensätze. Falls Sie sich fragen was dieses "Go" hier bedeutet. Dieses "Go" ist keine SQL-Anweisung, sondern das ist eine Verfahrensanweisung für das Managementstudio, für den Editor. Dieses "Go" sagt dem System: Unterbreche hier den Batch. Brauchen würden wir dieses "Go" hier an dieser Stelle nicht. Das ist sozusagen nur ein Beschwichtigungs- , ein Beruhigungsmittel für den Editor. Wenn wir es nämlich nicht hinein schreiben kommt immer diese rote Linie hier unter der CREATE-Anweisung mit dem Hinweis, dass der "CREATE VIEW" die einzige Anweisung im Batch sein muss. Aber damit wir nicht immer diese rote Linie hier im Hintergrund haben, besänftige ich den Editor, indem ich das "Go" hier einfach dazwischen setze. Was hat es jetzt mit diesem Inhalt, den uns diese Sicht hier liefert, auf sich? Prinzipiell ist einmal eine brennende Frage: Die Daten, die eine View liefert, sind das Echtdaten? Oder ist das eine Kopie der Daten? Worum handelt es sich? Generell ist es so, dass eine View keine eigenen Daten enthält. Eine View enthält nur das SELECT-Statement, das definiert, welche Daten angezeigt werden. Mit anderen Worten: Der Inhalt einer View ist immer aktuell. Kontrollieren wir das. Wir sehen zum Beispiel, dass die Artikelnummer "1001" aktuell einen Verkaufspreis von 10,68 Euro aufweist. Ich ändere diesen Preis direkt in der Tabelle. "Set VKpreis ist gleich 15, where Artikelnummer ist gleich 1001". Eine Zeile betroffen. Und nun greife ich wieder über die View "Haushalt" und nicht direkt auf die Artikeltabelle zu. Und ich sehe hier sofort den geänderten Preis. Das liegt nicht daran, dass im Hintergrund vielleicht irgendein Synchronisationsprozess läuft. Nein, sondern das immer, wenn ich die View ausführe im Hintergrund das SELECT-Statement ausgeführt wird und ich deshalb aktuell, online sozusagen, auf Daten zugreife. Inwiefern kann ich jetzt direkt über eine View Daten ändern? Generell ist das möglich und wenn ich über eine View Änderungen durchführe, dann mache ich das auch nicht an einer Datenkopie, sondern direkt in den Echtdaten. Das greift wiederum voll auf die Tabelle durch. Um Ihnen das zu zeigen, realisiere ich dasselbe Update nun direkt auf die View. Also ich mache ein Update nicht auf die Artikeltabelle, sondern auf die View "Haushalt" und erhöhe den Preis noch einmal um einen Euro auf 16 Euro. Ich bekomme die Meldung, dass eine Zeile betroffen ist. Und kontrollieren wir das Ganze nun direkt in der Tabelle "Artikel": "where Artikelnummer ist gleich 1001". Und wir sehen das direkt in der Tabelle der Preis auch auf 16 Euro geändert worden ist. Unter welchen Voraussetzungen also kann ich DML-Anweisungen, "Insert", "Update" und "Delete" auf eine View realisieren? Entscheidend ist die Komplexität des SELECT-Statements. Sobald ich hier komplexe Anweisungen enthalten habe, wird das Datenbankmanagementsystem die Sicht für Schreibzugriffe sperren. Ich werde Ihnen das anhand eines Beispiels erläutern. Ich füge mir hier eine Anweisung ein, die Kopierung, Berechnungen enthält. Also entsprechend komplex ist. Die Erzeugt ein berechnetes Ergebnis. Daraus kann ich natürlich eine View machen, indem ich sage: "create view wave.mitarbeiterzahlen s" und verwende dieses SELECT-Statement. Ich rücke hier noch etwas ein, damit die Optik besser zur Geltung kommt und erzeuge diese Sicht. Etwas ist noch ganz wichtig: Sie sehen es hier. Ich habe hier diese Anweisung hineinkopiert. Ich habe hier die ORDER BY-Klausel nicht entfernt. ORDER BY-Klausel ist außer in Kombination mit TOP in Sichten nicht erlaubt. Das ist kein Manko, sondern das macht auch Sinn. Warum? Weil eigentlich eine Sortierung nicht in der Sicht zu passieren hat, sondern danach, wenn wir darauf zugreifen. D.h. ich erzeuge jetzt diese Sicht und verwende sie nun, indem ich hier darauf zugreife und sage: "SELECT * FROM wave.mitarbeiterzahlen ORDER BY" z.B. "Abteilung". Das heißt die ORDER BY-Klausel gehört beim Abruf aus der View und nicht in die Definition der View hinein. Und jetzt habe ich hier diese Daten über die View bekommen. Nun versuche ich ein Update auf diese View, Update auf die Mitarbeiterzahlen und sage: "SET Damen = 2 WHERE Abteilung = controlling". Um damit sozusagen die Anzahl der Damen hier in dieser Spalte von 0 auf 2 zu erhöhen. Wenn ich diese Anweisung ausführe, bekomme ich natürlich eine Fehlermeldung, dass hier ein Aktualisieren nicht möglich ist. Das ist technisch nicht möglich, weil die Mitarbeiteranzahl der Damen, die ich hier sehe, ein berechneter Wert und kein Wert ist, der 1:1 so in einer Tabelle vorhaben ist. Wenn also ein SELECT-Statement zu komplex ist, zu viele JOINs enthält, zu viele Berechnungen, dann kommt irgendwann der Punkt, bei dem das Datenbankmanagementsystem die Sicht für Änderungen sperrt. Die Grenzen sind hier nicht immer bei allen Systemen dieselben: Manche lassen ein bisschen mehr zu, andere wiederum ein bisschen weniger. Generell können wir also bei SELECT- Statements, die nicht so komplex sind sowohl mit "Insert", "Update" und "Delete" darauf zugreifen. Wie es mit einem "Update" funktioniert haben wir bereits gesehen. Wir haben bereits hier einen Preis geändert. Wie sieht es mit einem Löschen über eine View aus? Ich versuche jetzt über die View, hier einen Artikel zu löschen. "Delete FROM wave.Haushalt" und verwende eine Artikelnummer "WHERE Artikelnummer =". Ich suche mir jetzt hier eine heraus und hoffe, dass ich nicht einen erwische, die auf Grund von referenziellen Integritäten gesperrt ist. Ich nehme hier die Artikelnummer "1838" und führe diesen Löschvorgang aus. Ich bekomme die Meldung. Das Ganze hat funktioniert. Und zur Kontrolle, wenn ich jetzt sage: "SELECT * from wave.Artikel", also direkt auf die Tabelle zugreife und versuche diesen Artikel auszugeben, dann bekomme ich kein Ergebnis mehr. Das heißt das Löschen über die View ist generell möglich. Ich kann auch etwas aus der View löschen, unter Anführungszeichen. Was ist damit gemeint? In unserer Definition der View sind ja nur Artikel enthalten, die der Artikelgruppe "Haushalt" angehören. Ich kann jetzt diese Artikelgruppe "Haushalt" hier nicht ändern, weil sie in der Definition der View nicht enthalten ist. Das werde ich nun aber ändern. Ich hole mir hier die Anweisung für diese View, kopiere sie mir, ändere das CREATE in ALTER und werde jetzt hier zusätzlich hinten noch die Spalte Gruppe ergänzen. Nun haben wir die Spalte Artikelgruppe hier ebenso mit in der View. Was passiert jetzt, wenn ich zum Beispiel hier die Artikelgruppe von "Haushalt" auf "Besteck" ändern würde? Ich würde den Datensatz nicht aus der Tabelle löschen, aber ich würde ihn quasi logisch aus der View löschen, weil die Bedingung dann nicht mehr erfüllt ist. Ich mache also ein Update auf meine Haushaltssicht: "SET Gruppe = Besteck WHERE Gruppe" nehmen wir mal nicht die Gruppe, sondern die Artikelnummer " = 1003". Das heißt ich verbanne nun diesen Artikel aus dieser Gruppe. Ich führe die Anweisung aus und jetzt sieht es für mich so aus, als wäre dieser Artikel gelöscht worden. In der Artikeltabelle ist er noch da, aber in der Sicht wird er nicht mehr angezeigt. Manche Datenbankmanagementsysteme stellen Optionen bereit, um genau solche Aktionen zu unterbinden, die sogenannte "Check Option". Wie schaut es nun abschließend mit einem INSERT über eine View aus. Prinzipiell können Sie über eine View auch Datensätze erfassen. Voraussetzung hierfür ist, dass in der View keine Spalten fehlen, die in der Tabelle als "NOT NULL" definiert sind und mit keinem Standardwert belegt sind. Das sollte hier in unserem Fall eigentlich so sein. "INSERT INTO" -- Und verwende hier den namen der Sicht, "wave Haushalt", und nehme hier die Bezeichnung, die Artikelnummer verwende ich hier nicht, weil die hier als "Identity" definiert ist in der Tabelle und automatisch vergeben wird -- Bezeichnung, Lieferant, Einkaufspreis, Verkaufspreis aktiv und die Gruppe. Deckungsbeitrag kann ich natürlich nicht befüllen, das ist ein berechneter Wert. Und über die VALUES-Klausel definiere ich nun eine Bezeichnung: "Testartikel, Lieferant 1002, Einkaufspreis 5 Euro, Verkaufspreis 6 Euro". Aktiv ist er und die Gruppe, damit wir es auch sehen, ich könnte solange diese Checkoption nicht aktiv ist sogar eine andere Artikelgruppe hier verwenden, aber ich füge diese hier ein. 1,2,3,4,5,6 Spalten, 1,2,3,4,5,6 Werte. Sollte eigentlich passen. Versuchen wir die Anweisung und wenn alle NOT NULL-Spalten ohne Default-Wert hier befüllt werden, dann wird diese Anweisung auch funktionieren. Sonst nicht. Wir haben jetzt hier die Rückmeldung, dass es funktioniert hat und können nun direkt in der Tabelle nachsehen. Und wir sortieren absteigend nach der Artikelnummer, damit der zuletzt neu eingefügte Datensatz mit der nun höchsten Artikelnummer am Beginn des Ergebnisses zu sehen sein wird. Und hier ist auch unser Testartikel mit der nächsten Artikelnummer, der ist hier eingefügt worden. Spalten, die nicht in der Sicht enthalten sind, sind entweder "NULL" geblieben oder haben ihren Default-Wert bekommen. Wie zum Beispiel die Bestellmenge oder die Mehrwertsteuer. Sie haben in diesem Video gesehen, dass Sie über eine View, wenn diese nicht zu komplex ist, auch DML-Anweisungen ausführen können. Wenn Sie Daten über eine View einfügen möchten, ist Voraussetzung, dass alle Spalten aus der Tabelle, die keinen Standardwert haben und als "NOT NULL" definiert sind, über die View verfügbar sind. Sonst ist ein Einfügen nicht möglich. Ein Löschen und ein Ändern ist dann möglich, wenn es nicht über entsprechende View-Optionen unterbunden wird.

SQL Grundkurs 1: Die Sprache erlernen

Arbeiten Sie sich in die Grundlagen der Datenbanksprache SQL am Beispiel von Microsoft SQL Server, Oracle und MySQL ein und lassen Sie sich die praktische Nutzung erklären.

14 Std. 40 min (112 Videos)
Derzeit sind keine Feedbacks vorhanden...
 

Dieser Online-Kurs ist als Download und als Streaming-Video verfügbar. Die gute Nachricht: Sie müssen sich nicht entscheiden - sobald Sie das Training erwerben, erhalten Sie Zugang zu beiden Optionen!

Der Download ermöglicht Ihnen die Offline-Nutzung des Trainings und bietet die Vorteile einer benutzerfreundlichen Abspielumgebung. Wenn Sie an verschiedenen Computern arbeiten, oder nicht den ganzen Kurs auf einmal herunterladen möchten, loggen Sie sich auf dieser Seite ein, um alle Videos des Trainings als Streaming-Video anzusehen.

Wir hoffen, dass Sie viel Freude und Erfolg mit diesem Video-Training haben werden. Falls Sie irgendwelche Fragen haben, zögern Sie nicht uns zu kontaktieren!