WebServer SS01 Datenbanken für WebServer

Warum hier? Was wird hier vorgestellt?

Wie wir gesehen haben, beruhen wesentliche Anwendungen im Internet auf dem Zugriff und der Änderung von Daten auf der Serverseite - sei es nun für E-Commerce, Datenpflege in einem Intranet, o.ä.. Sobald die Datenmengen dabei mehr als 25 Einträge überschreiten, ist meines Erachtens eine Datenbank sinnvoll. (Über die 25 kann man gern mit mir streiten :-) Deswegen benutzt jeder einigermassen großes WebServer eine oder mehrere Datenbanken im Hintergrund, und deswegen haben wir das Thema hier mit aufgenommen. Wir wollen aber keine Vorlesung zum Thema Datenbanken machen, sondern nur den praktischen Einsatz erläutern. Wir verwenden dazu die frei für viele Plattformen erhältliche SQL-Datenbank mySQL.

Installation von mySQL

Mit mySQL kommt ein umfangreiches online-Handbuch, in dem u.a. die Installation beschrieben ist, deswegen geben wir hier nur eine kurze Zusammenfassung. Eine installierte Binärdistribution für solaris ist auf hands (und überall am FB) unter /share/mySQL/mysql verfügbar, auch die im Handbuch erwähnten perl-Module sind eingespielt - sie wollen wir benutzen.
Eine Datenbank besteht aus einem Datenbankserver (hier mysqld), der auf einer Maschine läuft und auf Anfragen wartet, die über den vereinbarten Port eintreffen - soweit alles wie bei einem http-Server. Der Datenbankserver hat Zugriff auf einen (Filesystem-)Bereich, wo er seine Daten ablegen darf. Anfragen werden an den Server über unterschiedliche Klienten übermittelt, dabei muss sich der Klient gegenüber dem DB-Server authentifizieren.

Anlegen einer Datenbank

Der DB-Server servt ggf. durchaus mehrere Datenbanken, die in seinem Datenbereich zunächst initial angelegt werden müssen. Bei mySQL dient für solche Verwaltungsaufgaben ein spezielles Programm mysqladmin, zum anlegen einer Datenbank
mysqladmin -u root create DatenBankName

Auf diese Datenbank kann aber noch niemand (ausser der db-root) zugreifen. Wir können aber DB-User anlegen, und denen Zugriff auf eien Datenbank gewähren.

Fast alle Kommandos werden dann mit dem DB-Dämonen verhandelt, man muss also zunächst einen DB-Klienten starten, sich dem Server gegenüber ausweisen, eine DB wählen, und dann darin arbeiten. Man kann das im Terminal mit dem Kommando mysqlmachen, kann aber auch (s.u.) andere Klienteninterfaces verwenden.

Anlegen von DB-Benutzern

mySQL hat durchaus eine eigene Vorstellung von Benutzern und Passwörtern, sogar von sehr ausführlichen Privilegien und auch eine eigene Verwaltung derselben. Der Eigner der DB muss also erstmal Benutzer einrichten, denen dann die gewünschten Privilegien eingeräumt werden. Genaugenommen verwaltet mySQL diese Daten natürlich auch in einer Datenbank (mysql), in der Tabelle user. Neben den Standard-SQL-Anweisungen zum Ändern gibt es aber auch noch spezielle Kommandos für diese Aufgaben, im wesentlichen ist das grant, das nebenher auch die user anlegt. Dabei können Berechtigungen recht spezifisch vergeben werden, einige Beispiele:

Anlegen von DB-Tabellen

Mit der Datenbank hat man nun zwar eine einen Platz für seine Daten, aber noch keine Struktur. In relationalen Datenbanksystemen wie mySQL legt man die Basisdaten in Tabellen ab, die dann bei Anfragen auf dibverse Arten verknüpft werden können. In diese Tabellenb legt man seine Daten ab. Das Anlegen erfolgt mit dem Kommando create table, als BSP:
  create table Personal (
   Personalnummer smallint(16) unsigned 
     not null default 1 auto_increment primary key,
   Nachname text not null,
   Vorname text,
   Titel text,
   Email text,
   WWW char(128) default 'http://www.math.uni-meunster.de/',
   Raum text,
   Strasse char(128) default 'Einsteinstr. 62',
   Ort char(128) default '48149 Münster',
   Telefon char(64),
   Fax char(64) default '+49-(0)251-83-38350'   
  );
      
