Virtabs: Application-Interfaces

Application-Interfaces

“Application-Interfaces” ist der pauschale Begriff für Software-Module, die eine Benutzung von Virtabs ermöglichen oder erleichtern.

Server: Interface-Tabellen (x-Tables)

Dies ist ein völlig überholtes Konzept aus der Zeit, als ORACLE noch keine INSERT-, UPDATE oder DELETE- Trigger auf Views zuliess (vor 8.0.3). Um serverseitig eine Virtab wie eine tabelle ansteuern zu können, wurde eine “Interface-Tabelle” erzeugt, in der Datensätze manipuliert werden konnten. Bei diesen Schreibvorgänge wurden mit Table-Triggern auch die Virtab-Prozeduren aufgerufen. Die Datensätze exisiterten dannach zweimal: einmal (ungewollt) in der Interface-Tabelle, und dann wie gewünscht in der “richtigen” Datenbank.
Dieses Konzept wurde nur in spezeillen Szenarien eingesetzt, z.B. beim Import von Daten, wo ausschliesslich INSERT-Anweisungen abgesetzt wurden. Nach dem Import wurde die Interfacetabelle samt Inhalt komplett vernichtet, da Daten darin nciht DELETETed werden konnten: dies hätte sie ja auch wieder aus der echtne Datenbank entfernt.

Server: View-Trigger

Lange nach Erfindung der Virtabs wurden bei ORACLE (ab 8.0.3)  Trigger auf Views erlaubt (“INSTEAD OF”), mit denen Schreibvorgänge auf Views abgefangen werden können. Dies ist der natürliche Mechanismus, mit dem ein Schreiben in eine Virtab-View den Aufruf der Virtab-Prozeduren bewirken kann. Erst seitdem können Virtabs sowohl serverseitig als auch von jedem Clienten aus angesteuert werden.

Mit der Option -deftrigger erzeugt er2sqlo den Definitionscode für diese View-Trigger.

Beispiel für den Update-Trigger aus dem Beispiel “depts”:

CREATE OR REPLACE TRIGGER tu_DEPTS
     INSTEAD OF UPDATE ON VT_DEPTS FOR EACH ROW
BEGIN
  pu_DEPTS (:new.REGIONAL_GROUP,:new.DEPARTMENT,:new.STREET,:new.CITY,
           :new.STATE,:new.ZIP_CODE ) ;
END ;
 /

Client-Interfaces

Warum muss es überhaupt noch spezielle Client-Interfaces geben, wenn doch serverseitig eine Virab schon als Table gekaspelt wird?

  1. Die Kapselung ist nicht 100%ig: Die Datenbankschicht von Borland Delphi ist zum Beispiel so intelligent, dass sie es bemerkt, wenn eine View statt einer Table angesteuert wird. In diesem Fall verweigert sie das Absetzen von Insert/Edit/Delete-Anweisungen über ihre Datatsets. Nur direkte SQL-Ausgabe könnte die Virtab-View schreibend ansteuern.
  2. Die Virtab-Prozeduren haben Zusatzfunktionen, die die übergebenen Feldwerte verändern (z.B. Generieren von Primärschlüsseln, oder Setzen von Default-Werten. Dadurch entspricht der Inhalt der Client-Recordsets nicht mehr der tatsächlichen Datenlage im Server. Als Folge müsste nach jeder clientseitigen Datenmanipulation ein “Refresh” durchgeführt werden, was eine zusätzliche Belastung von Server und Netzwerk darstellen würde.
    Application-Interfaces sind spezielle Datasets, die die von der Virtab geänderten Werte sofort enthalten.

Die Systemarchitekturen sind hier noch einmal grafisch dargestellt:

Client: Delphi

Für Delphi wurden im Laufe der Zeit drei verschiedene  Interface-Units benutzt.

Das Interface “Delphi 1” wurde für das alte 16-Bit Delphi 1.0 entwickelt.

Die Interface “Delphi 2” und “Delphi 3” laufen (verwirrender Weise) beide ab Delphi 3.0. “Delphi 2” sollte nicht verwendet werden. “Delphi 3” stellt Virtabs als visuelle Komponenten dar.
Das Interface “Delphi 3 ODAC” entspricht dem Delphi-Interface 3, setzt aber nicht auf der BDE (Borland Database Engine) auf, sondern auf dem ODAC-Package, das eine BDE-kompatible Direktansteuerung von ORACLE-Datenbanken bietet.

Client: Java

Das Interface für Java ist noch ein Prototyp. Es definiert einen Nachfahren für java.sql.ResultSet, basiert also auf JDBC. Es kann derzeit nur innerhalb von POLARIS verwendet werden. Der Grund für den Einsatz des Java-Interfaces ist nur Nr 2: automatische Aktualisierung des Recordsets nach Datenmanipulation.

 

Varianten der Benutzung von Virtabs in verschiedenen Systemumgebungen

Varianten-Alias

Anforderung Server

Anforderung Client

Features

ER2SQL-Optionen

x_table

traditionelles View-Konzept, prozedurales SQL, table trigger

(Oracle7+,
MS SQLServer6+)

keine

Interface zur Virtab wird über physikalisch existierende Hilfstabelle gebildet
Das Resultat ist doppelte Datenhaltung!

Delphi-unabhängig, Zugriff über Table-Objekt der eingesetzten Umgebung

-defview
-defprocs
-deftable

Stored Procs

traditionelles View-Konzept, prozedurales SQL (Oracle7+,
MS SQLServer6+)

Interface zu serverseitigen
stored procedures

direkte Benutzung der VT-View und ihrer Prozeduren, keine Simulation einer tabellenartigen Komponente

(VirTab ist kein Objekt)

-defview
-defprocs

Delphi1

wie oben

Delphi1.0 C/S
(BDE ohne cache),
modifizierte Delphi-Unit db.pas

tabellenähnliche Komponente, damit DataSet-spezifische Zugriffe möglich

(Virtab ist Objekt TVirtabT/Q, aber keine visuelle Komponente)

-defview
-defprocs
-delphi

Delphi3

wie oben

Delphi3.0 C/S
(cachende BDE / UpdateSQL-Komponente)
Kein Support für BDE ab Delphi 7!

kein modifiziertes db.pas

(Virtab ist visuelle Komponente TVirtabTable/Querydbname)

-defview
-defprocs
-dbname
-dbschema
-delphi3

Delphi3-ODAC

wie oben

ab Delphi 5, ODAC-Lizenz!

(Virtab ist visuelle Komponente TVirtabTable/Querydbname)

-defview
-defprocs
-dbname
-dbschema
-delphi3_odac

Java

wie oben

JDBC 2.0

Prototyp für POLARIS!

-defview
-defprocs-java

view trigger

traditionelles View-Konzept, prozedurales SQL; Möglichkeit, modifizierende Zugriffe auf Views durch Trigger abzufangen (Oracle8+)

keine

Client-unabhängig, Zugriff über Table-Objekt des eingesetzten Entwicklungswerkzeugs

-defview
-defprocs
-deftrigger

 

 

[Virtabs] [Positionierung] [Schreibbare Views?] [Schreibbare Views!] [Feature-Überblick] [Virtabs entwickeln] [Unterstützte Datenbanken] [Referenz] [Konzepte] [Application-Interfaces] [Struktur der Demo-DB] [Guided tour] [Beispiel-Code]