Sven Rautenberg: SELECT * bei Auslesen aus einer Datenbank

Beitrag lesen

Moin!

Hallo,

wobei "meist" zu lesen ist als "immer, bis auf eine einzige Ausnahme", die da lautet: Wenn man einfach jede verdammte Spalte haben möchte, *egal welche es gibt*, dann kann(!) "SELECT *" sinnvoll sein.

Also bei Datensätzen, die aus ID, Vorname, Familienname, Hobby, Auto, Weltanschauung und Wohnort bestehen und ich alles bis auf die ID ausgeben will, ist

SELECT vorname, familienname, hobby, auto,weltanschauung, wohnort FROM ...

besser als

SELECT * FROM ... und dann eine Ausgabe ohne der IDs?

Eindeutig. Einer der Gründe:

Wenn sich später mal die Tabelle um die zwei Felder "Einkommen" und "HD_Biometriebild" erweitert, würde ein SELECT * sowohl die sensitive Information "Einkommen" als auch die Megabytes des Biometriebildes aus der Datenbank abfragen.

Bei den Megabytes des Bildes dürfte es auf den ersten Blick verständlich sein, dass nicht benötigte Daten nicht abgefragt gehören, denn die werden, obwohl du sie hinterher wegwirfst, trotzdem in Datenpuffern zwischengespeichert und verbrauchen RAM.

Das Einkommen als Beispiel soll veranschaulichen, dass diese vertrauliche Information natürlich ebenfalls abgefragt wird, und parallel zu den restlichen Daten z.B. in einem Array landet. Nicht immer wird die Situation aber so sein, dass du die Datenbankabfrage gleich in Ausgabe von HTML wandelst und den Datenrest wirklich vergißt. Üblich dürfte eher sein, dass das Abfrageergebnis an andere Programmteile weitergereicht wird. Und wenn du diesen Programmteilen evtl. nicht vertrauen kannst, oder sie vielleicht dynamisch steuerbar sind hinsichtlich der Anzeige der gelieferten Spalten, so würde die Information "Einkommen" vielleicht wo angezeigt, wo sie nie hätte auftauchen sollen. Sowas vermeidet man dadurch, dass man immer nur genau die Daten abfragt, die man konkret wissen möchte.

Du sparst dir damit übrigens auch kaum Tipparbeit. So ein SQL-Statement schreibt man (als Geübter) im Prinzip genau einmal hin, wenn man das entsprechende Abfragemodul schreibt, und ändert es danach nur, wenn sich tatsächlich die abzufragenden Daten verändern. Es wird aber im Laufe der Softwareentwicklung viel häufiger vorkommen, dass man nochmal nachschaut, welche Spalten denn genau abgefragt werden - und da ist eine explizite Liste, die genau aufführt, was an Daten kommt, viel besser als ein nichtssagendes "*", bei dem man dann wieder die Datenbank kontaktieren muß, um nachzugucken, welche Spalten denn mittlerweile alle existieren.

Auf die Nützlichkeit, dass die DB mit einer Fehlermeldung reagiert, wenn irgendwer dir eine erwartete Spalte ohne Hinweis gelöscht oder umbenannt hat, wurde bereits hingewiesen.

- Sven Rautenberg

--
"Love your nation - respect the others."