Definiert einen Prozess zum Lösen eines Konflikts in einer bestimmten Tabelle.
In der folgenden Tabelle stellt die Beschreibung den SQL-Datentyp bereit. Wenn Sie Ihr Skript in Java oder .NET schreiben, müssen Sie den entsprechenden Datentyp benutzen. Siehe SQL-Java-Datentypen und SQL-.NET-Datentypen.
In SQL-Skripten können Sie Ereignisparameter mit ihrem Namen oder mit einem Fragezeichen angeben. Die Verwendung von Fragezeichen ist veraltet und es wird empfohlen, benannte Parameter zu verwenden. Sie können nicht Namen und Fragezeichen in einem Skript mischen. Wenn Sie Fragezeichen verwenden, müssen die Parameter in der nachfolgend gezeigten Reihenfolge stehen und sind nur dann optional, wenn keine nachfolgenden Parameter angegeben wurden (z.B. müssen Sie Parameter 1 verwenden, wenn Sie Parameter 2 verwenden möchten). Wenn Sie benannte Parameter verwenden, können Sie beliebige Teilmengen der Parameter in beliebiger Reihenfolge angeben.
Parametername für SQL-Skripten | Beschreibung | Reihenfolge (veraltet für SQL) |
---|---|---|
s.remote_id | VARCHAR(128). Die entfernte ID von MobiLink. Sie können die entfernte ID nur dann referenzieren, wenn Sie benannte Parameter verwenden. | Nicht anwendbar |
s.username |
VARCHAR(128). Der MobiLink-Benutzername. |
1 |
s.table |
VARCHAR(128). Der Tabellenname. |
2 |
Keine.
Wenn eine Zeile in der entfernten Datenbank aktualisiert wird, speichert der MobiLink-Client eine Kopie der ursprünglichen Werte. Der Client sendet sowohl die alten als auch die neuen Werte an den MobiLink-Server.
Wenn der MobiLink-Server eine aktualisierte Zeile empfängt, vergleicht er die ursprünglichen Werte mit den vorhandenen Werten in der konsolidierten Datenbank. Der Vergleich wird mithilfe des Skripts upload_fetch durchgeführt.
Wenn die alten gesendeten Werte mit den aktuellen Werten in der konsolidierten Datenbank nicht übereinstimmen, verursacht die Zeile einen Konflikt. Anstatt die Zeile zu aktualisieren, fügt der MobiLink-Server den alten und den neuen Wert in die konsolidierte Datenbank ein. Die alte und die neue Zeile werden mit den Skripten upload_old_row_insert bzw. upload_new_row_insert verarbeitet.
Nachdem die Werte eingefügt wurden, führt der MobiLink-Server das Skript resolve_conflict aus. Mit diesem Skript kann der Konflikt gelöst werden. Sie können ein Schema Ihrer Wahl implementieren.
Dieses Skript wird einmal pro Konflikt ausgeführt.
Anstatt das Skript resolve_conflict zu definieren können Sie Konflikte in einer gruppenorientierten Weise lösen, indem Sie die Konfliktlösungslogik in Ihr end_upload_rows- oder Ihr end_upload-Tabellenskript aufnehmen.
Sie können für jede Tabelle in der entfernten Datenbank ein resolve_conflict-Skript benutzen.
Die folgende Anweisung definiert ein resolve_conflict-Skript, das für die CustDB-Beispielanwendung für eine Oracle-Installation geeignet ist. Es ruft die gespeicherte Prozedur ULResolveOrderConflict auf.
exec ml_add_table_script( 'custdb', 'ULOrder', 'resolve_conflict', 'begin ULResolveOrderConflict(); end; ') CREATE OR REPLACE PROCEDURE ULResolveOrderConflict() AS new_order_id integer; new_status varchar(20); new_notes varchar(50); BEGIN -- approval overrides denial SELECT order_id, status, notes INTO new_order_id, new_status, new_notes FROM ULNewOrder WHERE syncuser_id = SyncUserID; IF new_status = 'Approved' THEN UPDATE ULOrder o SET o.status = new_status, o.notes = new_notes WHERE o.order_id = new_order_id; END IF; DELETE FROM ULOldOrder; DELETE FROM ULNewOrder; END; |
Der folgende Aufruf einer MobiLink-Systemprozedur registriert eine Java-Methode namens resolveConflict als das Skript für das Tabellenereignis resolve_conflict, wenn die Skriptversion ver1 synchronisiert wird.
CALL ml_add_java_table_script( 'ver1', 'table1', 'resolve_conflict', 'ExamplePackage.ExampleClass.resolveConflict' ) |
Im Folgenden sehen Sie die Java-Beispielmethode resolveConflict. Sie ruft eine Java-Methode auf, die den Konflikt mit der JDBC-Verbindung löst, die von MobiLink bereitgestellt wird.
package ExamplePackage; import java.sql.*; import ianywhere.ml.script.*; public class ExampleClass { DBConnectionContext _cc; public ExampleClass( DBConnectionContext cc ) { _cc = cc; } public void resolveConflict( String user, String table ) throws java.sql.SQLException { if( table == "Order" ) { // Insert error information in a table, Connection conn = _cc.getConnection(); String conflictTable = "New" + table; PreparedStatement stmt = conn.prepareStatement( "SELECT order_id, new_status, new_notes " + "FROM " + conflictTable + "WHERE rid = " + _cc.getRemoteID() ); ResultSet rs = stmt.executeQuery(); PreparedStatement updt = conn.prepareStatement( "UPDATE ULOrder SET status = ?, notes = ? WHERE order_id = ?" ); while( rs.next() ) { if( rs.getString( 2 ) == "Approved" ) { updt.setString( 1, rs.getString( 2 ) ); updt.setString( 2, rs.getString( 3 ) ); updt.setInt( 3, rs.getInt( 1 ) ); } } updt.close(); stmt.close(); } } } |
Der folgende Aufruf einer MobiLink-Systemprozedur registriert eine .NET-Methode namens ResolveConflict als das Skript für das Tabellenereignis resolve_conflict, wenn die Skriptversion ver1 synchronisiert wird.
CALL ml_add_dnet_table_script( 'ver1', 'table1', 'resolve_conflict', 'TestScripts.Test.ResolveConflict' ) |
Im Folgenden sehen Sie die .NET-Beispielmethode ResolveConflict. Sie ruft eine .NET-Methode auf, die den Konflikt löst.
using System; using iAnywhere.MobiLink.Script; namespace TestScripts { public class Test { DBConnectionContext _cc; public Test( DBConnectionContext cc ) { _cc = cc; } public void ResolveConflict( string user, string table ) { if( table == "Order" ) { // Insert error information in a table, DBConnection conn = _cc.GetConnection(); String conflictTable = "New" + table; DBCommand cmd = conn.CreateCommand(); cmd.CommandText = "SELECT order_id, new_status, new_notes " + "FROM " + conflictTable + "WHERE rid = " + _cc.GetRemoteID(); DBRowReader dr = cmd.ExecuteReader(); DBCommand updt = conn.CreateCommand(); updt.CommandText = "UPDATE ULOrder SET status = ?, notes = ? WHERE order_id = ?"; object[] row; while( (row = dr.NextRow() ) != null ) { if( row.[1].Equals( "Approved" ) ) { updt.Parameters[0] = row[1]; updt.Parameters[1] = row[2]; updt.Parameters[2] = row[0]; } } updt.Close(); cmd.Close(); conn.Close(); } } } } |
![]() |
Kommentieren Sie diese Seite in DocCommentXchange.
|
Copyright © 2012, iAnywhere Solutions, Inc. - SQL Anywhere 12.0.1 |