@ReplicateWithFieldProtection
Syntax
@ReplicateWithFieldProtection(DBHANDLE1;DBHANDLE2;FNLIST3;FIELDNAMELIST1;FIELDNAMELIST2);
@ReplicateWithFieldProtection(DBHANDLE1;DBHANDLE2;FNLIST3;FIELDNAMELIST1;FIELDNAMELIST2;FNREPLICATIONFLAGS4);
@ReplicateWithFieldProtection(DBHANDLE1;DBHANDLE2;FNLIST3;FIELDNAMELIST1;FIELDNAMELIST2;FNREPLICATIONFLAGS4;FNLISTERROR5);
Beschreibung
Repliziert die durch DBHANDLE1 referenzierte Datenbank mit der durch DBHANDLE2 referenzierten Datenbank. FNLIST3 enthält die Replikationsrechte. Das erste Element gibt die Rechte für die Replikation in der ersten Datenbank an, das zweite Element die Rechte für die zweite Datenbank.
Die Datenbanken müssen keine Repliken voneinander sein!
Über FIELDNAMELIST1 und FIELDNAMELIST2 können Feldnamen angegeben werden, deren Werte in der jeweiligen Datenbank erhalten bleiben sollen. Diese Felder werden bei der Replikation nicht durch gleichnamige Felder aus der jeweils anderen Datenbank überschrieben.
TEXT/TEXTLIST FIELDNAMELIST1:
Gibt die Namen der Felder an, die in den Dokumenten der DB1 erhalten bleiben sollen.
Gleichnamige Felder aus Dokumenten der DB2 werden beim Replizieren nach DB1 nicht übernommen.
TEXT/TEXTLIST FIELDNAMELIST2:
Gibt die Namen der Felder an, die in den Dokumenten der DB2 erhalten bleiben sollen.
Gleichnamige Felder aus Dokumenten der DB1 werden beim Replizieren nach DB2 nicht übernommen.
Es wird eine FNLIST zurückgegeben:
Element Bedeutung
1 UpdateCount DBHANDLE1
2 CreateCount DBHANDLE1
3 DeleteCount DBHANDLE1
4 UpdateCount DBHANDLE2
5 CreateCount DBHANDLE2
6 DeleteCount DBHANDLE2
FNLIST3:
Bit HEX Bedeutung
01 0001 Lesen
02 0002 Schreiben
03 0004 Ändern
04 0008 Löschen
Hinweis:
Bei Replikationen mit asymmetrischer Rechtezuweisung kann es zu einem Verhalten kommen, das auf den ersten Blick widersprüchlich wirkt.
Beispiel: Datenbank A darf Dokumente nach Datenbank B replizieren. Datenbank B hat jedoch keine Löschrechte in Datenbank A.
Wird nun ein Dokument zunächst von A nach B repliziert und anschließend in B gelöscht, entsteht in B ein Deletion Stub. Dieser Deletion Stub bleibt bis zum CutOffTD der Datenbank erhalten; siehe hierzu auch @GetDBReplicaInfo.
Da B keine Löschrechte in A hat, wird die Löschung nicht von B nach A repliziert. Das ursprüngliche Dokument bleibt also in A weiterhin vorhanden.
Solange der Deletion Stub in B existiert, wird das in A noch vorhandene Dokument jedoch auch nicht erneut von A nach B repliziert. Für die Replikationslogik gilt das Dokument in B in diesem Zeitraum weiterhin als gelöscht.
Erst wenn der Deletion Stub in B nach Ablauf des CutOffTD entfernt wurde, kann das Dokument bei einer späteren Replikation wieder von A nach B übertragen werden. Dadurch kann es so wirken, als würde das Dokument plötzlich wieder in B erscheinen.
Dieses Verhalten entspricht dem Verhalten des Domino-Replicators bei asymmetrisch vergebenen Replikationsrechten.
FNREPLICATIONFLAGS4:
Bit HEX Bedeutung
01 0001 Lokalisieren von Links (Doc;View;DB) in Datenbanken mit unterschiedlicher ReplicaID.
FNLISTERROR5:
Bei Verwendung des optionalen Return-Parameter FNLISTERROR5, wird in diesem eine Error-Statistik zurückgegeben.
Element Bedeutung
1 Error UpdateCount DBHANDLE1
2 Error CreateCount DBHANDLE1
3 Error DeleteCount DBHANDLE1
4 Error UpdateCount DBHANDLE2
5 Error CreateCount DBHANDLE2
6 Error DeleteCount DBHANDLE2
Beispiel: @ReplicateWithFieldProtection(DBHANDLE1;DBHANDLE2;FNLIST3;FIELDNAMELIST1;FIELDNAMELIST2;FNREPLICATIONFLAGS4;FNLISTERROR5);
/*
Beispielscript zur Replikation mit Feldschutz.
Dieses Script öffnet zwei Notes-Datenbanken und repliziert sie.
Bestimmte Felder können davor geschützt werden, bei der Replikation überschrieben zu werden.
Das Script protokolliert die Anzahl der aktualisierten, erstellten und gelöschten
Dokumente sowie die entsprechenden Fehlerzahlen für beide Datenbanken.
*/
SrcDBPath:="test\\testdb1.nsf";
DstDBPath:="test\\testdb2.nsf";
/* Quell- und Zieldatenbank öffnen. */
SrcDBh:=@OpenDB(SrcDBPath);
DstDBh:=@OpenDB(DstDBPath);
/* Beschriftungen für die Replikations-Ergebniszähler erzeugen. */
RetLabels:=("Number of docs "+@Explode("updated in ;created in ;deleted in ";";")+SrcDBPath+": "):
("Number of docs "+@Explode("updated in ;created in ;deleted in ";";")+DstDBPath+": ");
/* Beschriftungen für die Replikations-Fehlerzähler erzeugen. */
RetErrorListsLabels:=("Number of errors while "+@Explode("updating in ;creating in ;deleting in ";";")+SrcDBPath+": "):
("Number of errors while "+@Explode("updating in ;creating in ;deleting in ";";")+DstDBPath+": ");
/* Wenn eine der Datenbanken nicht geöffnet werden konnte, den entsprechenden Fehler protokollieren. */
IF(@IsError(SrcDBh;DstDBh)){
IF(@IsError(SrcDBh)){
@LogReport(SrcDBh;3);
}
IF(@IsError(DstDBh)){
@LogReport(DstDBh;3);
}
}ELSE{
/* Standard-Replikationsverhalten verwenden. */
ReplicationFlags:=0;
/* Replikationsrechte für Quell- und Zieldatenbank festlegen. Alle Rechte werden gewährt!*/
SrcDB_RghtsBitVector:=@BitVektor(1:2:3:4);
DstDB_RghtsBitVector:=@BitVektor(1:2:3:4);
/* Felder festlegen, die in der jeweiligen Datenbank nicht überschrieben werden dürfen. */
SrcDB_ProtectedFieldsList:="FieldLocalToThisDB";
DstDB_ProtectedFieldsList:="FieldLocalToThisDB";
/* Rechte-Definitionen für Quell- und Zieldatenbank zusammenführen. */
RightsList:=SrcDB_RghtsBitVector:DstDB_RghtsBitVector;
/* Alle Dokumente replizieren und dabei
die Listen der geschützten Felder für beide Datenbanken berücksichtigen. */
Ret:=@ReplicateWithFieldProtection(SrcDBh;DstDBh;RightsList;SrcDB_ProtectedFieldsList;DstDB_ProtectedFieldsList;ReplicationFlags;RetErrorLists);
/* Replikations-Ergebniszähler protokollieren. */
@LogReport(@Implode(RetLabels+@Text(Ret);@NewLine);3);
/* Replikations-Fehlerzähler protokollieren. */
@LogReport(@Implode(RetErrorListsLabels+@Text(RetErrorLists);@NewLine);3);
} /* END IF(@IsError(SrcDBh;DstDBh)) */
/* Quelldatenbank schließen, wenn sie erfolgreich geöffnet wurde. */
IF(!@IsError(SrcDBh)){
SrcDBh:=@CloseDB(SrcDBh);
}
/* Zieldatenbank schließen, wenn sie erfolgreich geöffnet wurde. */
IF(!@IsError(DstDBh)){
DstDBh:=@CloseDB(DstDBh);
}
