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).
1 POD Error
The following errors were encountered while parsing the POD:
- Around line 796:
Non-ASCII character seen before =encoding in 'für'. Assuming CP1252