Automatisierte Protokollierung

Hallo erstmal zusammen.

Folgendes Problem ich habe eine DB erstellt und suche jetzt eine möglichst einfache Möglichkeit in einer Tabelle Änderungen an anderen Tabellen zu speichern.

Diese Protokoll Tabelle soll eine Spalte “Wert alt”(Text) und eine Spalte “Wert neu”(Text) haben in der soll in verständlicher Form (für User verständlich) die Werte vor und nach der Änderung aufgeführt werden und natürlich eine Spalte mit dem Zeitstempel der Änderung.

Was ich haben will ist hoffentlich klar ich bin ein Anfänger denke aber mit Select, Insert, Update, Delete und dem Aufbau einer DB komme ich klar nur eben mit so einer Automatisierung (Trigger+Function???) fehlt mir einfach noch jeder Ansatz.

Wenn jemand nen einfaches Beispiel, dass ich auf meine Bedürfnisse anpassen kann sowas würde mir für den Anfang schon helfen.

mfg
Harald

klassischer Fall für ads sein tablelog, würd ich mal sagen…

16:17 < akretschmer> ??tablelog
16:17 < rtfm_please> For information about tablelog
16:17 < rtfm_please> see http://ads.wars-nicht.de/blog/archives/100-Log-Table-Changes-in-PostgreSQL-with-tablelog.html
16:17 < rtfm_please> or http://pgfoundry.org/projects/tablelog/

ads schlägt bestimmt auch gleich hier ein…


Andreas

Spätestens nachdem ich den Highlight im IRC gesehen und mich gefragt habe, wofür du das brauchst :wink:

Ja, tablelog dürfte die gestellten Anforderungen erfüllen.
Einfach Bescheid sagen, falls es noch irgendwo Probleme, Wünsche oder Anregungen gibt.

Danke Andreas und danke ads aber des ist speziell für ProstreSQL oder habe ich das beim ersten blick falsch verstanden.

Vielleicht sollte ich weiter ausholen bei meinem Problem also um die DB is ne Java Anwendung geschrieben wurden die per Hibernate auf die DB zugreift also will ich mir nicht verbauen das ich auch Oracle oder MySQL oder MS-SQL benutzen kann.

Auf dem JBoss habe ich jetzt schon den Login gebastelt der den User und seine Berechtigungen abprüft da habe ich auch das Protokollieren gemacht. Also welcher User wann was geändert hat. Geht hauptsächlich um nen Log für ne Maschinensteuerung und nen paar Programmfunktionen.

Jetzt das eigentliche Problem da des in einer anderen Session läuft protokolliert des Log auch Sachen die nie so stattgefunden haben da kein Commit von der Client-Anwendung kam.

Meine Idee sieht irgendwie so aus nachdem was geschrieben wurde in einer Daten-Tabelle ne Funktion aufrufen die das Protokollieren übernimmt. Und genau des wollte ich die DB machen lassen.

Im der Log soll verständlich sein so was wie:
Benutzer “XY” hat an Maschine “Z” das Ventil “B001” geöffnet.
Begründung: Das Wasser war verunreinigt.

OK das sind jetzt Daten aus 3 Tabellen aber so jetzt klarer was ich will??? TRIGGER als Auslöser oder oder wie auch immer und dann ne Funktion der ich “Wert alt” und “wert neu” übergeben kann.
Habe so was aber noch net gemacht also brauch ich ein Beispiel wie des geht und am besten nichts was ich in einer anderen DB nicht auch machen kann.

Wenn das ganze was ich gedacht hab müll ist dann mache ich es noch im Client aber ich will den so dumm wie möglich halten.

Also wenn du das Plattformübergreifend haben möchtest, wirst du wohl um “client-seitig” nicht herumkommen.

tablelog funktioniert im Server und ist unabhängig vom Client. Der Vorteil ist, das du dich um nichts kümmern musst. Der Nachteil ist, das es wirklich nur unter PG funktioniert, das stimmt. Ein weiterer Vorteil: wenn aus irgendeinem Grund die aktuelle Transaktion zurückgerollt wird, wird auch das Log zurückgerollt und nicht geschrieben: es gibt also nur Logeinträge, wenn auch wirklich etwas geschrieben wurde.

Wenn du getrennte Sessions zum Protokollieren und zum Arbeiten verwendest, habe ich ehrlich gesagt keine Ahnung, wie du das sauber trennen kannst. Aber diese Vorgehensweise hört sich umständlich für mich an …

Schade eigentlich der nächste Kunde will zu sein Oracle net noch nen PG-DB an die Seite stellen also muss doch ne andere Lösung her.

Und ja es ist umständlich und hat mich viel nerven gekostet.
Gegenprüfen und und dann das log löschen wenn die Daten weg sind war die zweite Idee die ist vielleicht leichter umzusetzen.

Vielleicht sollte ich das Konzept der Protokollierung noch mal prüfen und überarbeiten.

Vielleicht alles auf den Server packen???

Mal schauen auf alle fälle soll die nächste Prog. Vers. schneller werden und da dachte ich halt der DB-Server sollte auch nen Teil machen.

Zurück am Reißbrett und neuen Plan machen.

Harald

Noch ne Frage: Kann ich in einen “View” inserts machen ??? wenn ja wie???

Die Frage zu den Views zuerst:
Nein, (noch) nicht. Unter bestimmten Umständen kann man mittels Rules den View so umschreiben, das die Daten verteilt werden. Aber sonst geht das nicht. Die Technologie dafür ist seit einer Weile in der Entwicklung, aber hat es nicht in die demnächst kommende Version 8.3 geschafft :frowning:

