DBC, RI-Code und Logging Vortrag vom 26.05.05 bei der FoxPro User Group Schweiz © Marc Voillat, Interbrain AG, 8048 Zürich.

Slides:



Advertisements
Ähnliche Präsentationen
Object Relational Mapping
Advertisements

Folien 2-5, 7-8 © Prof. Dr. Manfred Rössle (FH Aalen)
spezielle Nutzersichten formale Ebene (deskriptive Regeln)
Objekt – Relationales – Modell Tomasz Makowski IN
SQL Server 2005.NET Integration Sebastian Weber Developer Evangelist Microsoft Deutschland GmbH.
Systemüberblick Beispiele: Microsoft Access Oracle Ingres Informix
SendEplanung Datenbank
SQL als Abfragesprache
Datensicherheit in DBMS
IS: Datenbanken, © Till Hänisch 2000 CREATE TABLE Syntax: CREATE TABLE name ( coldef [, coldef] [, tableconstraints] ) coldef := name type [länge], [[NOT]NULL],
Otto-von-Guericke-Universität Magdeburg Gamal Kassem 1 Tabellenzeile mit READ lesen READ TABLE itab INDEX idx READ TABLE itab WITH KEY comp1 = f1.... Compn.
Otto-von-Guericke-Universität MagdeburgGamal Kassem Übung 7 Reports mit Datenbankzugriff.
Die Skriptsprache Perl (8) Wolfgang Friebel DESY Zeuthen.
Datenintegrität Referentielle Integrität create table
Datenbanken 10: Einfügen, Ändern, Löschen
3.5.2 Fremdschlüssel/ Referentielle Integrität (6/9)
3.5.2 Fremdschlüssel/ Referentielle Integrität (1/9)
Grundlagen der Tabellen von FoxPro/Windows und Microsoft Visual FoxPro
Arbeiten mit DBC in Visual FoxPro 9.0 deutschsprachige FoxPro User Group Rainer Becker Microsoft Visual FoxPro 9.0 WebCast DBC.
Datenbankcontainer in Microsoft Visual FoxPro
Datenmodellierung mit XCASE
Wizards & Builders GmbH Klassenbibliotheken Arbeiten mit Klassenbibliotheken in Microsoft Visual FoxPro.
Wizards & Builders GmbH Die Benutzeroberfläche Interaktives Arbeiten mit den Werkzeugen/Assistenten von Microsoft Visual FoxPro.
Arbeiten mit SQL in Visual FoxPro 9.0
Bidirektionales VFX-XML-Interface für Daten-Import/Export Visual Extend Anwendertreffen 2009 Rainer Becker, Frank Kropp deutschsprachige FoxPro User Group.
VFP Beispiele sowie Tools, Frameworks und Klassen
Neue DBF und DBC Befehle in Visual FoxPro
Lokal Views (Ansichten) in Visual FoxPro
Rushmore - Einführung oder wie Sie Fehler vermeiden.
Arbeiten mit Konstanten in Visual FoxPro 9.0 deutschsprachige FoxPro User Group Rainer Becker Microsoft Visual FoxPro 9.0 Roadshow CONST.
Arbeiten mit SQL in Visual FoxPro 9.0 deutschsprachige FoxPro User Group Rainer Becker Microsoft Visual FoxPro 9.0 Roadshow SQL.
Erstellen von WebServices mit Visual FoxPro 9.0
Visual Extend 9.5ff Most Wanted Features deutschsprachige FoxPro User Group Rainer Becker VFXWISH06.
VFX 10.0 Visual Extend Datenzugriff
Visual FoxPro 6.0 Visual FoxPro einrichten Datenbanken und Tabellen.
Uwe Habermann WPF Avalon Formulare aus VFP verwenden Venelina Jordanova
Visual Extend Weitere Features deutschsprachige FoxPro User Group Uwe Habermann VFX 25 D.
Uwe Habermann VFX 11.0 Profi Features Venelina Jordanova
© 2004 Uwe Habermann Visual Extend 9.0 Technical Preview Diplom-Informatiker Uwe Habermann Visual Extend Product Manager
Uwe Habermann VFX 11.0 Einsatz von Cursoradaptern in bestehenden Anwendungen Venelina Jordanova
PHP Pakete und Beispiele Webengineering Robert Lemke.
Grundschutztools
JDBC: JAVA Database Connectivity
Datenbankentwicklung IV-LK
SQL PHP und MySQL Referat von Katharina Stracke und Carina Berning
Agenda Vereinfachte Grundeinrichtung und Dateneingabe
© 2003 Uwe Habermann Visual Extend 7.1 Die Entwicklungsumgebung für VFP 8.0 Uwe Habermann Diplom-Informatiker
Relationale Datenbanken III
SQL Server 2005 CLR-Integration
Betrieb von Datenbanken Marco Skulschus & Marcus Wiederstein Datenmanipulation Lehrbuch, Kapitel 4.
Typo 3. INSTALLATION TYPO3 INSTALLTOOL EXTENSIONS UND TEMPLATES INSTALLATION TEMPLAVOILA USERMANAGEMENT Inhalt:
Visual Extend CTableForm Builder deutschsprachige FoxPro User Group Uwe Habermann VFX 08 D.
Visual Extend Mandantenfähigkeit deutschsprachige FoxPro User Group Uwe Habermann VFX 22 D.
Visual Extend Application Wizard deutschsprachige FoxPro User Group Uwe Habermann VFX 06 D.
WS 2013/14 Datenbanksysteme Do 17:00 – 18:30 R Vorlesung #7 SQL (Teil 4)
Relationales Datenmodell und DDL
Structured Query Language
© 2001 Sven Dammann1 Aufbau Integrierter Informationssysteme XML Bearbeitung und relationale Abbildung Sven Dammann Martin-Luther-Universität Halle-Wittenberg.
Integritätsbedingungen (Constraints)
CODA - Installation Installation der Binärdateien –Venus: Client-Programm –Vice: Server-Programm –Für Windows existiert eine Alpha-Version (Coda Client.
TypoScript.
11 Zugriffskontrolle (Access Control) Ziele Privilegien Rollen GRANT und REVOKE Befehl Privilegien Rollen GRANT und REVOKE Befehl.
Trigger-abhängige Client Interaktionen (bezüglich Oracle8i)
Datenbank für Skriptenverkauf
PHPmyadmin Maya Kindler 6c.
WS 2014/15 Datenbanksysteme Do 17:00 – 18:30 R Vorlesung #9 SQL Zusammenfassung.
Effektives Delta Laden DOAG SID Data Warehouse. Ziele Welche CDC Methoden gibt es? Typische Fallen Verschiedene Lösungsansätze praktische Beispiele.
Sprachumfang von SQL Vier Kategorien DDL (Data Definition Language)
VFP-Praxis Reparatur von VFP Datenbanken
D-SQL SQLization – endlich Client/Server!
 Präsentation transkript:

DBC, RI-Code und Logging Vortrag vom bei der FoxPro User Group Schweiz © Marc Voillat, Interbrain AG, 8048 Zürich

Übersicht Der Database Container (DBC): Struktur Struktur Einzelheiten zum Feld Property Einzelheiten zum Feld Property Inhalt und Erweiterungsmöglichkeiten Inhalt und Erweiterungsmöglichkeiten Datenbankereignisse Datenbankereignisse Referentielle Integrität (RI): Insert, Update, Delete Trigger und Stored Procedures Insert, Update, Delete Trigger und Stored Procedures Code Templates in Visual FoxPro und xCase Code Templates in Visual FoxPro und xCase Generische Implementierungsansätze Generische Implementierungsansätze Einzelheiten zum Lösungsansatz von Interbrain Einzelheiten zum Lösungsansatz von Interbrain Spezifische Probleme beim Schreiben von RI-Code Spezifische Probleme beim Schreiben von RI-Code

Übersicht Logging / Auditing: Timestamps vs. Logging Timestamps vs. Logging FoxAudit FoxAudit Einzelheiten zum Lösungsansatz von Interbrain Einzelheiten zum Lösungsansatz von Interbrain Weiterführende Ideen: Log Viewer Log Viewer Verwaltung der Relationen Verwaltung der Relationen Datenbank auf Designfehler überprüfen Datenbank auf Designfehler überprüfen Fragen und Diskussion

DBC: Struktur Hinweise zu einzelnen Feldern: ParentId: Baumstruktur Baumstruktur Relationen sind von der Kind- zur Elterntabelle definiert Relationen sind von der Kind- zur Elterntabelle definiert ObjectType (mögliche Werte): Database Database Table Table Field Field Index Index Relation Relation Connection Connection View View RIInfo (drei Grossbuchstaben in folgender Reihenfolge): Update Rule (C, I oder R) Update Rule (C, I oder R) Delete Rule (C, I, R, evtl. D, N) Delete Rule (C, I, R, evtl. D, N) Insert Rule (I oder R) Insert Rule (I oder R)

DBC: Struktur Index Tags ========== Tag Name: OBJECTNAME Tag Type: REGULAR Key Expression: STR(PARENTID)+OBJECTTYPE+LOWER(OBJECTNAME) Filter Expression:.NOT.DELETED() Index Order: ASCENDING Collate Sequence: MACHINE Tag Name: OBJECTTYPE Tag Type: REGULAR Key Expression: STR(PARENTID)+OBJECTTYPE Filter Expression:.NOT.DELETED() Index Order: ASCENDING Collate Sequence: MACHINE

DBC: Feld Property Lesen und Schreiben zur Laufzeit im Normalfall mit DBGETPROP() und DBSETPROP(), in allen anderen Fällen mit Tools wie Stonefield Data- base Toolkit (SDT) oder eigenen Programmen Binärer Inhalt Ein Datenblock pro Eigenschaft bestehend aus: Länge des Datenblocks (in Bytes) Länge des Datenblocks (in Bytes) Code der Eigenschaft (freie Reihenfolge?) Code der Eigenschaft (freie Reihenfolge?) Inhalt der Eigenschaft Inhalt der Eigenschaft

DBC: Feld Property

Markierungen: Gelb: Länge des Datenblocks (Integer, 4 Bytes, little-endian) Rot: Code der Eigenschaft (gemäss Tabelle) Grün: Inhalt der Eigenschaft (String, abgeschlossen mit CHR(0)) Ohne: Funktion unbekannt

DBC: Inhalt und Erweiterungsmöglichkeiten Kein umfassendes Data Dictionnary, nur ein Minimum an ergänzenden Angaben, die sich ohne Anpassungen an den gegebenen xBase- Dateistrukturen nirgends unterbringen liessen! Erweiterung möglich über: Separate Paralleltabelle (Quasi-Standard DBCX, Tools dazu verfügbar, zum Beispiel SDT) Separate Paralleltabelle (Quasi-Standard DBCX, Tools dazu verfügbar, zum Beispiel SDT) Feld USER (von Microsoft empfohlen, wegen fehlender Standards zur Formatierung des Inhalt allerdings kaum empfehlenswert) Feld USER (von Microsoft empfohlen, wegen fehlender Standards zur Formatierung des Inhalt allerdings kaum empfehlenswert) Eigene, neue Felder (xCase, Aufwärtskompatibilität?) Eigene, neue Felder (xCase, Aufwärtskompatibilität?) Eventuell eigene Property-Codes (z.B. 128)?? Eventuell eigene Property-Codes (z.B. 128)??

DBC: Datenbankereignisse Feuern bei Vorgängen in der Datenbank (DBC) 58 Ereignisse (je 26 Before- und After-Hooks sowie sechs allgemeine Ereignisse) Standardmässig ausgeschaltet, müssen aktiviert werden (Datenbank Designer, DBSETPROP()) Programmcode als Stored Procedures oder in externer Programmdatei; Code Templates lassen sich über Datenbank-Designer erzeugen Werden nur sehr selten benutzt; Qualität der Implementierung und der Dokumentation nicht über alle Zweifel erhaben

DBC: Datenbankereignisse DBC_ActivateDBC_DeactivateDBC_BeforeAddRelationDBC_AfterAddRelationDBC_BeforeAddTableDBC_AfterAddTableDBC_BeforeAppendProcDBC_AfterAppendProcDBC_BeforeCloseTableDBC_AfterCloseTableDBC_BeforeCopyProcDBC_AfterCopyProcDBC_BeforeCreateConnectionDBC_AfterCreateConnectionDBC_BeforeCreateOfflineDBC_AfterCreateOfflineDBC_BeforeCreateTableDBC_AfterCreateTableDBC_BeforeCreateViewDBC_AfterCreateViewDBC_BeforeDBGetPropDBC_AfterDBGetPropDBC_BeforeDBSetPropDBC_AfterDBSetPropDBC_BeforeDeleteConnectionDBC_AfterDeleteConnectionDBC_BeforeDropOfflineDBC_AfterDropOfflineDBC_BeforeDropRelationDBC_AfterDropRelationDBC_BeforeDropTableDBC_AfterDropTableDBC_BeforeDropViewDBC_AfterDropViewDBC_BeforeModifyConnectionDBC_AfterModifyConnectionDBC_BeforeModifyProcDBC_AfterModifyProcDBC_BeforeModifyTableDBC_AfterModifyTableDBC_BeforeModifyViewDBC_AfterModifyViewDBC_BeforeOpenTableDBC_AfterOpenTableDBC_BeforeRemoveTableDBC_AfterRemoveTableDBC_BeforeRenameConnectionDBC_AfterRenameConnectionDBC_BeforeRenameTableDBC_AfterRenameTableDBC_BeforeRenameViewDBC_AfterRenameViewDBC_BeforeValidateDataDBC_AfterValidateDataDBC_ModifyDataDBC_OpenDataDBC_CloseDataDBC_PackData

Was man damit machen kann: Zugriff auf Datenbank oder einzelne Tabellen einschränken, beispielsweise Zugriff per ODBC / OLEDB abklemmen oder auf Leseoperationen beschränken Eigene Erweiterungen beim Öffnen der Datenbank laden und bei Struktur- änderungen synchron nachführen...?

Referentielle Integrität: Triggers und Stored Procedures Korrektheit und Konsistenz der Beziehungen zwischen Tabellen Verhindert Einfüge-, Änderungs- und Löschanomalien In Visual FoxPro implementiert als Insert-, Update- und Delete-Trigger In Visual FoxPro mögliche RI-Regeln (erweiterbar): Insert: Ignore, Restrict Insert: Ignore, Restrict Update: Cascade, Ignore, Restrict Update: Cascade, Ignore, Restrict Delete: Cascade, Ignore, Restrict (mit xCase auch: Default, Nullify) Delete: Cascade, Ignore, Restrict (mit xCase auch: Default, Nullify) Triggercode als Stored Procedures (Programmcode in der Datenbank)

Referentielle Integrität: Triggers und Stored Procedures

Referentielle Integrität: Code Templates in VFP und xCase Visual FoxPro (RI-Builder) und xCase erzeugen eine Stored Procedure pro Trigger und Tabelle (Unmengen an hochgradig redunantem, nur sehr schwer lesbarem Code) Code Templates sind weitgehend identisch und, wenn auch nur mit grösserem Aufwand, sowohl unter Visual FoxPro (Quellcode RI-Builder) als auch unter xCase (Template-Sprache TCL) modifizierbar Unter VFP 9 generierter Code funktioniert nicht (siehe xtreme~2,54,33,27256, wo auch ein Patch verfügbar ist) xtreme~2,54,33, xtreme~2,54,33,27256 Generierter Code kann für Sonderfälle zwar angepasst, anschliessend aber nie mehr neu generiert werden (Einbahnstrasse)

Referentielle Integrität: Code Templates in VFP und xCase... PROCEDURE __RI_DELETE_rechteprofile * 130 Zeilen Code PROCEDURE __RI_UPDATE_rechteprofile * 160 Zeilen Code PROCEDURE __RI_UPDATE_zugriffsrechte * 110 Zeilen Code PROCEDURE __RI_INSERT_zugriffsrechte * 95 Zeilen Code PROCEDURE __RI_DELETE_benutzer * 160 Zeilen Code PROCEDURE __RI_UPDATE_benutzer * 445 Zeilen Code PROCEDURE __RI_INSERT_benutzer * 95 Zeilen Code...

Referentielle Integrität: Code Templates in VFP und xCase foreach rel $in_rels { if { [ $rel attr E_INS_RULE] == "R" && [[ $rel PARENT] attr I_INDEX] != 0 && [$rel attr I_F_INDEX] != 0} { set e_title [[$rel PARENT] attr TITLE] set p_tag [[[$rel PARENT] PK_INDEX] attr TAG] >> "SELECT (lcChildWkArea)" >> "lcChildID=[$rel attr E_K_PAREN]" >> "pcChildDBF=dbf(lcChildWkArea)" >> "pnChildRec=recno(lcChildWkArea)" >> "pcChildID=lcChildID" >> "pcChildExpr=[addquotes [[$rel FK_INDEX] attr INDEX_KEY]]"...

Referentielle Integrität: Generische Implementierungsansätze Idee: eine einzige, generische Triggerprozedur für alle Trigger und Tabellen einer Datenbank Jim Booth & Steve Sawyer, Effective Techniques for Application Development with Visual FoxPro 6.0, Hentzenwerke Publishing, 1998, S. 75 – 89 Mängel dieses Vorschlags: Triggertyp wird teilweise falsch ermittelt Triggertyp wird teilweise falsch ermittelt Funktioniert nicht mit zusammengesetzten Indexschlüsseln, Erweiterung ist nicht trivial Funktioniert nicht mit zusammengesetzten Indexschlüsseln, Erweiterung ist nicht trivial Relationsangaben und RI-Infos müssen als Array vorliegen Relationsangaben und RI-Infos müssen als Array vorliegen

Referentielle Integrität: Lösungsansatz Interbrain Eine Stored Procedure pro Triggertyp Relationsangaben und RI-Infos werden zur Laufzeit aus der Datenbank ermittelt Funktioniert problemlos auch mit zusammengesetzten Indexschlüsseln Kein Cascading Update und kein Delete Default resp. Delete Nullify möglich (innere Struktur des Indexschlüssels kann zur Laufzeit nicht zuverlässig und schnell ermittelt werden) Kein Schreibzugriff über ODBC / OLEDB

Referentielle Integrität: Lösungsansatz Interbrain Elemente des Lösungsansatzes: Klasse dbc_RelationInfo (Session, definiert in DBCName.prg): CreateRelationList CreateRelationList GetChildren GetChildren GetParents GetParents Datenbank-Ereignisse (Stored Procedures): dbc_OpenData dbc_OpenData dbc_CloseData dbc_CloseData dbc_Activate dbc_Activate dbc_Deactivate dbc_Deactivate Trigger (Stored Procedures): dbc_DeleteTrigger dbc_DeleteTrigger dbc_InsertTrigger dbc_InsertTrigger dbc_UpdateTrigger dbc_UpdateTrigger

Referentielle Integrität: Probleme beim Schreiben von RI-Code Zusammengesetzte Indexschlüssel Error Handling Rekursive Aufrufe Triggercode ist stateless Reduzierter Sprachumfang des ODBC- Treibers / OLEDB-Providers Performance

Logging: Timestamps vs. Logging Timestamps: Platzsparend (acht Bytes pro Datensatz) Platzsparend (acht Bytes pro Datensatz) Keine vollwertiges Protokoll aller Änderungen Keine vollwertiges Protokoll aller Änderungen Unter Visual FoxPro nur unbefriedigend realisierbar (Replace im Triggercode führt zu unerlaubter Rekursion, in der Table Rule möglich, dort aber zur falschen Zeit) Unter Visual FoxPro nur unbefriedigend realisierbar (Replace im Triggercode führt zu unerlaubter Rekursion, in der Table Rule möglich, dort aber zur falschen Zeit) Einsatzmöglichkeiten beschränkt Einsatzmöglichkeiten beschränktLogging: Vollwertiges Protokoll aller Änderungen Vollwertiges Protokoll aller Änderungen Braucht extrem viel Platz Braucht extrem viel Platz Geeignet für Auditing, Rollback, Rollforward, Replikation Geeignet für Auditing, Rollback, Rollforward, Replikation Sehr hilfreich auch bei der Ursachenforschung bei fehlerhaften Daten und Kollisionen im Multiuser-Betrieb Sehr hilfreich auch bei der Ursachenforschung bei fehlerhaften Daten und Kollisionen im Multiuser-Betrieb

Logging: FoxAudit Umfassende Logging-, Auditing- sowie Rollback- und Rollforward-Funktionen für VFP 6, 7 und 8 TakeNote Technologies ( Autor: JimDuffy, Microsoft MVP Source Code wird mitgeliefert $ pro Entwickler Keine Runtime-Lizenzgebühren Demoversion verfügbar

Logging: FoxAudit

Logging: Lösungsansatz Interbrain Vollständig in die Datenbank integriert (protokolliert auch interaktive Änderungen) Extrem schnell, keine wahrnehmbare Performance-Einbusse Für sehr grosse Datenmengen geeignet (Memofeld Protokoll komprimiert, Logtabelle wird automatisch zur Laufzeit gewechselt) Kann auf einzelne Tabellen und bestimmte Triggertypen beschränkt werden

Logging: Lösungsansatz Interbrain Setup_log Logmodus N (1,0) ZuletztVergebeneLogfileId I Logtabellen Tabellenname C (128) LogInsert L LogUpdate L LogDelete L PRIMARY LOWER(Tabellenname) Logfiles LogfileId ZuletztVergebeneLogId I Log_XXXX LogId I (free table) Tabelle C (8) TA_Typ C (1) TA_Zeitpkt T Benutzer C (20) Station C (20) Protokoll MB

Logging: Lösungsansatz Interbrain Elemente des Lösungsansatzes: Klasse dbc_Log (Session, definiert in DBCName.prg): CreateLog CreateLog GetTableLogMode GetTableLogMode Protocol Protocol GetLogID GetLogID GetComputerName, GetUserName GetComputerName, GetUserName Compress Compress Datenbank-Ereignisse (Stored Procedures): dbc_OpenData dbc_OpenData dbc_CloseData dbc_CloseData dbc_Activate dbc_Activate dbc_Deactivate dbc_Deactivate Trigger (Stored Procedures): dbc_Log dbc_Log dbc_AddToProtocol dbc_AddToProtocol dbc_AnyToCharacter dbc_AnyToCharacterAPI-Funktionen: GetComputername (in KERNEL32.dll) GetComputername (in KERNEL32.dll) GetUserName (in ADVAPI32.dll) GetUserName (in ADVAPI32.dll) compress (in ZLIB.dll) compress (in ZLIB.dll)

Logging: Lösungsansatz Interbrain

Weiterführende Ideen: Log Viewer Zeigt den Inhalt einer Logtabelle in unverschlüsselter, dekomprimierter Form Selektion von Einträgen nach diversen Kriterien möglich Druck von Änderungsprotokollen (momentan noch nicht implementiert)

Weiterführende Ideen: Verwaltung der Relationen Ergänzt MODIFY STRUCTURE Zeigt alle Relationen einer Datenbank Sortierung nach Eltern- oder Kindtabellen Definition neuer Relationen (Kompatibilität der Indexschlüssel wird überprüft) Löschen bestehender Relationen Bearbeiten der RI-Regeln

Weiterführende Ideen: Datenbank auf Designfehler überprüfen Beantwortet Fragen wie beispielsweise: Gibt es Tabellen ohne Primärschlüssel? Gibt es Tabellen ohne DELETED-Tag? Sind alle DELETED-Tags BINARY? Gibt es Relationen die elternseitig nicht den Primärschlüssel verwenden? Ist bei zusammengesetztem Primärschlüssel der für die Rushmore-Optimierung notwendige FOREIGN_00- Indextag überall vorhanden? Gibt es Fremdschlüsselfelder für die keine Relation definiert ist? Gibt es rekursive Relationen (einfach oder komplex)?