Datenbanken für WebServer
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
.
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
mysql
machen, 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:
-
grant select,insert,update,delete,create,drop on FB10.*
to mathdek identified by 'vergessen';
mathdek
darf von überall auf allen FB10-Tabellen fast alles.
-
grant select,insert,update,delete on FB10.Personal
to dekan@guevara identified by 'verloren';
dekan
darf von guevara
aus vier
Arten von Änderungen an der Tabelle FB10.Personal
durchführen.
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