dbc, ri-code und logging vortrag vom 26.05.05 bei der foxpro user group schweiz © marc voillat,...

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

Upload: lorenz-heidtman

Post on 05-Apr-2015

105 views

Category:

Documents


0 download

TRANSCRIPT

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

DBC, RI-CodeDBC, RI-Codeund Loggingund Logging

Vortrag vom 26.05.05 bei der Vortrag vom 26.05.05 bei der FoxPro User Group SchweizFoxPro User Group Schweiz

© Marc Voillat, Interbrain AG, 8048 Zürich© Marc Voillat, Interbrain AG, 8048 Zürich

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

ÜbersichtÜbersicht

Der „Der „DDataatabbase ase CContainer“ (DBC):ontainer“ (DBC): StrukturStruktur Einzelheiten zum Feld „Property“Einzelheiten zum Feld „Property“ Inhalt und ErweiterungsmöglichkeitenInhalt und Erweiterungsmöglichkeiten DatenbankereignisseDatenbankereignisse

RReferentielle eferentielle IIntegrität (RI):ntegrität (RI): Insert, Update, Delete Trigger und Stored ProceduresInsert, Update, Delete Trigger und Stored Procedures Code Templates in Visual FoxPro und xCaseCode Templates in Visual FoxPro und xCase Generische ImplementierungsansätzeGenerische Implementierungsansätze Einzelheiten zum Lösungsansatz von InterbrainEinzelheiten zum Lösungsansatz von Interbrain Spezifische Probleme beim Schreiben von RI-CodeSpezifische Probleme beim Schreiben von RI-Code

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

ÜbersichtÜbersicht

Logging / Auditing:Logging / Auditing: Timestamps vs. LoggingTimestamps vs. Logging FoxAuditFoxAudit Einzelheiten zum Lösungsansatz von InterbrainEinzelheiten zum Lösungsansatz von Interbrain

Weiterführende Ideen:Weiterführende Ideen: Log ViewerLog Viewer Verwaltung der RelationenVerwaltung der Relationen Datenbank auf Designfehler überprüfenDatenbank auf Designfehler überprüfen

Fragen und DiskussionFragen und Diskussion

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

DBC: StrukturDBC: Struktur

Hinweise zu einzelnen Feldern:Hinweise zu einzelnen Feldern:ParentId:ParentId:

BaumstrukturBaumstruktur Relationen sind von der Kind- Relationen sind von der Kind-

zur Elterntabelle definiertzur Elterntabelle definiertObjectType (mögliche Werte):ObjectType (mögliche Werte):

DatabaseDatabase TableTable FieldField IndexIndex RelationRelation ConnectionConnection ViewView

RIInfo (drei Grossbuchstaben in RIInfo (drei Grossbuchstaben in folgender Reihenfolge):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)

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

DBC: StrukturDBC: Struktur

Index Tags==========

Tag Name: OBJECTNAMETag Type: REGULARKey Expression: STR(PARENTID)+OBJECTTYPE+LOWER(OBJECTNAME)Filter Expression: .NOT.DELETED()Index Order: ASCENDINGCollate Sequence: MACHINE

Tag Name: OBJECTTYPETag Type: REGULARKey Expression: STR(PARENTID)+OBJECTTYPEFilter Expression: .NOT.DELETED()Index Order: ASCENDINGCollate Sequence: MACHINE

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

DBC: Feld „Property“DBC: Feld „Property“

Lesen und Schreiben zur Laufzeit im Normalfall Lesen und Schreiben zur Laufzeit im Normalfall mit DBGETPROP() und DBSETPROP(), in allen mit DBGETPROP() und DBSETPROP(), in allen anderen Fällen mit Tools wie Stonefield Data-anderen Fällen mit Tools wie Stonefield Data-base Toolkit (SDT) oder eigenen Programmenbase Toolkit (SDT) oder eigenen Programmen

Binärer InhaltBinärer Inhalt

Ein Datenblock pro Eigenschaft bestehend aus: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 EigenschaftInhalt der Eigenschaft

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

DBC: Feld „Property“DBC: Feld „Property“

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

DBC: Feld „Property“DBC: Feld „Property“

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

DBC: Feld „Property“DBC: Feld „Property“

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

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

DBC: Inhalt und DBC: Inhalt und ErweiterungsmöglichkeitenErweiterungsmöglichkeiten

