Das Notes Forum
Domino 9 und frühere Versionen => ND6: Entwicklung => Thema gestartet von: DAU-in am 27.12.06 - 11:04:13
-
hallo an alle , die jetzt nicht beim skifahren sind:
ich bin gerade ziemlich frei drehend wegen folgendem:
Problem:
In einer Produktiv-DB wurden durch einen Agenten fälschlicherweise fast alle attachments abgehängt, diese müssen wieder eingefügt werden
derzeit sind alle User an der Datenbereinigung, und der Fehler wurde mit Verzögerung entdeckt, also einfach ein Backup hinstellen ghet nicht, wenn wir nicht gelyncht werden wollen.
Lösungsansatz:
In einer restore-DB läuft ein agent, nimmt sich ein Dokument nach dem anderen, sucht in der Produktiv-DB nach dem entsprechenden dokument, löscht das attachmentfeld, hängt das attachmentfeld aus dem RestoreDokument rein und speichert das ganze.
Es läuft auf den ersten Blick auch zufriedenstellend, allerdings hat eine Kontrolle ergeben, dass manchmal die verkehrten attachmentfelder angehängt werden.
Von den DocIDs her sieht alles korrekt aus. Ich kann keine Regelmässigkeit erkennen, bei einem erneuten Lauf waren jedoch dieselben Dokumente falsch verändert.
-
Kann es sein, daß Variablen noch "alte" Werte haben.
Ich meine, daß er noch Angaben zum Attachment aus einem vorherigen Dokument in einer Variablen gespeichert hat und dann ein Attachment doppelt in unterschiedliche Dokumente reinhängt?
-
sobald der Konsistenzcheck durch ist, häng ich den Code hier rein
ich setzte rtitem auf nothing, damit sollten 'alte' attachments doch entsorgt sein?
hier ist der code:
Set dbCurrent = session.CurrentDatabase
Set dbLive = session.GetDatabase( "server", "db")
Set vAct1 = dbCurrent.GetView("(allActivities)")
Set vAct2 = dblive.GetView("(allActivities)")
Set docActOld = vAct1.getfirstdocument
Set stream = session.CreateStream
flag = stream.Open( "C:\Log\fr_protocol_Body.txt", "Windows-1252")
Set streamNot = session.CreateStream
flagNot = streamNot.Open( "C:\Log\fr_protocol_notFound.txt", "Windows-1252")
Set streamError = session.CreateStream
flagError = streamError.Open( "C:\Log\fr_oprotocol_Error.txt", "Windows-1252")
i = 1
While Not docActOld Is Nothing
Print i
strDoc(0) = docActOld.Form(0)
strDoc(1) = docActOld.activityDocID(0)
' Set docActNew = vAct2.GetDocumentByKey(strDoc)
Set docActNew = dbLive.GetDocumentByUNID( docActOld.activityDocID(0) )
If Not docActNew Is Nothing Then
Set rtitem = docActOld.GetFirstItem("Body")
If Not rtitem Is Nothing Then
Call docActNew.RemoveItem( "Body")
Call docActNew.CopyItem( rtitem, "Body")
Call docActNew.Save(True,False)
Call stream.WriteText(Cstr(i ) & "~'~" & strDoc (0) & "~'~" & strDoc(1) & Chr(13))
Else
Call streamError.WriteText(Cstr(i ) & "~'~" & strDoc (0) & "~'~" & strDoc(1) & "~'~" & " no body" & Chr(13))
End If
Set rtitem = Nothing
Else
Call streamNot.WriteText(Cstr(i ) & "~'~" & strDoc (0) & "~'~" & strDoc(1) & "~'~" & " no doc" &Chr(13))
End If
Set docActOld = vAct1.getnextdocument(docActOld)
i = i+ 1
Wend
Call stream.Close
Call streamNot.Close
Call streamError.Close
Exit Sub
errorhandling:
Call streamError.WriteText(strDoc (0) & "~'~" & strDoc(1) & "~'~" & " error" & Chr(13))
Set docActOld = vAct1.getnextdocument(docActOld)
i = i+ 1
If Not rtitem Is Nothing Then Set rtitem = Nothing
Resume Next
-
So auf den ersten Blick kann ich keinen Fehler erkennen.
Ich vermute aber, daß nach errorhandling was schiefläuft. Wenn in DBAlt ein Dokument drin ist, daß es nicht mehr in DBAktuell gibt, müsste das Script auf errorhandling laufen. Dort wird dann mit dem nächsten Dok (alt) weitergemacht und docActNew ist noch befüllt. Als Schuss ins Blaue würde ich einfach hier mal docActNew auf Nothing setzen.
Sorry, aber mehr fällt mir da auch nicht ein.
-
Hallo,
das ganz merkwürdige ist, das das ganze mit lokalen Kopien problemlos durchläuft, nur auf dem Server nicht.
ich probier mal weiter.
aber auf alle Fälle vielen Dank, das docActNew habe ich übersehen
-
Da die Navigation über Views läuft, würde ich AutoUpdate auf False setzen, um Veränderungen in den Ansichten während des Agentendurchlaufs zu verhindern (ein Effekt der nur am Server auftreteten kann, da lokal immer nur ein User angemeldet sein kann).
Gruß
André
-
Hallo,
das muss ich ausprobieren.
danke
Dau-in
-
Dieses Problem ist inzwischen so gelöst/umschifft, dass ich die gesamten Dokumente kopiert habe.
Auf dem Server habe ich das einfach nicht korrekt zum Laufen gebracht.
-
Wenn es lokal läuft, warum hast Du dann nicht einfach Repliken erstellt, die Datenbank auf dem Server gesperrt (ACL) und das Script lokal laufen lassen. Anschließend hochreplizieren, ACL wieder einrichten und fertig.
-
Wenn es lokal läuft, warum hast Du dann nicht einfach Repliken erstellt, die Datenbank auf dem Server gesperrt (ACL) und das Script lokal laufen lassen. Anschließend hochreplizieren, ACL wieder einrichten und fertig.
weil ich dafür noch eine andere Abteilung bemühen müsste, und ich noch in diesem Jahr fertigwerden musste ..........