Zur Protokollierung: ich frage mich, welche Vorstellungen du hier hast :wink:
Wenn du eine Datenbankseitige Lösung suchst, musst du davon ausgehen, die jeweilige Datenbank an die Bedürfnisse anzupassen. Gut, für PG gibt es jetzt eine fertige Lösung, aber Oracle hat auch gute Scriptingfähigkeiten. Zu Mysql sag ich wenig, da würdest du in diverse Probleme laufen (verschiedene Tabellen, nur ein Trigger pro Tabelle, keine gescheiten Scriptingfähigkeiten, …).
Wenn du also diese Probleme vermeiden willst, bleibt eigentlich nur noch eine clientseitige Lösung.

Ach so, wenn du die Protokollierung innerhalb einer Transaktion zusammen mit der eigentlichen Aktion durchführst, wird entweder alles oder gar nichts geschrieben … wäre eigentlich genau das, was du suchst.

OK aber wenn ich mehr View einbaue dann sollten sich einige Datenmengen schneller anzeigen also werde ich in die Anwendung so mehr speed rein bekommen. Schön zu wissen das an so was gearbeitet wird (View+Insert).

zum Thema DB: Also jemanden zu überzeugen der MySQL einsetzt auch noch ne PG-System zu nehmen denke ich is net das Problem.
Aber jemanden mit Oracle oder nen anderen großen und teuren System zu überzeugen das unsere Anwendung noch nen anderes System braucht so was will doch keiner. Und wenn man es schafft kann man auch am Nordpol Kühlschränke verkaufen. :smiley:

Auf alle fälle muss ich was ändern zu viel Code, zu umständlich und zu langsam.

Melde mich wieder wenn ich ne Frage hab.

Du hast mich falsch verstanden.

Ich möchte nicht, das du jemanden überzeugst, noch ein anderes Datenbanksystem da hinzustellen.

Aber wenn du möchtest, das die Funktionalität deiner Applikation in allen unterstützten Datenbanken funktioniert, kommst du nicht umhin, entweder

  • alle weitergehende Funktionalität für jede Datenbank einzeln zu entwickeln (Loggingfunktionalität serverseitig musst du dann halt mehrmals entwickeln) oder
  • die Funktionalität in deine Anwendung auszulagern.

Ach, und:

Also jemanden zu überzeugen der MySQL einsetzt auch noch ne PG-System zu nehmen denke ich is net das Problem.

Stell dir das nicht so einfach vor :frowning:

Gut oder Hibernate besser ausnutzen glaub ich da sollte auch noch so einiges mit HQL gehen.

@DB:
Aber wenn ich mich an SQL-Standard halte sollten doch solche Sachen leicht übernommen werden können oder liege ich da jetzt voll daneben???

Stell dir das nicht so einfach vor :frowning:

Jo Kunden sind mal umgänglich und mal voll eigenartig drauf zum glück muss ich mich um sowas nicht kümmern und die Spezifikation machen auch andere.

Solange du nicht für Mysql entwickelst, lautet die Antwort: “du liegst nicht voll daneben”.

Die Standards werden aus dem geschrieben, was sich am Markt etabliert hat. Das bedeutet aber auch, das gewisse Details von einer Datenbank auch schon mal leicht anders umgesetzt werden. Generell kommt man mit dem Standad recht weit, aber Sonderwege sind hier oder da von nöten. Testen ist angesagt :smiley: :smiley:

Solange du nicht für Mysql entwickelst, lautet die Antwort: “du liegst nicht voll daneben”.

Ist also das Schwarze Schaf der Familie und kocht sein eigene Süppchen was?
Ist egal die die Richtung wollte ich auch nicht.

Ist der Standard irgendwo beschrieben? und kann man zb. nachlesen wo PG abweicht? Weil bisher habe ich nur mit PG gearbeitet bzw. vorher mit Interbase und Delphi.

PG und Oracle ist erstmal das Ziel was unterstützt werden soll und des ist hoffentlich nicht so weit auseinander?

Kannst du mir noch nen Tipp geben wo ich Bespiele für Store Proc, Trigger, Events, Function finden kann.
Sind die einfach nach Oracle zu portieren???

Naja. ORA, PG und so sind halt Datenbanken. MySQL ein filebasierter Zettelkasten mit Netzwerkinterface.

Ist der Standard irgendwo beschrieben? und kann man zb. nachlesen wo PG abweicht? Weil bisher habe ich nur mit PG gearbeitet bzw. vorher mit Interbase und Delphi.


13:47 < akretschmer> ??standard
13:47 < rtfm_please> For information about standard
13:47 < rtfm_please> see http://savage.net.au/SQL/
13:47 < rtfm_please> or http://troels.arvin.dk/db/rdbms/
13:47 < rtfm_please> or http://wiscorp.com/SQLStandards.html

.oO( schon was nettes, der doc-bot )

In der Doku zu PG steht auch, wenn etwas davon abweicht. Zum Bleistift findest Du auf PostgreSQL: Documentation: Manuals: PostgreSQL 8.1: SELECT diesen Hinweis:

Nonstandard Clauses

The clauses DISTINCT ON, LIMIT, and OFFSET are not defined in the SQL standard



Kannst du mir noch nen Tipp geben wo ich Bespiele für Store Proc, Trigger, Events, Function finden kann.
Sind die einfach nach Oracle zu portieren???

Die Doku zu PG enthält eine Menge Beispiele. Inwieweit das einfach nach PG zu portieren ist, tja. Aber PG lehnt sich schon in vielen Dingen an ORA an und macht manches besser IMHO.

Andreas

Danke hat mir um einiges weiter geholfen und jede menge zu lesen hab ich jetzt auch. :slight_smile: