![]() |
Datenbank: Interbase • Version: 6.0 • Zugriff über: Interbase Komponenten
Interbase Log-Files
Hallo Delphi Freunde,
habe mal wieder ein kleines Problem. :wall: Ich habe eine kleine Lagerverwaltung auf einer Interbase DB geschrieben. Funktioniert soweit auch ganz gut. Nun möchte ich das Prog gerne weiter geben. Das hat aber zur Folge, das ich eventuell "Support" leisten müsste. Von daher meine Frage: Gibt es eine Möglichkeit die Datenbankaktionen (Transaktionen, usw.) zu loggen? Über die IBConsole finde ich zwar ein Log, hier werden aber keine Transaktionen verzeichnet. Außerdem weiß ich nicht, wie ich dieses Log innerhalb des Progs auslesen kann. :gruebel: Bietet Delphi eventuell die Möglichkeit auch interne Logs (für das Prog selber) zu generieren? Ziel soll es sein, das ich im Prog selber ein Fehler melden kann. Dann wird eine Mail erzeugt. An der Mail soll dann automatisch das (die) Log(s) angehängt werden. Leider bin ich weder hier noch bei Google fündig geworden. Vielleicht ist aber so simpel, das keiner danach fragt? :oops: Ich hoffe, dass mir jemand helfen kann. Gruß Marcus |
Re: Interbase Log-Files
Du kannst einfach für jede Tabelle in deiner Datenbank ein Trigger anlegen, welcher dann die Aktion in eine spezielle Logtabelle wegschreibt. Auf diese kannst du dann wie auf jede andere Tabelle von deinem Programm zugreifen.
|
Re: Interbase Log-Files
Zitat:
Dann bekomme ich aber nur die Insert und Update Aktionen, oder? Außerdem hätte ich gerne die SQL-Statements, um auch eventuelle Programmfehler (Variablen im SQL-Statement) auszuschließen. |
Re: Interbase Log-Files
Zitat:
Zitat:
Du könntest hierzu deine Abfragen in SP verfrachten, in denen du den Logmechanismus implemntierst. |
Re: Interbase Log-Files
Zitat:
|
Re: Interbase Log-Files
Eine Stored Procedure
|
Re: Interbase Log-Files
jetzt bin ich irgendwie völlig vernagelt.
Ich sammle gerade meine ersten Erfahrungen mit Interbase. Davor habe ich mit einfachen Paradox Tables gearbeitet. :oops: In meiner DB sind schon einige Stored Procedures vorhanden. Meinst Du ich sollte für jede SELECT Abfrage eine eigene SP schreiben und die Variablen einfach mit übergeben? Und wie aktiviere ich den Logmechnismus? Wo werden die Daten hingeschrieben? Fragen über Fragen.... :? Andererseits überlege ich gerade die alle SQL-Staements(SELECT, UPDATE, INSERT und DELETE) vor dem abschicken zur DB in ein Text File zu schreiben. Ist das evenbtuell sinvoller? :?: |
Re: Interbase Log-Files
Zitat:
Zitat:
In der SP schreibst du dann den Logadtensatz und führts dann die eigentliche Abfrage auf die Tabelle(n) aus und gibst das Ergebnis zurück. Zitat:
|
Re: Interbase Log-Files
Zitat:
Ich werde das auf diesem Wege mal probieren. Vielen Dank für Deine schnelle Hilfe! :thumb: |
Re: Interbase Log-Files
Hallo,
es gibt unter IBAdmin die Komponente IBLogService. Diese wird auch im Demoprogramm IBAdmin benutzt. Schau dir das einmal an. Ich denke, dass könnte eine Lösung für dich sein. |
Re: Interbase Log-Files
Hallo MrSpock,
danke für den Hinweis. Hier bekomme ich aber nur den Zugriff auf die Server Log. Dort sind keinerlei Transactionen hinterlegt. Oder kann ich das Trace Level für diese Log erhöhen? Kleine Anfängerfrage am Rande. Wo finde ich die IBAdmin Demo? In den Delphi-Beispielen befinden sich nur IBDemo und IBMasterApp (diese leider ohne DB, läuft deswegen nicht). |
Re: Interbase Log-Files
Mkinzler meint folgendes : Du sollst erst mal die Trigger benutzen. Damit sind die Fälle Insert / Update / Delete bereits erledigt. Was fehlt, das sind die Selects. Allerdings ist jetzt die Frage, wo diese zusammengebaut werden. Und IMHO geht der Vorschlag von MKinzler mit SP an der Stelle etwas zu weit. Bzw. geht das meistens auch einfacher. Man stelle sich einmal folgendes vor : brauche Artikel-Liste von / bis Art.Nr. Sortierung nach Bez. usw. Jetzt gibt es dazu 2 Möglichkeiten : ich baue das Select im Programm zusammen. Das würde bei der Sortierung folgendes bedeuten :
Delphi-Quellcode:
Über SP ginge es eben so :
if ckbAlpha = checked then
DS.SelectSQL.Add ('ORDER BY BEZ') else DS.SelectSQL.Add ('ORDER BY NR');
Delphi-Quellcode:
In diesem Falle müßte ich noch in der SP die 0/1 auswerten usw. Man bedenke, daß das Bsp. dazu noch sehr einfach ist !
if ckbAlpha = checked then
ArtSP.ParamByName ('SORTIERUNG') := 1 else ArtSP.ParamByName ('SORTIERUNG') := 0; Habe ich nun folgende Konstruktion :
Delphi-Quellcode:
dann kann ich an allen Stellen etwas in ein Log schreiben. Egal was ! z.B.:
procedure SchreibeLog (st : string);
begin LogMod.LogSP.ParamByName('ID_STATION').AsInteger := ID_StationNr; LogMod.LogSP.ParamByName('ZEIT').AsDateTime := now; LogMod.LogSP.ParamByName('ST').AsString := st; if not CDStart then begin LogMod.LogSP.ExecProc; LogMod.LogTransaction.Commit; // zu oft ? LogMod.LogTransaction.StartTransaction; end; end;
Delphi-Quellcode:
Aber egal wie, fällt mir gerade ein, was ist mit Parametern ? :gruebel: "ORDER BY BEZ" würde ja in dem Log stehen, aber ":VONARTNR" auch und nicht der Wert. 8) Na ja, die selects sind mir ziemlich egal, ich will eigentlich nur wissen, wann wer an welchem Datensatz rumfummelt. :mrgreen:
SchreibeLog ('Programmstart '+DateTimeToStr (now));
... // ACHTUNG ! nur Pseudocode, string <> TStrings ! SchreibeLog (DS.SelectSQL.Text); // festhalten welche Sortierung per Dataset SchreibeLog (ArtSP.SQL.Text); // festhalten welche Sortierung per SP Und noch ein Trick : oben steht die Zeit der Aktion mit drin (bei Programmstart). Das kann man sich auch sparen. In das Log wird ja wohl nur inserted. Also genügt es, dem Insert Trigger zu sagen, daß er gleich noch die Zeit automatisch mitspeichert. Obige Prozedur ist fast unverzichtbar, bei dem Einkreisen schwierig zu findender Fehler. Ich kann ja auch reinschreiben "Menüpunkt x angewählt" oder "Menüpunkt x verlassen" In dem Log sehe ich dann ganz genau in zeitlicher Abfolge wo wann was dazwischen gemacht wurde. Welche Tabellen angesprochen wurden, welche Records betroffen waren usw. Wenn nun z.B. der Logeintrag "Menüpunkt x verlassen" nicht vorhanden ist, dann ist völlig klar, das ein schwerer Fehler passiert ist und wenns nur der gezogene Stecker war. :lol: Auf jeden Fall aber sehe ich noch die letzte Aktion davor. Deshalb auch das Commit innerhalb der Prozedur. |
Re: Interbase Log-Files
Zitat:
In diesem Fall kommt es auch auf die komplexität der Abfrage an: z.B. läßt sich
SQL-Code:
leicht in
Select * from Tabelle where id=:wert;
SQL-Code:
abwandeln. natürlich geht das nur bei einfachen Abfragen bzw. einem bis wenige Parameter.
select * from spTabelle (:wert);
|
Re: Interbase Log-Files
@Hansa:
Habe Deinen Ansatz umgesetzt. Hat im vollen Maße so funktioniert wie ich es mir vorgestellt hatte. Vielen Dank für die Hilfe :thumb: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:06 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz