Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi db änderungen protokollieren. aus delphi heraus. (IB) (https://www.delphipraxis.net/70688-db-aenderungen-protokollieren-aus-delphi-heraus-ib.html)

mojo777 2. Jun 2006 19:55

Datenbank: interbase • Version: 6 • Zugriff über: sql

db änderungen protokollieren. aus delphi heraus. (IB)
 
Hallo,

ich hab mich heute daran gesetzt ein db-protokoll zu schreiben. und leider ist es mir aufgefallen, dass das gar nicht so einfach ist. also die insert und update stellen, die direkt in die sql.text bereiche der TIBQuery reingeschrieben wurden können auch problemlos abgefangen werden.
aber mit den Datasets habe ich so meine probleme. sprich mit allem wo parameter an die query übergeben werden.
wie geht das? habe mit schon überlegt sqlMonitor zu benutzen aber blicke die bedienung nicht.

würde mich sehr freuen, wenn mir da jemand einen tipp geben könnte.


vg

ps:falls jemand fragen sollte warum ich diese aufgabe nicht auf eine udf etc verlagere..
der grund ist, dass ich benutzer in tabellen angelegt habe. und alle loggen sich mit dem selben benutzernamen in IB ein. es wäre also plausibler diese aufgabe unter delphi zu realisieren. (IMHO) :-)

mkinzler 2. Jun 2006 22:34

Re: db änderungen protokollieren. aus delphi heraus. (IB)
 
Zitat:

habe mit schon überlegt sqlMonitor zu benutzen aber blicke die bedienung nicht.
Gute Überlegung. Ein Beispiel dafür findest du in den Demos von Delphi.
Hast du dir schon mal überlegt, clientseitig verschiedene Benutzer su verwenden? Dann könntest du u.U. das Problem per Trigger lösen oder auf FB2 upgraden, dann kannst du das anstatt benutzerbezogen, Clientbezogen machen.

BTW. Was willst du damit bezwecken?

mojo777 3. Jun 2006 03:26

Re: db änderungen protokollieren. aus delphi heraus. (IB)
 
hi. nun das war das "ps"...
ist habe mittlerweile eine lösung gefunden, aber sie klappt nur "zum sehen". also ich könnte mit den parametern die db nicht evtl per sql_spript wiederherstellen.
mfg

mojo777 3. Jun 2006 13:36

Re: db änderungen protokollieren. aus delphi heraus. (IB)
 
hallo. wie extrahiere ich denn die metadata?
ich weiss zwar, dass das mit IBExtract geht aber irgendwie finde ich keine einleuchtende methode um die prozedur auszuführen.


vg

mojo777 3. Jun 2006 14:08

Re: db änderungen protokollieren. aus delphi heraus. (IB)
 
oder gibt es in IB einen befehl, der mit im trigger z.b. den gerade ausgeführten sql code anzeigen kann?

mkinzler 3. Jun 2006 20:47

Re: db änderungen protokollieren. aus delphi heraus. (IB)
 
Zitat:

oder gibt es in IB einen befehl, der mit im trigger z.b. den gerade ausgeführten sql code anzeigen kann?
Nein, aber du kannst die Änderungen an den Daten protokollieren. Hilft dir natürlich nur, wenn du erkenne willst was geändert wurde. Willst du aber protokollieren, we was abgefragt hat, wird es schwerer, dann mußt du das über SPs lösen.

mojo777 4. Jun 2006 01:24

Re: db änderungen protokollieren. aus delphi heraus. (IB)
 
hi mkinzler.
ja. ich will nur die änderungen protokollieren.

ich habe zwar bereits eine (halb)lösung gefunden aber sag mir bitte was du meinst.

hier meine lösung:
in delphi den IBSQLMonitor benutzen und dann bei event auf die Prozedur WriteUserLosg(text) weisen.
Die prozedur sieht dann so aus:
Delphi-Quellcode:
procedure TfmMain.writeUserLOG(msg:String);
var s , datei: String;
      tf,f : TextFile;
      pos:Integer;
      erg:String;
begin

  if ((StrPos(PChar(UpperCase(msg)), PChar('INSERT'))<>nil) or (StrPos(PChar(UpperCase(msg)), PChar('UPDATE'))<>nil)) then
    begin
    AssignFile(tf, 'user_log.txt');
    Append(tf);
    msg:=StringReplace(msg, '[Execute]', '[Execute] */'+#13, [rfReplaceAll]);
    end else exit;
  Write(tf, '/*: '+DateToStr(date())+' '+FormatDateTime('hh:mm:ss', Now)+' '+
            trim(AktUser.name)+' '+trim(AktUser.vorname)+' UserID:'+
            IntToStr(AktUser.userid)+':'+#13#10+msg+';'+#13+#13);
  CloseFile(tf);
end;
das klappt soweit ganz gut solange ich keine parameter benutze.
bei benutzung von parametern sehe ich zwar die zustandsänderungen aber ich kann diese dann nicht mehr in einen skrip kopieren und dann einfach ausführen lassen. (würde ich gerne als eine weitere schutzmaßname vor dem worstCase).

so sieht der output der procedur aus:
Zitat:

/*: 04.06.2006 01:31:13 Name Vorname UserID:1:

[Application: zzzzz]
sql_exec: [Execute] */
INSERT INTO RECHNUNGEN (R_DATUM, VP, ZAHLART, KND_ID) VALUES('04.06.2006', '1', 'Bar-Zahlung', NULL)
;
und mit parametern:
Zitat:

/*: 03.06.2006 18:56:54 Name Vorname UserID:1:

[Application: zzzzz]
dts_kunden: [Execute] */
UPDATE KUNDEN
SET KND_NAME=:KND_NAME,
KND_VORNAME=:KND_VORNAME,
KND_STRASSE=:KND_STRASSE,
KND_PLZ=:KND_PLZ,
KND_ORT=:KND_ORT,
KND_TEL=:KND_TEL,
KND_FAX=:KND_FAX,
KND_MOBIL=:KND_MOBIL,
KND_SUPER=:KND_SUPER,
KND_GEW_VON=:KND_GEW_VON,
KND_KOMMENTAR=:KND_KOMMENTAR
WHERE KND_ID=:KND_ID

KND_NAME = 234234
KND_VORNAME = 234234
KND_STRASSE = 234
KND_PLZ = 342
KND_ORT = 423
KND_TEL = 23
KND_FAX = 23
KND_MOBIL = 23
KND_SUPER = 1
KND_GEW_VON = 1
KND_KOMMENTAR = <BLOB>
KND_ID = 1;

mfg

Hansa 4. Jun 2006 03:10

Re: db änderungen protokollieren. aus delphi heraus. (IB)
 
Zitat:

Zitat von mojo777
oder gibt es in IB einen befehl, der mit im trigger z.b. den gerade ausgeführten sql code anzeigen kann?

Wieso brauchst Du den kompletten SQL-Befehl ? :shock: Änderungen betreffen üblicherweise Tabellen und Felder. Was spricht also dagegen, dafür Trigger zu benutzen bzw. vorhandene zu erweitern ? Die sind nicht nur dazu da, IDs hochzuzählen ! SQLMonitor mit Textdatei hält doch eher nur auf. Z.B.: "welcher Datensatz mit Nr. 100 wurde am 1.6.2006 wann geändert ?" Erzähle mir mal einer wie das mit einer Textdatei und vertretbarem Audfwand gehen soll. 8) 1 Min. in IBExpert.

mojo777 4. Jun 2006 09:29

Re: db änderungen protokollieren. aus delphi heraus. (IB)
 
hi hansa.
es muss in meinem falle eine txt datei am ende herauskommen. ob mit triggern oder ohne.
mit triggern habe ich das auch schon versucht. das ist kein geringerer aufwand.
ich wollte das mit einer udf lösen. die udf hat dann letzendlich gut fuinktioniert, aber die fehlerbehandlung mit den triggern hat sich als zu kompliziert herausgestellt.
dabei kann man nicht einfach
Delphi-Quellcode:
TEMTPVAR=UDFNAME('UPDATE TABLENAME SET FELD1='||NEW.FELD1||', ...
denn die updates belaufe sich meistens nur ein einige wenige felder und es kommt zum fehler wenn es kein NEW.FELDn gibt.
und was mache ich mit blobs?? :oops:

soviel dazu.

oder habe ich da was mißverstanden?

gruß

mojo777 4. Jun 2006 10:00

Re: db änderungen protokollieren. aus delphi heraus. (IB)
 
hmm. überleg. vll. lag es daran, dass ich vergessen habe zu casten :pale:

:angel2:


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:35 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz