Domino 9 und frühere Versionen > ND6: Entwicklung
falsche Dokumentzuordnung
DAU-in:
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.
tks:
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?
DAU-in:
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
tks:
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.
DAU-in:
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
Navigation
[0] Themen-Index
[#] Nächste Seite
Zur normalen Ansicht wechseln