Drauf(Sicht)

Wie der Titel schon vermuten lässt, geht es in diesem Eintrag um eine Problematik die mir aufgefallen ist als ich mit einer View gearbeitet habe.

Grundsätzlich zu Views
Mit Views lässt sich einiges in Bezug auf Abfragen erleichtern. Um nur ein paar Beispiele zu nennen.
Man nehme an man habe eine längere Abfrage die aus ca. fünf Joins besteht und diese Abfrage wird im laufe des Tages mehrmals ausgeführt. Nun ist die Idee dieses Scripts bestehend aus ca. 15 Zeilen auf eventuell eine Zeile zu reduzieren und zwar mit Hilfe einer Sicht. Ein weiteres positives Beispiel von Views kann vor allem für Administratoren hilfreich sein die sich um die Security kümmern müssen.

Nehmen wir an folgendes Szenario tritt ein: Es wird ein Praktikant eingestellt der in der Datenbank in der Tabelle Mitarbeiter einfache Abfragen ausführen soll.

Die Tabelle schaut wie folgt aus:

Mitarbeiter_tab

Wenn nun der Praktikant mit der Tabelle arbeitet, hat er Einsicht auf Spalten die er eventuell nicht sehen sollte. In unserem Beispiel Geburtsdatum und Gehalt.

Jetzt gibt es zwei Möglichkeiten diese Problem zu lösen.
Erste Variante: Auf die Tabelle die dementsprechenden Spaltenberechtigungen vergeben.

Allerdings ist Variante mit den Spaltenberechtigungen nur suboptimal da die Übersichtlichkeit über die Berechtigungen leicht verloren gehen kann.

Zweite Variante: Eine Sicht erstellen die alle Spalten der Mitarbeiter Tabelle auflistet bis auf die Geburtsdatum- und die Gehaltsspalte. Jetzt noch das Recht zum Lesen auf der Tabelle verweigern und auf der Sicht erteilen und voila!

Bis jetzt haben wir nur Vorteile einer Sicht gesehen, jetzt aber schauen wir uns mal die Problematik an.

Ich erstellte mal folgende Sicht

Create View v_Mitarbeiter
as
     Select * from Mitarbeiter


Das Ergebnis sieht wie folgt aus

Ergebnis_mitarbeiter

Das Ergebnis wie zu erwarten

 

Jetzt nehme ich eine Änderung der Tabelle vor und zwar füge ich eine weitere Spalte hinzu.

Alter Table Mitarbeiter 
     Add Probezeit bit

 

So Tabelle um eine weitere Spalte erweitert
Jetzt sieht das Ergebnis der Sicht merkwürdig aus

Select * from v_Mitarbeiter


Ergebnis:

Ergebnis_Sicht

Wie gut zu erkennen ist kommen in der Sicht alle Spalten vor, bis auf die neuhinzugefügte.
Das wäre jetzt noch nicht so tragisch, jetzt gehe ich allerdings noch einen Schritt weiter.

Jetzt lösche ich die Tabelle. Erstelle sie neu mit dem gleichem Namen, allerdings mit einer kleinen Änderung und zwar setze ich die Geburtsdatumsspalte auf die zweite Position also direkt nach MID.

Drop Table Mitarbeiter
go
Create Table Mitarbeiter
(
     MID int identity,
     Geburtsdatum date,
     Abteilung varchar(50),
     Vorname varchar(50),
     Nachname varchar(50),
     Gehalt smallmoney
)

So, und jetzt wirds richtig abstrus.
Abfrage der Sicht:

Ergebnis_strange

Wie hier klar zusehen ist finden wir jetzt beim Aufruf der Sicht komischerweise ein Datum in der Vorname-Spalte.


Hierzu kann ich nur sagen AUSPASSEN sobald eine Tabellenstruktur geändert wird, denn die Sichten leiden darunter und können dann nicht mehr Ordnungsgemäß funktionieren.
Ein Lösungsansatz wäre die Sicht mit der Option Schemabindung anzulegen, das verhindert nämlich das ändern der Tabellenstruktur.

Kommentare sind geschlossen