"remote" Replik erzeugen

  • Hallo Zusammen,


    ich habe folgendes Problem:


    Wir haben einen Agenten erstellt, der Editoren ermöglicht eine Datenbank in einen konfigurierten Ordner auf den Server zu erstellen. (Die Herren kommen gerne Freitags kurz von deren Feierabend und benötigen die DB dann Montags morgens um 8.00 Uhr :) )


    Klappt auch alles soweit. Das Setup-Dokument ruft den Backend-Agenten auf welcher mit (onBehalfof) Adminrechten läuft, erzeugt die Datebank mit dem Template.


    Das eigentliche Problem besteht darin, dass ich eine Replic auf den Failoverserver erzeuge, welche dann einen Fehler rückmeldet, weil die Datenbank erstmal nur als Stub generiert wurde. Diese soll aber wohl sofort geöffnet werden, was den Fehler verursacht.


    Code
    On Error Goto errhandle
            If Not serverReplic = "" Then
                     Call newDb.CreateReplica(serverReplic,pfad+dbname)
     	End If


    Ich könnte den Fehler ignorieren, möchte das aber nicht, falls mal ein "echter" Fehler auftritt.


    Hat jemand eine Idee wie das vernünftig handlebar ist ?


    Danke.


    Wolfgang

  • Hallo Taurec,


    hatte ich versucht, das Problem liegt darin, dass das öffnen der Datenbank in dem Moment passiert, wenn die Datenbank angelegt wird.


    Code
    Call newDb.CreateReplica(serverReplic,pfad+dbname)
    Call newDb.replicate(serverReplic)


    funktioniert nicht, da der Agent in der ersten Zeile schon aussteigt:


    2009-06-19 15:36:18 Agent printing: CRITICAL ERROR: INITIALIZE aufgerufen von INITIALIZE: Fehler (4060) Zeile: 127 - User CN=[Name des OnBehalfOf]/OU=dor/OU=de/O=[FIRMA] cannot open database dor-lddev-02/[Firma]!!clients\aktionen\09-0007 projectname.nsf


    Ich komme um das "öffnen" nicht herum, obwohl ich das weder benötige noch will....

  • Das weiß ich halt nicht, für mich sieht das leider so aus, als würde der Befehl "CreateReplica" das machen, da man dort auch die Replikdatenbank zurückgeben könnte.
    (set replicdb = neueDB.CreateReplica(server,pfad))


    Als Frontent-Agent in Clientcontext hat das mit den entsprechenden Rechten auch problemlos funktioniert. Da der Kontext aber Adminrechte benötigt, und die o.g. Herren diese Rechte nicht haben dürfen, habe ich daraus einen Agenten gestrickt der mit "runOnServer" angestoßen wird und die Rechte von Admin bekommt.


    Danke


    Wolfgang


    (Wünsche dann ein schönes Wochenende und würde mich dann am Montag wieder melden)

  • Hallo Taurec,


    Ich hoffe Du hattest ein gutes Wochenende :)


    Der Code:
    =======
    DAs QuerySave-Object im Konfigurationsdokument:


    Code
    Sub Querysave(Source As Notesuidocument, Continue As Variant) 	Dim db As NotesDatabase 	Dim doc As NotesDocument 	Set doc =  source.document 	Set db = doc.ParentDatabase  	' Eingabe in das Backend schieben 	Call source.refresh 	Call doc.Save(True,False)  	' Agenten ausführen 	Dim agent As NotesAgent 	Set agent = db.GetAgent("newDB") 	Dim nid As String 	nid = doc.NoteID 	Call agent.RunOnServer(nid)  	' doc "refreshen" 	Delete doc	 	Set doc = db.GetDocumentByID(nid) 	 	' Fehlermeldungen 	If (doc.getitemvalue("status")(0) <> "") Then 		Messagebox doc.getitemvalue("status")(0) , , "ERROR" 	Else 		Messagebox "database generated\n on " + server + dbpath , , "SUCCESS"	 	End If  	' doc schließen 	continue= False 	Call source.Close 	Call doc.Remove(True) End Sub


    Der eigentliche Agent:
    ==============


    Zeile 127 ist fett hinterlegt.
    Auch über das Wochenende habe ich da leider keine andere Lösung gefunden / Idee gehabt, da man aus Gründen der Rechte die Erstellung der Replikation ebenfalls im Backend laufen lassen muss.


    Danke.


    Vielleicht hast Du ja einen Idee...


    Wolfgang

  • Hallo,


    hast du mal versucht, den Return-Wert in ein neues Datenbankobjekt zurückzuschreiben, wie es die Designerhilfe vorsieht, vielleicht funktioniert die call-Routine hier nicht bzw. verursacht dann das Öffnen der Datenbank :


    Dim replica As NotesDatabase
    Set db = session.CurrentDatabase
    Set replica = db.CreateReplica( "Jakarta", "sales.nsf" )


    statt
    call db.CreateReplica( "Jakarta", "sales.nsf" )


    Das replica-Objekt sollte dann auch eigentlich nicht geöffnet sein,


    ist vielleicht ein Versuch wert.


    mfg


    Holger

  • Hallo Zusammen,


    die Ursache des Problems lag in einem anderen Bereich, den Rechten...


    session.userName bekommt in diesem Agenten nicht den Wert dessen unter den der Agent läuft ("Run on behalf of") sondern unter dem Namen des Servers.


    Das bedeutet, dass der Server aus der ACL gelöscht wird.
    Dann wird der DB Stub auf dem Backupserver erzeugt. Der Server kann aber nicht mehr darauf zugreifen. Daher kommt die Fehlermeldung. (Seltsamerweise wird die Gruppe "LocalDomainServers", wo beide Server eingetragen sind nicht berücksichtigt, was ich zumindest erwartet hätte.)


    Ich habe den Code wie folgt geändert:


    Code
    Set aclEntry = acl.GetEntry("[Name des Admins]")Call aclEntry.Remove Call acl.Save


    ...


    Code
    If Not serverReplic = "" Then 
    Call newDb.CreateReplica(serverReplic,pfad+dbname) 
    Call newDb.Replicate(serverReplic) 
    End If



    Danke für Eure Hilfe


    Wolfgang