Kein umfassendes Data Dictionnary, nur ein Kein umfassendes Data Dictionnary, nur ein Minimum an ergänzenden Angaben, die sich Minimum an ergänzenden Angaben, die sich ohne Anpassungen an den gegebenen xBase-ohne Anpassungen an den gegebenen xBase-Dateistrukturen nirgends unterbringen liessen!Dateistrukturen nirgends unterbringen liessen!Erweiterung möglich über:Erweiterung möglich über: Separate Paralleltabelle (Quasi-Standard DBCX, Separate Paralleltabelle (Quasi-Standard DBCX,

Tools dazu verfügbar, zum Beispiel SDT)Tools dazu verfügbar, zum Beispiel SDT) Feld USER (von Microsoft empfohlen, wegen Feld USER (von Microsoft empfohlen, wegen

fehlender Standards zur Formatierung des Inhalt fehlender Standards zur Formatierung des Inhalt allerdings kaum empfehlenswert)allerdings kaum empfehlenswert)

Eigene, neue Felder (xCase, Aufwärtskompatibilität?)Eigene, neue Felder (xCase, Aufwärtskompatibilität?) Eventuell eigene Property-Codes (z.B. Eventuell eigene Property-Codes (z.B. ≥ 128)??≥ 128)??

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

DBC: DatenbankereignisseDBC: Datenbankereignisse

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

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

DBC: DatenbankereignisseDBC: Datenbankereignisse

DBC_ActivateDBC_ActivateDBC_DeactivateDBC_DeactivateDBC_BeforeAddRelationDBC_BeforeAddRelationDBC_AfterAddRelationDBC_AfterAddRelationDBC_BeforeAddTableDBC_BeforeAddTableDBC_AfterAddTableDBC_AfterAddTableDBC_BeforeAppendProcDBC_BeforeAppendProcDBC_AfterAppendProcDBC_AfterAppendProcDBC_BeforeCloseTableDBC_BeforeCloseTableDBC_AfterCloseTableDBC_AfterCloseTableDBC_BeforeCopyProcDBC_BeforeCopyProcDBC_AfterCopyProcDBC_AfterCopyProcDBC_BeforeCreateConnectionDBC_BeforeCreateConnectionDBC_AfterCreateConnectionDBC_AfterCreateConnectionDBC_BeforeCreateOfflineDBC_BeforeCreateOfflineDBC_AfterCreateOfflineDBC_AfterCreateOfflineDBC_BeforeCreateTableDBC_BeforeCreateTableDBC_AfterCreateTableDBC_AfterCreateTableDBC_BeforeCreateViewDBC_BeforeCreateViewDBC_AfterCreateViewDBC_AfterCreateView

DBC_BeforeDBGetPropDBC_BeforeDBGetPropDBC_AfterDBGetPropDBC_AfterDBGetPropDBC_BeforeDBSetPropDBC_BeforeDBSetPropDBC_AfterDBSetPropDBC_AfterDBSetPropDBC_BeforeDeleteConnectionDBC_BeforeDeleteConnectionDBC_AfterDeleteConnectionDBC_AfterDeleteConnectionDBC_BeforeDropOfflineDBC_BeforeDropOfflineDBC_AfterDropOfflineDBC_AfterDropOfflineDBC_BeforeDropRelationDBC_BeforeDropRelationDBC_AfterDropRelationDBC_AfterDropRelationDBC_BeforeDropTableDBC_BeforeDropTableDBC_AfterDropTableDBC_AfterDropTableDBC_BeforeDropViewDBC_BeforeDropViewDBC_AfterDropViewDBC_AfterDropViewDBC_BeforeModifyConnectionDBC_BeforeModifyConnectionDBC_AfterModifyConnectionDBC_AfterModifyConnectionDBC_BeforeModifyProcDBC_BeforeModifyProcDBC_AfterModifyProcDBC_AfterModifyProcDBC_BeforeModifyTableDBC_BeforeModifyTableDBC_AfterModifyTableDBC_AfterModifyTable

DBC_BeforeModifyViewDBC_BeforeModifyViewDBC_AfterModifyViewDBC_AfterModifyViewDBC_BeforeOpenTableDBC_BeforeOpenTableDBC_AfterOpenTableDBC_AfterOpenTableDBC_BeforeRemoveTableDBC_BeforeRemoveTableDBC_AfterRemoveTableDBC_AfterRemoveTableDBC_BeforeRenameConnectionDBC_BeforeRenameConnectionDBC_AfterRenameConnectionDBC_AfterRenameConnectionDBC_BeforeRenameTableDBC_BeforeRenameTableDBC_AfterRenameTableDBC_AfterRenameTableDBC_BeforeRenameViewDBC_BeforeRenameViewDBC_AfterRenameViewDBC_AfterRenameViewDBC_BeforeValidateDataDBC_BeforeValidateDataDBC_AfterValidateDataDBC_AfterValidateDataDBC_ModifyDataDBC_ModifyDataDBC_OpenDataDBC_OpenDataDBC_CloseDataDBC_CloseDataDBC_PackDataDBC_PackData

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

DBC: DatenbankereignisseDBC: Datenbankereignisse

Was man damit machen kann:Was man damit machen kann:

Zugriff auf Datenbank oder einzelne Zugriff auf Datenbank oder einzelne Tabellen einschränken, beispielsweise Tabellen einschränken, beispielsweise Zugriff per ODBC / OLEDB abklemmen Zugriff per ODBC / OLEDB abklemmen oder auf Leseoperationen beschränkenoder auf Leseoperationen beschränken

Eigene Erweiterungen beim Öffnen der Eigene Erweiterungen beim Öffnen der Datenbank laden und bei Struktur-Datenbank laden und bei Struktur-änderungen synchron nachführenänderungen synchron nachführen

...?...?

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

Referentielle Integrität:Referentielle Integrität:Triggers und Stored ProceduresTriggers und Stored Procedures

Korrektheit und Konsistenz der Beziehungen zwischen Korrektheit und Konsistenz der Beziehungen zwischen TabellenTabellen

Verhindert Einfüge-, Änderungs- und LöschanomalienVerhindert Einfüge-, Änderungs- und Löschanomalien

In Visual FoxPro implementiert als Insert-, Update- und In Visual FoxPro implementiert als Insert-, Update- und Delete-TriggerDelete-Trigger

In Visual FoxPro mögliche RI-Regeln (erweiterbar):In Visual FoxPro mögliche RI-Regeln (erweiterbar): Insert: Ignore, RestrictInsert: Ignore, Restrict Update: Cascade, Ignore, RestrictUpdate: Cascade, Ignore, Restrict Delete: Cascade, Ignore, Restrict (mit xCase auch: Default, Delete: Cascade, Ignore, Restrict (mit xCase auch: Default,

Nullify)Nullify)

Triggercode als Stored Procedures (Programmcode in Triggercode als Stored Procedures (Programmcode in der Datenbank)der Datenbank)

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

Referentielle Integrität:Referentielle Integrität:Triggers und Stored ProceduresTriggers und Stored Procedures

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

Referentielle Integrität:Referentielle Integrität:Triggers und Stored ProceduresTriggers und Stored Procedures

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

Referentielle Integrität:Referentielle Integrität:Code Templates in VFP und xCaseCode Templates in VFP und xCase

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

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

Referentielle Integrität:Referentielle Integrität:Code Templates in VFP und xCaseCode 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

...

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

Referentielle Integrität:Referentielle Integrität:Code Templates in VFP und xCaseCode 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]]"

...

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

Referentielle Integrität:Referentielle Integrität:Generische ImplementierungsansätzeGenerische Implementierungsansätze

Idee: eine einzige, generische Triggerprozedur Idee: eine einzige, generische Triggerprozedur für alle Trigger und Tabellen einer Datenbankfür alle Trigger und Tabellen einer DatenbankJim Booth & Steve Sawyer, Effective Jim Booth & Steve Sawyer, Effective Techniques for Application Development with Techniques for Application Development with Visual FoxPro 6.0, Hentzenwerke Publishing, Visual FoxPro 6.0, Hentzenwerke Publishing, 1998, S. 75 – 891998, S. 75 – 89Mängel dieses Vorschlags:Mängel dieses Vorschlags: Triggertyp wird teilweise falsch ermitteltTriggertyp wird teilweise falsch ermittelt Funktioniert nicht mit zusammengesetzten Funktioniert nicht mit zusammengesetzten

Indexschlüsseln, Erweiterung ist nicht trivialIndexschlüsseln, Erweiterung ist nicht trivial Relationsangaben und RI-Infos müssen als Array Relationsangaben und RI-Infos müssen als Array

vorliegenvorliegen

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

Referentielle Integrität:Referentielle Integrität:Lösungsansatz InterbrainLösungsansatz Interbrain

Eine Stored Procedure pro TriggertypEine Stored Procedure pro Triggertyp

Relationsangaben und RI-Infos werden zur Relationsangaben und RI-Infos werden zur Laufzeit aus der Datenbank ermitteltLaufzeit aus der Datenbank ermittelt

Funktioniert problemlos auch mit Funktioniert problemlos auch mit zusammengesetzten Indexschlüsselnzusammengesetzten Indexschlüsseln

Kein „Cascading Update“ und kein „Delete Kein „Cascading Update“ und kein „Delete Default“ resp. „Delete Nullify“ möglich (innere Default“ resp. „Delete Nullify“ möglich (innere Struktur des Indexschlüssels kann zur Laufzeit Struktur des Indexschlüssels kann zur Laufzeit nicht zuverlässig und schnell ermittelt werden)nicht zuverlässig und schnell ermittelt werden)

Kein Schreibzugriff über ODBC / OLEDBKein Schreibzugriff über ODBC / OLEDB

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

Referentielle Integrität:Referentielle Integrität:Lösungsansatz InterbrainLösungsansatz Interbrain

Elemente des Lösungsansatzes:Elemente des Lösungsansatzes:Klasse dbc_RelationInfo („Session“, definiert in DBCName.prg):Klasse dbc_RelationInfo („Session“, definiert in DBCName.prg):

CreateRelationListCreateRelationList GetChildrenGetChildren GetParentsGetParents

Datenbank-Ereignisse (Stored Procedures):Datenbank-Ereignisse (Stored Procedures): dbc_OpenDatadbc_OpenData dbc_CloseDatadbc_CloseData dbc_Activatedbc_Activate dbc_Deactivatedbc_Deactivate

Trigger (Stored Procedures):Trigger (Stored Procedures): dbc_DeleteTriggerdbc_DeleteTrigger dbc_InsertTriggerdbc_InsertTrigger dbc_UpdateTriggerdbc_UpdateTrigger

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

Referentielle Integrität:Referentielle Integrität:Probleme beim Schreiben von RI-CodeProbleme beim Schreiben von RI-Code

Zusammengesetzte IndexschlüsselZusammengesetzte Indexschlüssel

Error HandlingError Handling

Rekursive AufrufeRekursive Aufrufe

Triggercode ist „stateless“Triggercode ist „stateless“

Reduzierter Sprachumfang des ODBC-Reduzierter Sprachumfang des ODBC-Treibers / OLEDB-ProvidersTreibers / OLEDB-Providers

PerformancePerformance

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

Logging: Timestamps vs. LoggingLogging: Timestamps vs. Logging

Timestamps:Timestamps: Platzsparend (acht Bytes pro Datensatz)Platzsparend (acht Bytes pro Datensatz) Keine vollwertiges Protokoll aller ÄnderungenKeine vollwertiges Protokoll aller Änderungen Unter Visual FoxPro nur unbefriedigend realisierbar (Replace im Unter Visual FoxPro nur unbefriedigend realisierbar (Replace im

Triggercode führt zu unerlaubter Rekursion, in der Table Rule Triggercode führt zu unerlaubter Rekursion, in der Table Rule möglich, dort aber zur falschen Zeit)möglich, dort aber zur falschen Zeit)

Einsatzmöglichkeiten beschränktEinsatzmöglichkeiten beschränkt

Logging:Logging: Vollwertiges Protokoll aller ÄnderungenVollwertiges Protokoll aller Änderungen Braucht extrem viel PlatzBraucht extrem viel Platz Geeignet für Auditing, Rollback, Rollforward, ReplikationGeeignet für Auditing, Rollback, Rollforward, Replikation Sehr hilfreich auch bei der Ursachenforschung bei fehlerhaften Sehr hilfreich auch bei der Ursachenforschung bei fehlerhaften

Daten und Kollisionen im Multiuser-BetriebDaten und Kollisionen im Multiuser-Betrieb

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

