Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

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

Ähnliche Präsentationen


Präsentation zum Thema: "DBC, RI-Code und Logging Vortrag vom 26.05.05 bei der FoxPro User Group Schweiz © Marc Voillat, Interbrain AG, 8048 Zürich."—  Präsentation transkript:

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

2 Ü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

3 Ü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

4 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)

5 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

6 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

7 DBC: Feld Property

8

9 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

10 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)??

11 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

12 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

13 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...?

14 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)

15 Referentielle Integrität: Triggers und Stored Procedures

16

17 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)

18 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...

19 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]]"...

20 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

21 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

22 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

23 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

24 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

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

26 Logging: FoxAudit

27 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

28 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

29 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)

30 Logging: Lösungsansatz Interbrain

31 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)

32 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

33 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)?


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

Ähnliche Präsentationen


Google-Anzeigen