LXXVII. SESAM Datenbankfunktionen

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 muß 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

DirectiveBedeutung
php3_sesam_omlName 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_configfileName 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_messagecatalogName 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 muß natürlich die SESAM-Datenbank selbst auf dem BS2000-System installiert und konfiguriert werden:

  • der SESAM database handler (DBH) muß 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 muß 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, daß 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,muß 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 muß 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 TypeAction
SESAM_SEEK_NEXTnone
SESAM_SEEK_PRIORnone
SESAM_SEEK_FIRSTset scroll type to SESAM_SEEK_NEXT
SESAM_SEEK_LASTset scroll type to SESAM_SEEK_PRIOR
SESAM_SEEK_ABSOLUTEAuto-Increment internal offset value
SESAM_SEEK_RELATIVEnone. (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, mußte 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 muß 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 muß 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 TypePHP 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 muß 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:

Beispiel 1. Creating a "multiple field" column


CREATE TABLE multi_field_test
(
     pkey  CHAR(20) PRIMARY KEY,
     multi(3)   CHAR(12)
)
      
und folgendermaßen ausgefüllt:

Beispiel 2. Filling a "multiple field" column


INSERT INTO multi_field_test ( pkey, multi(2..3) )
  VALUES ( 'Second', <'first_val','second_val'>)
      
Zur Beachtung: führende leere Unterfelder (wie in diesem Fall) werden ignoriert und die enthaltenen Werte damit verworfen, so daß 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.

SESAM-spezifische Details sind in den Handbüchern the SESAM/SQL-Server documentation (english) oder the SESAM/SQL-Server documentation (german) beschrieben. Beide Manuale sind online abrufbar und stehen in gedruckter Form zur Verfügung.

Inhaltsverzeichnis
sesam_connect — Eröffnet die Verbindung zu einer SESAM-Datenbank
sesam_disconnect — Trennen der Verbindung zu einer SESAM-Datenbank
sesam_settransaction — Parameter der SESAM-Transaction setzen
sesam_commit — Schreibt noch nicht gesicherte Änderungen in die SESAM-Datenbank
sesam_rollback — Verwirft alle noch nicht gesicherten Änderungen der SESAM-Datenbank
sesam_execimm — Ausführen einer "immediate" SQL-Anweisung
sesam_query — Durchführen einer SESAM-SQL-Abfrage und aufbereiten der Ergebnisse
sesam_num_fields — Liefert die Anzahl von Feldern/Spalten in einem Ausgabesatz
sesam_field_name — Liefert einen Spaltennamen des Ausgabesatzes
sesam_diagnostic — Liefert Status-Informationen über den letzten SESAM-Aufruf
sesam_fetch_result — Liefert das Ergebnis einer Abfrage (ganz oder teilweise)
sesam_affected_rows — Anzahl der von einer sofortigen (???) Abfrage betroffenen Zeilen
sesam_errormsg — Liefert die Fehlermeldung des letzten SESAM-Aufrufs
sesam_field_array — Liefert Meta-Information über einzelne Ergebnisspalten
sesam_fetch_row — Lesen einer Zeile als Array
sesam_fetch_array — Liefert eine Zeile als assoziatives Array
sesam_seek_row — Setzt "scrollable Cursor" Modus für weitere Aufrufe
sesam_free_result — Gibt Betriebsmittel für die Abfrage frei (der Abfrage ???)