Jörn Reder > Dimedis-Sql-0.44 > Dimedis::SqlDriver::Sybase

Download:
Dimedis-Sql-0.44.tar.gz

Dependencies

Annotate this POD

View/Report Bugs
Module Version: 0.12   Source  

NAME ^

Dimedis::SqlDriver::Sybase - Sybase Treiber für das Dimedis::Sql Modul

SYNOPSIS ^

siehe Dimedis::Sql

DESCRIPTION ^

siehe Dimedis::Sql

BESONDERHEITEN DER IMPLEMENTIERUNG ^

SERIAL BEHANDLUNG

Spalten, die mit dem 'serial' Datentyp angegeben sind, müssen in der Datenbank als primary key integer Spalten deklariert sein, z.B.

        id integer primary key not null

Aufgrund von Restriktionen der Sybase Datenbank im Zusammenhang mit Parameter Binding kann der Sybase eigene identity Mechanismus nicht verwendet werden.

Stattdessen legt die $sqlh->install Methode eine eigene Tabelle für die Verwaltung von serials an.

  create table dim_serial (
          name  varchar(32),
          id    integer default 0,
          primary key(name)
  )

Die Verwaltung dieser Tabelle erfolgt durch Dimedis::Sql vollkommen transparent.

BLOB BEHANDLUNG

Blobs werden vollständig über eine eigene Implementierung innerhalb von Dimedis::Sql verwaltet. Hierzu legt die $sqlh->install Methode eine Tabelle an, die Blobs in Form von einzelnen Datensätzen mit einer maximalen Größe von derzeit knapp 16KB aufnimmt.

  create table dim_blob (
          id    integer not null, 
          pos   integer not null,
          chunk image null,
          primary key(id, pos)
  )

Eine Tabelle, die einen Blob aufnehmen soll, enthält nun nur eine integer Referenz auf die ID des Blobs (dim_blob.id), da der Blob selbst ja in der dim_blob Tabelle gespeichert wird. Der Zugriff auf den Blob (lesend wie schreibend) wird durch Dimedis::Sql vollkommen transparent durchgeführt.

Sybase Blobs machen keinen Unterschied zwischen textuellen (CLOB) und binären (BLOB) Daten.

Beispiel für eine Tabelle mit Blobs:

  create table test (
        id integer primary key not null,
        bild_blob integer null,
        text_blob integer null
  )

Damit Blobs, die auf diese Weise von einer Tabelle aus referenziert werden, auch beim Löschen von Datensätzen mit entfernt werden, muß ein Trigger angelegt werden, für jede Tabelle, die Blobs enthält:

  create trigger test_del
     on  test
     for delete as
         delete from dim_blob
         where  id in (select bild_blob from deleted) or
                id in (select text_blob from deleted)

Die where Bedingung des 'delete' Statements muß natürlich entsprechend der Haupttabelle angepaßt werden. (Die 'deleted' Tabelle in der where Bedingung ist eine Pseudo Tabelle, die alle Datensätze der Haupttabelle enthält, die im Begriff sind durch das aktuell durchgeführte delete Statement entfernt zu werden).

NULL VALUES

Dies ist keine Besonderheit von Dimedis::SqlDriver::Sybase, sie betrifft Sybase Datenbanken grundsätzlich. Per Default sind Spalten in Sybase stets mit NOT NULL deklariert. Um eine Spalte zu erzeugen, die NULL Werte aufnehmen darf, muß explizit NULL angegeben werden. (Siehe Beispieltabelle bei BLOB BEHANDLUNG).

LEFT OUTER JOIN METHODE

Sybase kennt keine nested outer Joins. Derzeit liefert Dimedis::Sql zwar Werte für diesen Fall zurück, diese werden jedoch bei Ausführung von Sybase als fehlerhaft abgewiesen.

Nested outer Joins müssen demzufolge per Hand in der Applikation realisiert werden. (Ob eine Datenbank nested outer Joins unterstützt, kann mit der Methode $sqlh->get_features abgefragt werden).

CONTAINS METHODE

Diese Methode ist z.Zt. nicht implementiert, d.h. liefert immer undef zurück.

INSTALL METHODE

Die $sqlh->install Methode legt zwei Tabellen an, sofern sie nicht schon existieren:

  dim_serial    verwaltet Serials (siehe SERIAL BEHANDLUNG)
  dim_blob      verwaltet Blobs (sie BLOB BEHANDLUNG)

AUTOR ^

Jörn Reder, joern@dimedis.de

COPYRIGHT ^

Copyright (c) 1999 dimedis GmbH, All Rights Reserved

SEE ALSO ^

perl(1).

syntax highlighting: