Manuelle Analyse der Tabelle 'history'

Erstellt von Paul Schreiber, Geändert am Di, 13 Feb um 5:27 NACHMITTAGS von Paul Schreiber

Für jede Planung erstellt das Visual Planning auf dem eingetragenen Datenbankserver eine separate Datenbank.
Die Tabellen der Datenbank repräsentieren sowohl die Konfiguration als auch die eigentlichen Daten der Planung.

Der an Vorgängen und Ressourcen sichtbare "Verlauf" wird in der Tabelle "history" gespeichert. 


Diese Anleitung umfasst einen Überblick über die Arbeit mit der history Tabelle auf Datenbankebene. 

Es wird gezeigt wie die Tabelle aufgebaut ist und welche Schritte nötig sind um aus den Einträgen Rückschlüsse auf die Konfiguration der Planung zu ziehen. 

Zu jedem Beispiel werden die genutzten SQL Befehle dokumentiert. 


Zur Erstellung der Dokumentation wurde eine PostgreSQL Datenbank genutzt. Die SQL Befehle auf anderen DBMS können abweichen!


Aufbau der Tabelle

Die Tabelle besteht aus den folgenden Feldern:

DESCRIBE history;

Id: Die Id des Eintrags in der Tabelle 

createdate: Das Datum an dem das Objekt erstellt wurde.

createlogin: Der Nutzername des Nutzers der das Objekt erstellt hat

deletedate: Der Zeitpunkt an dem das Objekt gelöscht wurde

deletelogin: Der Nutzername des Nutzers der das Objekt gelöscht hat

entityclassname: Der interne Name des Objekts das bearbeitet wurde.

modifydate: Der Zeitpunkt an dem die Änderung stattgefunden hat. Löschen zählt hierbei nicht als ändern des Datensatzes.

modiylogin: Der Nutzername des Nutzers der die Änderung hervorgerufen hat.

UID: Die interne UID Kennung des Objektes um den sich der Eintrag in der Tabelle dreht




Auslesen der Tabelle für bestimmte Dimensionen

Möchte man nur Einträge für Ressourcen einer spezifischen Dimension auslesen geht man wie folgt vor:

Zuerst benötigt man die Id der gesuchten Dimension. 

Um diese zu erhalten wird die Tabelle "resourcemodel" nach dem Eintrag der Dimension durchsucht.

SELECT id FROM resourcemodel WHERE NAME LIKE '<Gesuchte_Dimension>';

Wobei <Gesuchte_Dimension> der gesuchten Dimension entspricht.


Anschließend kann man alle Einträge für diese Dimension geordnet nach Änderungsdatum wie folgt abrufen:

SELECT * FROM history WHERE entityclassname LIKE 'EventResource<ID_der_Dimension>' ORDER BY modifydate DESC;



Auslesen der Tabelle für bestimmte Ressourcen

Möchte man nur Einträge zu einer bestimmten Ressource aus der Tabelle erhalten geht man wie folgt vor.

Äquivalent zum vorherigen Punkt muss zuerst die Id Dimension der Ressource ermittelt werden. Siehe dazu "Auslesen der Tabelle für bestimmte Dimensionen".


Ist die Id vorhanden kann man die Uid der gesuchten Ressource suchen. Jede Dimension hat in der Datenbank eine eigene Tabelle welche die Struktur der Dimension repräsentiert. 

DESCRIBE eventresource<ID_der_Dimension>;

Wie zu erkennen ist werden die Rubriken hier über ihre interne Kennung hinterlegt und nicht über den Namen der Rubrik.

Die schnellste Variante die gewünschte Ressource zu finden wäre nun sich die Rubriken des ersten Datensatzes der Tabelle ausgeben zu lassen. Für das Beispiel oben:

SELECT rub14, rub15, rub16, rub17 from eventresource<Id_der_Dimension> limit 1; 


Basierend auf der Ausgabe kann dann die Rubrik ermittelt werden über die die gesuchte Ressource identifizierbar wird.

Dadurch kann man die Uid der Ressource mit Hilfe der Rubrik ermitteln.

Select "UID" from eventresource<Id_der_Dimension> where rub<Id_der_Rubrik> like '<Wert_der_Rubrik>';

Hinweis: Basierend auf dem Typ der Spalte muss die Anfrage natürlich angepasst werden. s. dazu die offizielle SQL Dokumentation.


Hat man die Uid erhalten so kann man die history Tabelle mit dieser filtern:

SELECT * FROM history WHERE "UID" LIKE '<Uid_der_gesuchten_Ressource>';



Auslesen der Tabelle für Vorgänge einer Vorgangshierarchie

Die für Vorgänge benötigten Filterkriterien zu erhalten ist etwas umfangreicher als bei Ressourcen. Da es im Visual Planning auf Datenbankebene keine Unterscheidung zwischen Vorgangsarten gibt muss zuerst über die Vorgangshierarchie herausgefunden werden, welche RessourcenIds die Vorgangsart definieren.


Zur Ermittlung der der Vorgangshierarchie nimmt man sich den Namen der Vorgangshierarchie und filtert die Tabelle nach diesem. Der Name der Vorgangshierarchie ist im Visual Planning in den Einstellungen zu den Vorgangshierarchien zu finden:


Wir benutzen hier beispielhaft die Vorgangshierarchie "Test".

Wir fragen den xmlcontent der Vorgangshierarchie "Test" ab. 

SELECT xmlcontent FROM eventtreestruct WHERE name LIKE 'Test';

Für die Analyse des XML bietet sich ein Editor mit Highlighting wie notepad++ oder vscode an.


