Lade...
 

Objekte aus Datenbank entfernen

Objekte physisch löschen

In "normalen" Anwendungen werden Objekte nur logisch gelöscht (siehe Anweisung DeleteObject).
Damit können zwar Referenzen von einem logisch gelöschtem Objekt auf "lebendige" Objekte und umgekehrt entstehen, aber es kann nie eine Relationen geben, die ins "Nichts" führt und deshalb eine Fehler verursacht.

Objekte physisch aus der Datenbank zu entfernen ist eine Wartungsaufgabe, die außerhalb der Anwendungen durchgeführt werden kann. Dafür existieren folgende Hilfsmittel:

  • die Cross-Referenz der Objekte gibt Auskunft darüber, ob auf ein zum Löschen vorgesehenes Objekt noch von andere Objekt verweisen

  • die Funktionen CollectOrphans() und CollectOrphans2() des Objekt-Managers sammeln Objekte, die aufgrund des Tests gegen die Cross-Referenz bedenkenlos gelöscht werden können.

Zwei Varianten, Objekt aus der Datenbank zu entfernen:

Variante Beschreibung
1 Die Menge der zum endgültigen Löschen vorgesehene Objekte ist bekannt, z.B. mittels InstantView®-Anweisung FindGarbage 
2 Alle potentiell löschbaren Objekte ermitteln werden erst ermittelt. Die vollständige Cross-Referenz der Objekte wird mit Flag /O aufgebaut.

 

  • Variante 1 - die Menge der zum endgültigen Löschen vorgesehene Objekte ist bekannt:

    Var(obsoleteObjects, objectsToKillSafely)  

    .  .  .  // zum Löschen vorgesehene Objekte ermitteln
    -> obsoleteObjects 

    obsoleteObjects "objects.xrf" GetManager(OBJECT) Call(CollectOrphans2
    -> objectsToKillSafely

    .  .  . // zur Kontrolle in ObjectList darstellen

    objectsToKillSafely iterate { KillObject }
    Hierfür wird die mit cxxosr.exe aufgebaute Cross-Referenz der Objekte benötigt. 

    Diese kann über die gesamte Datenbank aufgebaut werden, oder aber, um Zeit zu sparen, auch partiell nur für die zum Löschen vorgesehen Objekte (siehe partielle Cross-Referenz). Das Parameter-File für die partielle Cross-Referenz kann man wie folgt erzeugen:

    "xobjects.lst" obsoleteObjects GetManager(OBJECT) Call(GetDBUtility) Call(PartialXRefParams
    Die Funktion CollectOrphans2() entfernt aus der vorgegebenen Collection alle die Objekte, die direkt oder indirekt von einem "lebendigen" Objekt referenziert werden. Die übrig bleibenden Objekte können physisch gelöscht werden, ohne dass ins "Nichts" zeigende Referenzen entstehen - auch nicht bei logisch gelöschten Objekten. Die CollectOrphans2() arbeitet iterativ (siehe Abbildung). 

     
  • Variante 2 - alle potentiell löschbaren Objekte ermitteln

    Wenn die vollständige Cross-Referenz aufgebaut wird, werden alle Objekte der Datenbank daraufhin untersucht, ob sie von anderen Objekten referenziert werden. Mit Flag /O kann man verlangen, dass für jedes Objekt der Datenbank ein korrespondierendes CX_XREF-Objekt aufgebaut wird, auch für die nicht mehr erreichbaren Objekte. Mit dieser Information können die physisch löschbaren Objekte aufgefunden werden:

    Var(mode, objectsToKillSafely)

    TRUE -> mode  // auch logisch nicht gelöschte Objekte betrachten
    FALSE -> mode // nur logisch gelöschte Objekte betrachten

    mode "xobjects.xrf" GetManager(OBJECT) Call(CollectOrphans)
    -> objectsToKillSafely
    Die Funktion CollectOrphans() bildet zuerst eine Primärmenge von Objekten, die entweder gar nicht oder nur von logisch gelöschten Objekten referenziert werden. Dann werden alle Objekte gesucht, die von einem Objekt referenziert werden, dass nicht zu dieser Menge gehört. Diese Objekte werden aus der Menge entfernt, und der gerade beschriebene Schritt wird wiederholt. Dieser Iterationszyklus bricht ab, wenn keine Objekte mehr gefunden werden, die von Objekten außerhalb der aktuellen Menge referenziert werden (siehe Abbildung zu CollectOrphans2).