SESAM/SQL-Server ist ein von Fujitsu Siemens Computers in Deutschland entwickeltes
Mainframe-Datenbanksystem für High-End Server mit dem Betriebssystem BS2000/OSD.
In zahlreichen BS2000-Installationen hat SESAM/SQL-Server unter Beweis gestellt:
die einfach zu handhabende Unterstützung von Java-, Web- und
Client-Server-Anwendungen
eine Hochverfügbarkeit von mehr als 99,99 %
die Fähigkeit, bis zu mehrere hunderttausend Benutzer zu
bedienen
Mit einer PHP3 SESAM-Schnittstelle sind jetzt auch Datenbank-Operationen per
PHP-scripts möglich.
Konfigurationshinweise:
Die PHP-SESAM-Schnittstelle muss als Modul in Apache integriert werden.
Stand-alone-Betrieb ist nicht möglich. Im Apache-PHP-Modul ist die
SESAM-Schnittstelle entsprechend
den Apache-Vorschriften zu konfigurieren.
Tabelle 1. SESAM-Konfigurationsvorschriften
Directive
Bedeutung
php3_sesam_oml
Name der BS2000-PLAM-Bibliothek mit den ladbaren Modulen des
SESAM-Treibers. Für die Nutzung von SESAM-Funktionen erforderlich.
Beispiel:
php3_sesam_oml $.SYSLNK.SESAM-SQL.030
php3_sesam_configfile
Name der Konfigurationsdatei der SESAM-Anwendung. Für die Nutzung
von SESAM-Funktionen erforderlich.
Example:
php3_sesam_configfile $SESAM.SESAM.CONF.AW
enthält im allgemeinen folgende Konfiguration (siehe auch SESAM
Referenzhandbuch):
CNF=B
NAM=K
NOTYPE
php3_sesam_messagecatalog
Name des SESAM-Meldungskatalogs. Nur erforderlich, wenn der
SESAM-Meldungskatalog nicht im BS2000-Meldungkatalog enthalten ist.
Example:
php3_sesam_messagecatalog $.SYSMES.SESAM-SQL.030
Zusätzlich zur PHP-SESAM-Schnittstelle muss natürlich die SESAM-Datenbank
selbst auf dem BS2000-System installiert und konfiguriert werden:
der SESAM database handler (DBH) muss gestartet sein
die Datenbank und der DBH müssen verbunden sein
Für eine Verbindung zwischen dem PHP script und dem DBH müssen die Parameter von
CNF und NAM der SESAM-Konfiguration
den Werten des im BS2000 gestarteten DBH ensprechen.
Bei verteilten Datenbanken muss ein SESAM/SQL-DCN-Agent gestartet
werden, dessen Konfigurationstabelle Host- und Datenbank-Namen enthält.
Die Kommunication zwischen PHP im BS2000-Subsystem POSIX und dem DBH
im BS2000 erfolgt über Zugriffe eines speziellen Treibermoduls (SQLSCI) und
der SESAM-Anschlußmodule auf einen gemeinsamen Speicherbereich (common
memory).
Der common-memory-pool-Mechanismus und die Tatsache, dass PHP in den
Webserver statisch eingebunden ist, machen die Datenbankzugriffe sehr
schnell. Datenbankzugriffe über ODBC, JDBC or UTM sind nicht erforderlich.
Nur ein kleines Lademodul (SESMOD) wird zum PHP gebunden, während die
SESAM-Anschlußmodule aus der SESAM-OML (PLAM-Bibliothek) nachgeladen werden.
library. In der PHP-Konfiguration,muss diese SESAM-OML und der
für die SESAM-Konfiguration erforderliche Linkname angegeben werden
(SQLSCI ist wie in SESAM V3.0 in der Standard-SESAM-Toolbibliothek verfügbar).
Wegen der SQL-Syntaxvorschriften für Anführungszeichen (doppelte Anführungszeichen
statt AnfÜhrungszeichen mit vorangestelltem Gegenschrägstrich wie in manchen
anderen Datenbanken) wird empfohlen, die PHP-Konfigurationsvorschriften
php3_magic_quotes_gpc
und php3_magic_quotes_sybase
für alle SESAM betreffenden PHP-scripts auf On zu setzen.
Überlegungen zur Ablaufzeit:
Wegen der spezifischen Eigenschaften der BS2000-Prozeßsteuerung kann der
Treiber erst nach dem fork des Apache-Servers für seine Sohn-Prozesse
geladen werden. Der erste SESAM-Zugriff jedes dieser Prozesse wird dadurch
etwas verlangsamt, alle weiteren Zugriffe werden jedoch ohne Beeinträchtigung
abgearbeitet.
Ein explizit definierter SESAM-Meldungskatalog wird bei jedem Laden des Treibers
(d.h. beim ersten SESAM-Zugriff) geladen. BS2000 erzeugt nach dem erfolgreichen Laden
dieses Katalogs eine Meldung, die an die error_logfile von Apache geschickt wird.
Da BS2000 z. Zt. ein Unterdrücken dieser Meldung nicht erlaubt, wird das logfile
langsam damit vollgeschrieben.
Bitte beachten: die SESAM-OML (PLAM-Bibliothek) und die SESAM-Konfigurationsdatei
müssen für die Benutzerkennung, unter der der Webserver läuft, lesbar sein!
Andernfalls kann der Server den Treiber nicht laden, womit die SESAM-Funktionen
nicht zur Verfügung stehen. Auch der Zugriff die Datenbank selbst muss dem Server
möglich sein, da sonst keine Verbindung zum DBH möglich ist.
Cursor Typen:
Die für SQL-Abfragen "select type" zugewiesenen Ergebniscursor können
"sequential" oder "scrollable" sein, Standardwert ist wegen des geringeren
Speicherbedarfs "sequential"
"Scrollable" Cursors können im Ausgabedatensatz beliebig positioniert werden.
Für jede "scrollable" Abfrage gibt es globale Standardwerte für den Scroll-Typ
(initialisiert zu: SESAM_SEEK_NEXT) und der Scrolling-Abstand,
der entweder einmal mit: sesam_seek_row() oder jedesmal beim
Lesen einer Zeile mit: sesam_fetch_row() gesetzt werden kann.
Die folgende Tabelle zeigt die Behandlung der globalen Stadtardwerte für
Scroll-Typ und Scroll-Abstand beim Lesen einer Zeile mit "scrollable" Cursor:
Tabelle 2. Scrolled Cursor Post-Processing
Scroll Type
Action
SESAM_SEEK_NEXT
none
SESAM_SEEK_PRIOR
none
SESAM_SEEK_FIRST
set scroll type to
SESAM_SEEK_NEXT
SESAM_SEEK_LAST
set scroll type to
SESAM_SEEK_PRIOR
SESAM_SEEK_ABSOLUTE
Auto-Increment internal offset value
SESAM_SEEK_RELATIVE
none. (maintain global default
offset value, which allows
for, e.g., fetching each 10th row backwards)
Bemerkungen zur Portierung:
Da in PHP Indizes üblicherweise mit NULL gestartet werden, musste
die SESAM-Schnittstelle entsprechend adaptiert werden: während in
der "normalen" SESAM-Schnittstelle ein Array mit Index 1 beginnt,
wird in PHP NULL als Startpunkt verwendet - z.B. hat beim Lesen von
Spalten mit sesam_fetch_row() die erste Spalte
den Index 0 und the folgenden Spalten haben Indizes bis zu (aber
nicht einschließlich!) dem Spaltenindex ($array["count"]).
Beim Portieren von SESAM-Anwendungen aus aus anderen höheren
Programmiersprachen nach PHP ist diese Schnittstellenänderung zu
beachten. Wo es erforderlich ist, beinhaltet die jeweilige
PHP-SESAM-Funktion einen Hinweis auf die mit NULL beginnende
Indizierung.
Sicherheitsaspekte:
Beim Zugriff auf SESAM-Datenbanken sollte der normale Benutzer
eines Web-Servers nur die allernötigsten Privilegien bekommen.
Im allgemeinen sollte auf Datenbanken nur lesender Zugriff
möglich sein. Weitergehende Rechte sollten - nur falls wirklich
erforderlich - abhängig vom jeweiligen Einsatzfall eingerichtet
werden. Auf keinen Fall sollte man beliebigen Benutzern im Internet
volle Zugriffsrechte auf eine Datenbank gewähren! Der Zugriff auf
PHP-scripts für die Datenbank-Administration sollte in jedem Fall
per Passwort und/oder durch SSL-Verbindung geschützt sein.
Migration von anderen SQL-Datenbanken:
Unterschiedliche SQL-Ausprägungen sind nie 100-prozentig kompatibel.
Bei der Portierung von SQL-Anwendungen anderer Datenbanken nach SESAM
können daher Anpassungen erforderlich sein. Auf folgende, typische
Unterschiede sei besonders hingewiesen:
Herstellerspezifische Datentypen
Manche herstellerspezifischen Datentypen müssen u.U. durch
Standard-SQL-Typen ersetzt werden, wie z.B. TEXT
in VARCHAR(max. size).
Schlüsselwörter als SQL-Bezeichner
In SESAM müssen Schlüsselwörter in Anführungsstrichen (???)
angegeben werden (SQL-Standard) Schlüssel.
Länge der Anzeige in Datentypen
Datentypen in SESAM sind nicht durch Längenangabe, sondern
durch ihre Genauigkeit spezifiziert. Statt int(4)
für ganze Zahlen bis '9999' braucht SESAM lediglich
int für eine implizite Länge von 31 Bit. Als Datentypen
für Datum und Zeit gibt es in SESAM nur: DATE,
TIME(3) und TIMESTAMP(3).
SQL-Datentypen mit herstellerspezifischen Attributen der Form:
unsigned, zerofill, oder
auto_increment attributes
Unsigned und
zerofillwerden nicht unterstützt. Um die SESAM-implizite
automatische Erhöhung zu nutzen, gibt es anstelle von "... VALUES(0,
...)" automatisch Auto_increment (
"INSERT ... VALUES(*, ...)".
.
int ... DEFAULT '0000'
Numerische Variablen dürfen nicht mit Zeichenkonstanten initialisiert
werden. Statt dessen ist DEFAULT 0 zu verwenden.
Dem Initialisierungs-string für Variablen des SQL-Datentyps datetime
muss das jeweilige Schlüsselwort als Prefix vorangestellt werden wie in
CREATE TABLE exmpl ( xtime timestamp(3) DEFAULT TIMESTAMP
'1970-01-01 00:00:00.000' NOT NULL
);
$count = xxxx_num_rows();
Manche Datenbanken liefern die geschätzte/erratene Anzahl von
Ausgabezeilen als Abfrageresultat an, obwohl der gelieferte
Wert grob falsch ist. SESAM kennt die Anzahl von Ausgabezeilen
erst, wenn sie tatsächlich gelesen wurden. Falls diese Information
TATSÄCHLICH benötigt wird, sollte man SELECT COUNT(...)
WHERE ..., versuchen. Diese Funktion ermittelt die
Anzahl der Treffer. Ein zweiter Aufruf liefert (hoffentlich)
die eigentlichen Ergebnisse.
DROP TABLE thename;
In SESAM muss im Kommamdo DROP TABLE
der Name entweder um die Schlüsselwörter RESTRICT
oder CASCADE ergänzt werden. Bei der Angabe von
RESTRICT wird ein Fehler gemeldet, wenn abhängige
Objekte (z.B. VIEWs) existieren, während bei CASCADE
abhängige Objekte zusammen (???) mit der definierten Tabelle
gelöscht werden.
Bemerkungen zu weiteren SQL-Datentypen:
SESAM unterstützt z.Zt. keine Daten von Typ BLOB. Für zukünftige
SESAM-Versionen ist diese Unterstützung geplant.
Bei SQL-Abfragen werden von der PHP-Schnittstelle folgende Datentypen
automatisch konvertiert:
Tabelle 3. SQL to PHP Type Conversions
SQL Type
PHP Type
SMALLINT, INTEGER
"integer"
NUMERIC, DECIMAL, FLOAT, REAL, DOUBLE
"double"
DATE, TIME, TIMESTAMP
"string"
VARCHAR, CHARACTER
"string"
Bei Abfragen auf ganze Zeilen wird das Ergebnis als Array geliefert.
Leere Felder werden nicht gefüllt, d.h. ihre Existenz muss explizit mit
isset() oder empty() überprüft werden.
Dies ermöglicht dem Benutzer eine bessere Kontrolle als durch Rückgabe
eines Leer-strings zur Darstellung eines leeren Feldes.
Unterstützung der SESAM-Features "multiple fields":
Diese spezielle SESAM-Funktion erlaubt die Definiton von Spalten als Feld-Array.
Eine "multiple field" Spalte wird wie folgt definiert:
Zur Beachtung: führende leere Unterfelder (wie in diesem Fall) werden ignoriert
und die enthaltenen Werte damit verworfen, so dass in obigem Beispiel das Ergebnis
als multi(1..2) angezeigt wird und nicht als multi(2..3).
Bei der Ausgabe von Ergebniszeilen wird auf "multiple columns" wie auf "inlined"
zusätzliche Spalten zugegriffen. Im obigen Beispiel bekommt "pkey" den Indexwert
NULL und auf die drei Spalten "multi(1..3)" kann mit den Indizes 1 bis 3 zugegriffen
werden.