Logging: FoxAuditLogging: FoxAudit

Umfassende Logging-, Auditing- sowie Rollback- Umfassende Logging-, Auditing- sowie Rollback- und Rollforward-Funktionen für VFP 6, 7 und 8und Rollforward-Funktionen für VFP 6, 7 und 8

TakeNote Technologies (TakeNote Technologies (www.takenote.comwww.takenote.com))

Autor: JimDuffy, Microsoft MVPAutor: JimDuffy, Microsoft MVP

Source Code wird mitgeliefertSource Code wird mitgeliefert

$ 259.00 pro Entwickler$ 259.00 pro Entwickler

Keine Runtime-LizenzgebührenKeine Runtime-Lizenzgebühren

Demoversion verfügbarDemoversion verfügbar

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

Logging: FoxAuditLogging: FoxAudit

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

Logging: Lösungsansatz InterbrainLogging: Lösungsansatz Interbrain

Vollständig in die Datenbank integriert Vollständig in die Datenbank integriert (protokolliert auch interaktive Änderungen)(protokolliert auch interaktive Änderungen)

Extrem schnell, keine wahrnehmbare Extrem schnell, keine wahrnehmbare Performance-EinbussePerformance-Einbusse

Für sehr grosse Datenmengen geeignet Für sehr grosse Datenmengen geeignet (Memofeld „Protokoll“ komprimiert, Logtabelle (Memofeld „Protokoll“ komprimiert, Logtabelle wird automatisch zur Laufzeit gewechselt)wird automatisch zur Laufzeit gewechselt)

Kann auf einzelne Tabellen und bestimmte Kann auf einzelne Tabellen und bestimmte Triggertypen beschränkt werdenTriggertypen beschränkt werden

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

Logging: Lösungsansatz InterbrainLogging: 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

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

Logging: Lösungsansatz InterbrainLogging: Lösungsansatz Interbrain

Elemente des Lösungsansatzes:Elemente des Lösungsansatzes:Klasse dbc_Log („Session“, definiert in DBCName.prg):Klasse dbc_Log („Session“, definiert in DBCName.prg):

CreateLogCreateLog GetTableLogModeGetTableLogMode ProtocolProtocol GetLogIDGetLogID GetComputerName, GetUserNameGetComputerName, GetUserName CompressCompress

Datenbank-Ereignisse (Stored Procedures):Datenbank-Ereignisse (Stored Procedures): dbc_OpenDatadbc_OpenData dbc_CloseDatadbc_CloseData dbc_Activatedbc_Activate dbc_Deactivatedbc_Deactivate

Trigger (Stored Procedures):Trigger (Stored Procedures): dbc_Logdbc_Log dbc_AddToProtocoldbc_AddToProtocol dbc_AnyToCharacterdbc_AnyToCharacter

API-Funktionen:API-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)

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

Logging: Lösungsansatz InterbrainLogging: Lösungsansatz Interbrain

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

Weiterführende Ideen:Weiterführende Ideen:Log ViewerLog Viewer

Zeigt den Inhalt einer Logtabelle in Zeigt den Inhalt einer Logtabelle in unverschlüsselter, dekomprimierter Formunverschlüsselter, dekomprimierter Form

Selektion von Einträgen nach diversen Selektion von Einträgen nach diversen Kriterien möglichKriterien möglich

Druck von Änderungsprotokollen Druck von Änderungsprotokollen (momentan noch nicht implementiert)(momentan noch nicht implementiert)

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

Weiterführende Ideen:Weiterführende Ideen:Verwaltung der RelationenVerwaltung der Relationen

Ergänzt MODIFY STRUCTUREErgänzt MODIFY STRUCTURE

Zeigt alle Relationen einer DatenbankZeigt alle Relationen einer Datenbank

Sortierung nach Eltern- oder KindtabellenSortierung nach Eltern- oder Kindtabellen

Definition neuer Relationen (Kompatibilität Definition neuer Relationen (Kompatibilität der Indexschlüssel wird überprüft)der Indexschlüssel wird überprüft)

Löschen bestehender RelationenLöschen bestehender Relationen

Bearbeiten der RI-RegelnBearbeiten der RI-Regeln

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

Weiterführende Ideen:Weiterführende Ideen:Datenbank auf Designfehler überprüfenDatenbank auf Designfehler überprüfen

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