Mit dem Kommando alter table kann man diese Festlegungen ggf. später noch ändern oder erweitern - man sollte aber am besten von vorherein ein gutes Datenbankdesign festlegen, weil Änderungen im Nachinein schwierig sind, und ggf. alle Programme angepasst werden müssen, die sich auf ein vorhandenes Design verlassen!
Löschen kann man eine Tabelle übrigens mit drop table.

Werte in Tabellen bearbeiten

Einfügen mit insert into <tabledef> ... values (..., ...)
insert into Personal (Nachname,Vorname,Titel) values ('Lammers','Dietmar','Dr.');
	  
Läßt man die Spaltennannamen weg, muss man alle Werte angeben. Neben insert gibt es noch load data infile, um vorhandenen Daten aus Dateien zu laden - sinnvoll etwa, wenn man mit excel-Daten endlich in einer echten Datenbank verwalten will.
Ändern mit update <tabledef> set ... where ...
update Personal set Raum='312',Telefon='+49-(0)251/83-33755' 
       where Personal.Personalnummer=123;
	  
Ersetzen mit replace <tabledef> ... values (..., ...)
Genau wie insert, aber wenn ein eindeutiges Spaltenelement (unique index) schon mit dem angegebenen Wert existiert, wird die Zeile ersetzt, nicht eingefügt.
Löschen mit delete from <tabledef> where ...
delete from Personal where Personal.Personalnummer=123;
	  
Abfragen mit select <coldef> from <tabledef> where ...
Mit select kann man Zeilen aus einer (oder mehreren) Tabelle(n) zugreifen, und ggf. auch recht komplexe Ausdrücke darauf anwenden. Einige häufige Beispiele:
select * from Personal where Nachname like 'Lamme%';
select concat(Nachname,', ',Vorname) as Nachname from Personal order by Nachname;
select t1.Nachname, t2.Gehalt from Personal as t1, Gehälter as t2 where
       t1.Nachname = t2.Nachname;
	  
Weitere Kommandos, die man sich ggf. mal ansehen sollte, sind lock tables, use <Database>, show tables und describe <Tabelle> .

Zugriff aus perl

Wie bereits erwähnt, muss man nicht über das mitgelieferte Terminal-Interface zugreifen. Wenn die richtigen Module installiert sind, geht das z.Bsp auch aus einem perl-Program heraus. wir betrachten ein kommentiertes Beispiel (fragment):
# benutzer das DBI interface Modul
use DBI;               

# DB-Verbindung erstellen (client aufmachen, anmelden, db wählen)
$user="lammers";
$password="sagichnicht";     
$dbh = DBI->connect("DBI:mysql:host=hands:database=lammers", 
		    $user, $password, { RaiseError => 1 })
                     || die $DBI::errstr;

# Vorbereiten der Anfragen
$student = $dbh->prepare("replace into Student values (?,?,?,?,?,'')");
$webserver = $dbh->prepare("replace into WebServerListe (Student, Fachsemester) values(?,?)"); 


# Einlesen der Daten in assoc-Array
%f = scanForm();       

# Eintragen der Student-Daten
$student->execute(
		  $f{Matrikel},
		  $f{Name},
		  $f{Vorname},
		  $f{Email},
		  ( $f{Studienfach} =~ /sonst/ ? $f{Bemerkungen} : $f{Studienfach} )
		 );

# Eintragen der WebServerListe-Daten
$webserver->execute(
		    $f{Email},
		    $f{Semester}
		   );

$dbh->disconnect;  # und Tschüss ...
      

[Inhalt]

Dietmar Lammers, Frank Wübbeling
Last modified: Mon May 21 11:20:21 MET DST 2001