Im XML der Vorgangshierarchie sucht man nun nach den Knoten mit der Bezeichnung "com.visualplanning.data.event.ResourceModelTreeStruct".

Diese enthalten ein Kind Knoten "resourceModel" welches die Id der Ressource enthält.


Auf diese Weise sucht man alle Ids der Ressourcen welche die Vorgangshierarchie definieren.


Hat man alle Ids ermittelt lässt sich eine Abfrage erstellen mit der nur die Historie der Vorgänge dieser Vorgangshistorie angezeigt werden. 

Seien dafür die von der Hierarchie definierten Ressourcen Ressource4 und Ressource5.

 

SELECT * FROM history WHERE "UID" IN (SELECT "UID" FROM planningevent WHERE resource4 IS NOT NULL AND resource5 IS NOT NULL);

Sollte die Hierarchie Vorgänge auf Ebene zwei oder höher besitzen können diese über die WHERE Klausel gezielt hinzugefügt oder ausgeschlossen werden. 


Auslesen der Tabelle für bestimmte Vorgänge

Das Auslesen für bestimmte Vorgänge erweitert die Schritte aus "Auslesen der Tabelle für Vorgänge einer Vorgangshierarchie" um das ermitteln des bestimmter Vorgänge der Vorgangshierarchie. 

Den gesuchten Vorgang identifizieren wir anhand der an ihm befindlichen Ressourcen. 

Um einzelne Ressourcen zu identifizieren verweise ich an der Stelle auf "Auslesen der Tabelle für bestimmte Ressourcen".

Hat man die Uid der gesuchten Ressourcen kann man wie folgt vorgehen:

Seien Ressource4 und Ressource5 wieder die Ressourcen der Vorgangshierarchie. 

Seien weiterhin  "147E-A852-91DC-0BD8-9ACA-4A85-E1C6-EF80" und "3308-05E2-9C1E-10DB-EAD1-E7D2-1E4B-1844" die Uids der gesuchten Ressourcen. Der Aufruf setzt sich dann wie folgt zusammen:

SELECT * from history where "UID" in (SELECT "UID" from planningevent where resource4 in (SELECT id from eventresource4 where "UID" like '147E-A852-91DC-0BD8-9ACA-4A85-E1C6-EF80') and resource5 in (SELECT id from eventresource5 where "UID" like '3308-05E2-9C1E-10DB-EAD1-E7D2-1E4B-1844'))

Abfrage mit Platzhaltern:

SELECT * from history where "UID" in (SELECT "UID" from planningevent where resource<ID_der_Ressource> in (SELECT id from eventresource<ID_der_Ressource> where "UID" like '<UID_der_Ressource>') and resource<ID_der_Ressource> in (SELECT id from eventresource<ID_der_Ressource> where "UID" like '<UID_der_Ressource>'))


Dadurch werden alle Einträge angezeigt welche sich auf Vorgänge beziehen, welche bestimmte Ressource hinterlegt haben. Weitere Filterung kann dann durch Datum oder zBsp. Formularwerte erzielt werden. Dies vollumfänglich zu Beschreiben sprengt den Rahmen der Anleitung.



Auslesen der Tabelle für gelöschte Objekte

Wenn ein Objekt im Visual Planning gelöscht wird so ist dafür auch nach der Löschung noch ein Eintrag in der history Tabelle vorhanden.

Man kann gezielt nach diesen Einträgen suchen und somit sich die UIDs aller gelöschten Vorgänge oder Ressourcen anzeigen lassen.

Die Einträge sind am deleteDate erkennbar. Eine Abfrage aller gelöschten Objekte lautet daher:

SELECT * FROM history WHERE deleteDate IS NOT NULL;


Durch zusätzliche Filterung auf die Spalte "entityclassname" kann die Liste der gelöschten Objekte weiter eingeschränkt werden. 

Ressourcen werden dabei durch den Namen ihrer Tabelle identifiziert. Für die Identifizierung des Tabellennamens verweise ich auf "Auslesen der Tabelle für bestimmte Dimensionen". Ein Beispielaufruf wäre entsprechend:

SELECT * FROM history WHERE deleteDate IS NOT NULL AND entityclassname LIKE 'EventResource7';

Für Vorgänge wird als Filter lediglich "PlanningEvent" angegeben.

SELECT * FROM history WHERE deleteDate IS NOT NULL and entityclassname LIKE 'PlanningEvent';

Eine Filterung der Vorgänge anhand der Vorgangshierarchien ist für gelöschte Vorgänge nicht möglich da keine Verbindung mehr zwischen der UID des Vorgangs und der Vorgangshistorie besteht. 



Ermittlung von gelöschten Objekten:

Hat man nun ein Backup der Planung kann man anhand der UID des gelöschten Objekts in der history Tabelle nachvollziehen worum es sich genau gehandelt hat. Dazu spielt man das Backup entweder parallel als neue Planung (und damit neue Datenbank) ein oder öffnet die vps Datei als zip Datei. Dort kann dann ist der entsprechenden Tabelle (planningevent für Vorgänge, EventResourceX für Ressourcen) nach der UID gesucht werden. 



Ein Wiederherstellen von Ressourcen und/oder Vorgängen basierend auf diesem Vorgehen ist nicht empfohlen und kann zu einer beschädigten Planung führen.

War dieser Artikel hilfreich?

Das ist großartig!

Vielen Dank für das Feedback

Leider konnten wir nicht helfen

Vielen Dank für das Feedback

Wie können wir diesen Artikel verbessern?

Wählen Sie wenigstens einen der Gründe aus
CAPTCHA-Verifikation ist erforderlich.

Feedback gesendet

Wir wissen Ihre Bemühungen zu schätzen und werden versuchen, den Artikel zu korrigieren