前回はグローバルスクリプトの基本的な記述の仕方をご紹介しました。今回はそのグローバルスクリプトで使用できる関数とイベントをご紹介します。
目次
- 1 関数
- 1.1 AddLog (String, enmLogMessageType)
- 1.2 AddLog (String, enmLogMessageType, Record, enmRecordImage)
- 1.3 SendMail (subject, body, to)
- 1.4 SendMail (sSubject, sMessageBody, sSMTPServer, sSMTPPort, sRcptFrom, sRcptTo, bAuthentication, sUser, sPassword, bUseSSL)
- 1.5 GetRecordInfo(Record, enmRecordImage)
- 1.6 GetJSONRecordInfo
- 1.7 GetReceiversInUse
- 2 イベント
関数
グローバルスクリプトで使用するグローバル関数を解説します。 これらの関数をグローバルスクリプトイベントから使用する場合は、IGlobalScriptクラス(IGlobalScript.AddLogなど)を使用して呼び出します。
AddLog (String, enmLogMessageType)
パラメータと解説
注意:この関数はAddLog(str As String, eType As Integer)の代替です。
DBMoto.logファイルに対してログメッセージを記録します。
– str = ログメッセージ
– eType = エミュレータenmLogMessageTypeを指定、Information = 0, Warning = 1, Error = 2を使用できます。
VB .NET
Public Shared Sub AddLog (str As String, eType As enmLogMessageType)
例: AddLog ("The current record has been inserted", 0)
C#
public static void AddLog(string str, enmLogMessageType eType)
例: AddLog("The current record has been inserted", 0)
AddLog (String, enmLogMessageType, Record, enmRecordImage)
パラメータと解説
注意:この関数はAddLog(String, Int, Record, enmRecordImage)の代替です。
特定のレコード情報を含むログメッセージをDBMoto.logに記録します。
– str = メッセージログ
– eType = エミュレータenmLogMessageTypeを指定、Information = 0, Warning = 1, Error = 2を使用できます。
– record = メッセージとともに記録されるIRecordオブジェクト
– eRecordImage = 記録するレコード情報の種類をエミュレータenmRecordImageで指定、レコードの情報としてInsert操作に関してはValues Afterが、それ以外はValues Beforeが使用されます。パラメータ値としては1,2,4が使用できます。
1 = 主キー値 – 主キーとなるカラムの値のみ
2 = イメージ – レコードの全ての情報
4 = ログ情報 – トランザクションID、トランザクションタイムスタンプ
VB.NET
Public Shared Sub AddLog (str As String, eType As enmLogMessageType,
record As DBMotoPublic.IRecord, eRecordImage As enmRecordImage)
例:
Public Overrides Sub Record_onAfterMapping(recSource As IRecord, recTarget As IRecord,
ByRef AbortRecord As Boolean)
Dim S as String
AddLog("The current record has been inserted", 0, recSource, 4)
End Sub
C#
public static void AddLog(string str, enmLogMessageType eType, DBMotoPublic.IRecord record, enmRecordImage eRecordImage)
SendMail (subject, body, to)
パラメータと解説
[レプリケーションエージェントオプション]ダイアログの[メール]タブで定義されたSMTP設定を使用して電子メールを送信します。
– sSubject = メール件名
– sMessageBody = メール本文
VB.NET
Public Shared Sub SendMail (sSubject As String, sMessageBody As String, sRcptTo As String)
例:
SendMail ("Message from Syniti DR",
"An error occurred that requires intervention by the system administrator.",
"somebody@company.com")
C#
public static void SendMail(string sSubject, string sMessageBody, string sRcptTo)
例:
SendMail("Message from Syniti DR",
"An error occurred that requires intervention by the system administrator.",
"somebody@company.com")
SendMail (sSubject, sMessageBody, sSMTPServer, sSMTPPort, sRcptFrom, sRcptTo, bAuthentication, sUser, sPassword, bUseSSL)
パラメータと解説
[レプリケーションエージェントオプション]ダイアログの[メール]タブで定義されたSMTP設指定されたSMTPサーバ等を使用し、メールを送信します。指定されていない場合にはレプリケーションエージェントオプションダイアログで指定されている設定が変わりに使用されます。
– sMessageBody = メール本文
– sSMTPServer = メール送信に使用するSMTPサーバ
– sSMTPPort = メール送信に使用するSMTPサーバのポート
– sRcptFrom = 送信者として使用するメールアドレス
– sRcptTo = 受信者のメールアドレス
– bAuthentication = 認証情報が必要な場合はTrue、不要な場合はFalseを指定
– sUser = bAuthenticationがTrueの場合、ユーザIDを指定
– sPassword = bAuthenticationがTrueの場合、パスワードを指定
– bUseSSL = Trueの場合、SSLを使用、それ以外はFalse
VB.NET
Public Shared Sub SendMail (sSubject As String, sMessageBody As String,
sSMTPServer As String, sRcptFrom As String, sRcptTo As String)
例:
SendMail ("Message from Syniti DR",
"An error occurred that requires intervention by the system administrator.",
"www.smtp.com", "DBMoto Notification Agent", "somebody@company.com")
C#
public static void SendMail(string sSubject, string sMessageBody, string sSMTPServer,
string sRcptFrom, string sRcptTo)
例:
SendMail("Message from Syniti DR",
"An error occurred that requires intervention by the system administrator.",
"www.smtp.com", "Syniti DR Notification Agent", "somebody@company.com")
GetRecordInfo(Record, enmRecordImage)
パラメータと解説
レコードに関する情報を含む文字列を返します。
– record = メッセージとして記録されるIRecordオブジェクト
– eRecordImage = 記録するレコード情報の種類をエミュレータenmRecordImageで指定、レコードの情報としてInsert操作に関してはValues Afterが、それ以外はValues Beforeが使用されます。パラメータ値としては1,2,4が使用できます。
1 = 主キー値 – 主キーとなるカラムの値のみ
2 = イメージ – レコードの全ての情報
4 = ログ情報 – トランザクションID、トランザクションタイムスタンプ
VB.NET
Public Shared Function GetRecordInfo (record As DBMotoPublic.IRecord, eRecordImage As enmRecordImage) As String
例:
Imports Microsoft.VisualBasic
Imports DBMotoPublic
Imports DBMotoScript
Imports DBRS.GlobalScript
Namespace DBRS
Public Class ReplicationScript : Inherits IReplicationScript
Public Overrides Sub Record_onAfterMapping(recSource As IRecord, recTarget As IRecord,
ByRef AbortRecord As Boolean)
Dim S as String = GetRecordInfo(recSource, enmRecordImage.KeyValues)
AddLog("The current record has been inserted: " + S, 0)
End Sub
End Class
End Namespace
C#
public static string GetRecordInfo(DBMotoPublic.IRecord record, enmRecordImage eRecordImage)
例:
using System;
using System.Data;
using DBMotoPublic;
using DBMotoScript;
namespace DBRS
{
public class ReplicationScript : IReplicationScript
{
public override void Record_onAfterMapping(DBMotoPublic.IRecord recSource,
DBMotoPublic.IRecord recTarget, ref bool AbortRecord)
{
string = GlobalScript.GetRecordInfo(recSource, enmRecordImage.KeyValues);
GlobalScript.AddLog("The current record has been inserted: " + s, 0);
}
}
}
GetJSONRecordInfo
パラメータと解説
この関数の4つのバリアントはすべて、汎用の構造化データまたは非構造化データをJSON列タイプにマッピングするときに役立つヘルパー関数です。
GetJSONRecordInfo(record,eRecordImage)
下記のようなJSONフォーマットの文字列をenmRecordImage のパラメータにしたがい、IRecord オブジェクトから返します。
{
"FIELD1" = "Value1",
"FIELD2" = "Value2",
"FIELD3" = "Value3"
}
GetJSONRecordInfo(args)
JSON形式の文字列を返します。オブジェクトの名前と値は、一般的なのリストから選択されます。
GetJSONRecordInfo(T value)
タイプTの特定のオブジェクトのJSON形式を返します。この関数は、渡された値が文字列値ではない場合(DateTime、GUIDなど)に使用できます。
GetJSONRecordInfo T(jsonString)
上記の関数の逆。JSON文字列形式の特定の値が与えられると、文字列を解析し、生成元の(T型の)オブジェクトを返します。
VB.NET
Public Shared Function GetJSONRecordInfo(Of T)(ByVal jsonString As String) As T
Public Shared Function GetJSONRecordInfo(ParamArray ByVal args() As Object) As String
Public Shared Function GetJSONRecordInfo(Of T)(ByVal value As T) As String
Public Shared Function GetJSONRecordInfo(Of T)(ByVal jsonString As String) As T
C#
public static string GetJSONRecordInfo(DBMotoPublic.IRecord record, enmRecordImage eRecordImage)
public static string GetJSONRecordInfo(params object[] args)
public static string GetJSONRecordInfo(T value)
public static T GetJSONRecordInfo(string jsonString)
GetReceiversInUse
パラメータと解説
Syniti DRの接続でレプリケーションがReceiversInfoオブジェクトとして使用しているレシーバーのリストを返します。
– ConnectionName = 使用中のレシーバーを取得するIBM Db2 for i接続の名前
– IsSource = ConnectionNameがソース接続を参照する場合はTrue、そうでない場合はFalse
– OnlyActiveReplications = Trueの場合、アクティブな(有効な)レプリケーションで使用されるレシーバーのみを取得し、無効なレプリケーションをスキップします。
この関数は、ReceiverInfo型の値を返します。クラスの定義は次のとおりです。
Public Class ReceiverInfo
Public JournalLibrary As String
Public JournalName As String
Public ReceiverLibrary As String
Public ReceiverName As String
End Class
VB.NET
Public Shared Function GetReceiversInUse (ConnectionName As String, IsSource As Boolean, OnlyActiveReplications As Boolean) As ReceiverInfo()
例:
Imports Microsoft.VisualBasic
Imports DBMotoPublic
Imports DBMotoScript
Imports DBRS.GlobalScript
Imports System.Data
Namespace DBRS
Public Class ReplicationScript : Inherits IReplicationScript
Public Overrides Sub LogReader_onBeforeMirroring(bSource as Boolean)
Dim arrReceivers As ReceiverInfo() = GetReceiversInUse ("AS400", True, True)
Dim recInfo As ReceiverInfo
For Each recInfo in arrReceivers
AddLog("Receiver in use: " + recInfo.JournalLibrary + "." + recInfo.JournalName +
"/" + recInfo.ReceiverLibrary + "." + recInfo.ReceiverName, 0)
Next
End Sub
End Class
End Namespace
C#
public static ReceiverInfo[] GetReceiversInUse(string ConnectionName, bool IsSource, bool OnlyActiveReplications)
例:
using System;
using System.Data;
using DBMotoPublic;
using DBMotoScript;
namespace DBRS
{
public class ReplicationScript : IReplicationScript
{
public override void LogReader_onBeforeMirroring(bool bSource)
{
ReceiverInfo[] arrReceivers = GlobalScript.GetReceiversInUse("AS400", true, true);
foreach (ReceiverInfo recInfo in arrReceivers)
{
GlobalScript.AddLog("Receiver in use: " + recInfo.JournalLibrary + "." + recInfo.JournalName
+ "/" + recInfo.ReceiverLibrary + "." + recInfo.ReceiverName, 0);
}
}
}
}
イベント
グローバルスクリプトのGlobalEventsクラスでグローバルイベントハンドラを定義します。各グローバルイベントには、関数が処理する内部イベントを指定する「GlobalEventsAttribute」という属性セクションが必要です。
GlobalEventsAttribute
イベント名とヘルプ文字列の2つのパラメーターを持つ属性。Record_OnExecuteErrorおよびReplication_OnErrorイベントのエラーハンドラーを定義するときは、この属性を常に宣言する必要があります。
パラメーター1:必須。イベント名を含む文字列。値は、処理されるイベントの名前と一致する必要があります。
パラメーター2:必須。イベントハンドラの説明またはヘルプメッセージを含む文字列。この文字列は現在Syniti DRで使用されていませんが、パラメーターが必要なので、少なくとも空の文字列 “”を提供する必要があります。
Record_OnExecuteError
解説
このイベントは、単一レコードの実行時にエラーが発生するたびに発生します。Writerのイベントとして、INSERT、DELETE、UPDATEなどのターゲット操作で発生します。操作が最初に失敗したときに、bRetryExecuteオプションを使用して、レコードで実行操作を再実行しようとします。たとえば、単一レコードの挿入がタイムアウトエラーで失敗した場合、bRetryExecuteをtrueに設定し、iSleepおよびiIterationパラメーターの値を設定すると、数ミリ秒後に操作が成功する可能性があります。レプリケーションイベントRecord_OnBeforeExecute は、このパラメーターを使用してレコード操作が何回再試行されても、一度だけ生成されることに注意してください。また、レプリケーションイベントRecord_OnAfterExecute レコード操作が成功した場合にのみ1回生成され、レコード操作が失敗した場合は生成されません。
GlobalEventsAttribute最初のパラメータは、イベント名「Record_OnExecuteError」を示す必要があります。
パラメータ
名前 | タイプ | 説明 |
sReplOrGroupName | String | 読み取り専用。イベントを生成したレプリケーションまたはグループ名 |
recTarget | IRecord | 読み取り専用。エラーが生成された対象レコードを表すオブジェクト。IRecordインターフェイスで使用可能なメソッドを使用して、レコード内の特定の情報にアクセスできます。 |
e | 例外 | 読み取り専用。このエラーのVB .NET例外オブジェクト。 |
bRecoverReplication | Boolean | デフォルトはFalseです。Trueに設定すると、レプリケーションは回復モードに設定されます。 |
bDisableReplication | Boolean | デフォルトはFalseです。Trueに設定されている場合、RetryExecuteの値に関係なく、レプリケーションはログ内のエラーメッセージの通知を終了し、レプリケーションを無効にします。 |
bRetryExecute | Boolean | デフォルト値はFalseです。Syniti DRログにエラーを記録する前にターゲットレコード操作を再試行する場合は、このパラメーターをTrueに設定します。たとえば、単一レコードの挿入がタイムアウトエラーで失敗した場合、bRetryExecuteをTrueに設定し、iSleepパラメーターの値を設定すると、数ミリ秒後に操作が成功する場合があります。例は、このパラメーターの使用方法を示しています。レプリケーションイベントRecord_OnBeforeExecute は、このパラメーターを使用してレコード操作が何回再試行されても、一度だけ生成されることに注意してください。また、レプリケーションイベントRecord_OnAfterExecute レコード操作が成功した場合にのみ1回生成され、レコード操作が失敗した場合は生成されません。 |
iSleep | Integer | bRetryExecuteがTrueに設定されている場合、操作を再試行する前にこのパラメーターを使用して遅延値を示します。値はミリ秒単位である必要があります。デフォルト値は0です。例では、このパラメーターの使用方法を示しています。 |
iIteration | Integer | 読み取り専用。bRetryExecuteパラメーターと組み合わせて使用します。iIterationは、ターゲットレコード操作が試行された回数を追跡します。開始値は0です。ターゲットレコード操作が初めて試行されると、この値は1に設定されます。イベントハンドラーは、bRetryExecuteがfalseに設定されるまで操作の再試行を続けます。例では、エラー時の無限ループを回避する方法を示しています。 |
VB.NET
Public Shared Sub MyErrorHandler (ByVal sReplOrGroupName As String,
ByVal recTarget As DBMotoPublic.IRecord,
ByVal e As Exception,
ByRef bRecoverReplication As Boolean,
ByRef bDisableReplication As Boolean,
ByRef bRetryExecute As Boolean,
ByRef iSleep As Integer,
ByVal iIteration As Integer)
※関数名MyErrorHandlerは変更可能です。
例:
Public Shared Sub MyErrorHandler (ByVal sReplOrGroupName As String,
ByVal recTarget As DBMotoPublic.IRecord,
ByVal e As Exception,
ByRef bRecoverReplication As Boolean,
ByRef bAbortRecord As Boolean,
ByRef bDisableReplication As Boolean,
ByRef bRetryExecute As Boolean,
ByRef iSleep As Integer,
ByVal iIteration As Integer)
Dim s As String
s = s + "-- Called MyErrorHandler to catch the error in replication or group '"
+ sReplOrGroupName + "'" + Environment.NewLine
s = s + "-- Exception: " + e.ToString() + Environment.NewLine
s = s + "-- Iteration: " + iIteration.ToString()
bRetryExecute = Falsehttps://www.climb.co.jp/blog_dbmoto/wp-admin/post-new.php?post_type=rtbs_tabs#
' Disable replication if the error is a SQL Server timeout error
If e.Message.IndexOf("System.Data.SqlClient.SqlException: Timeout expired.") = 0 Then
bAbortRecord = True
bDisableReplication = True
s = s + " - Replication disabled"
Else ' retry
If iIteration = 3 Then
bRetryExecute = False
s = s + " - No Retry"
Else
bRetryExecute = True
iSleep = 3000
s = s + " - Try Again after " + (iSleep/1000).ToString() + " seconds."
End If
End If
IGlobalScript.AddLog (s, 1)
End Sub
C#
[GlobalEventsAttribute("Record_OnExecuteError", "Define a general event for the event OnExecuteError")]
public static void MyErrorHandler(string sReplOrGroupName,
DBMotoPublic.IRecord recTarget,
Exception e,
ref bool bRecoverReplication,
ref bool bDisableReplication,
ref bool bRetryExecute,
ref int iSleep,
int iIteration)
例:
public class GlobalEvents : IGlobalEvents
{
[GlobalEventsAttribute("Record_OnExecuteError", "Define a general event for the event EventName")]
public static void MyErrorHandler(String sReplOrGroupName, DBMotoPublic.IRecord recTarget, Exception e,
ref bool bRecoverReplication, ref bool bAbortRecord, ref bool bDisableReplication,
sref Boolean bRetryExecute, ref int iSleep, int iIteration)
{
String s = null;
s = s + "-- Called MyErrorHandler to catch the error in replication or group '" + sReplOrGroupName + "'"
+ Environment.NewLine;
s = s + "-- Exception: " + e.ToString() + Environment.NewLine;
s = s + "-- Iteration: " + iIteration.ToString();
bRetryExecute = false;
// Disable replication if the error is a SQL Server timeout error
if (e.Message.IndexOf("System.Data.SqlClient.SqlException: Timeout expired.") = 0) {
bAbortRecord = true;
bDisableReplication = true;
s = s + " - Replication disabled";
}
else { // retry
if (iIteration >= 3) {
bRetryExecute = false;
s = s + " - No Retry";
}
else {
bRetryExecute = true;
iSleep = 3000;
s = s + " - Try Again after " + (iSleep / 1000).ToString() + "seconds.";
}
}
IGlobalScript.AddLog(s, 1);
}
Record_OnMappingError
解説
このイベントは、単一レコードのマッピングでエラーが発生するたびに発生します。Readerイベントとして、INSERT、DELETE、UPDATEなどのマッピング操作時にソースで発生します。 操作が最初に失敗したときに、bRetryExecuteオプションを使用して、レコードのマッピング操作を再実行できます。たとえば、単一のフィールドマップが構文エラーで失敗した場合、bRetryExecuteをtrueに設定すると、ユーザーがフィールドの値を変更して操作を繰り返すように構成することもできます。 レプリケーションイベントRecord_OnBeforeMappingは、このパラメーターを使用してレコード操作が何回再試行されても、一度だけ生成されることに注意してください。 また、レプリケーションイベントRecord_OnAfterMappingは、レコード操作が成功した場合にのみ1回生成され、レコード操作が失敗した場合はまったく生成されません。
GlobalEventsAttributeの一つめのパラメーターにイベント名「Record_OnMappingError」を示す必要があります。
パラメータ
名前 | タイプ | 説明 |
sReplOrGroupName | String | 読み取り専用。イベントを生成したレプリケーションまたはグループ名 |
recSource | IRecord | 読み取り専用。エラーが生成された対象のソースレコードを表すオブジェクト。IRecordインターフェイスで使用可能なメソッドを使用して、レコード内の特定の情報にアクセスできます |
recTarget | IRecord | 読み取り専用。エラーが生成された対象のターゲットレコードを表すオブジェクト。IRecordインターフェイスで使用可能なメソッドを使用して、レコード内の特定の情報にアクセスできます。 |
e | Exception | 読み取り専用。このエラーのVB .NET例外オブジェクト。 |
bAbort | Boolean | デフォルトはFalaseです。Trueに設定すると、現在のレコードはスキップされ、レプリケーションされません。 ログにエラーは出力されません。 |
bRecoverReplication | Boolean | デフォルトはFalseです。Trueに設定すると、レプリケーションはリカバリモードに設定されます。 |
bDisableReplication | Boolean | デフォルトはFalseです。Trueに設定されている場合、RetryExecuteの値に関係なく、レプリケーションはログ内のエラーメッセージの通知を終了し、レプリケーションを無効にします。 |
bRetryExecute | Boolean | デフォルト値はFalseです。Syniti DRログにエラーを記録する前にターゲットレコード操作を再試行する場合は、このパラメーターをTrueに設定します。たとえば、単一レコードの挿入がタイムアウトエラーで失敗した場合、bRetryExecuteをTrueに設定し、iSleepパラメーターの値を設定すると、数ミリ秒後に操作が成功する場合があります。例は、このパラメーターの使用方法を示しています。レプリケーションイベントRecord_OnBeforeExecute は、このパラメーターを使用してレコード操作が何回再試行されても、一度だけ生成されることに注意してください。また、レプリケーションイベントRecord_OnAfterExecute レコード操作が成功した場合にのみ1回生成され、レコード操作が失敗した場合は生成されません。 |
iSleep | Integer | bRetryExecuteがTrueに設定されている場合、操作を再試行する前にこのパラメーターを使用して遅延値を示します。値はミリ秒単位である必要があります。デフォルト値は0です。例では、このパラメーターの使用方法を示しています。 |
iIteration | Integer | 読み取り専用。bRetryExecuteパラメーターと組み合わせて使用します。iIterationは、ターゲットレコード操作が試行された回数を追跡します。開始値は0です。ターゲットレコード操作が初めて試行されると、この値は1に設定されます。イベントハンドラーは、bRetryExecuteがfalseに設定されるまで操作の再試行を続けます。例では、エラー時の無限ループを回避する方法を示しています。 |
VB.NET
Public Shared Sub MyErrorHandler (ByVal sReplOrGroupName As String,
ByVal recSource As DBMotoPublic.IRecord,
ByVal recTarget As DBMotoPublic.IRecord,
ByVal e As Exception,
ByRef bAbort As Boolean,
ByRef bRecoverReplication As Boolean,
ByRef bDisableReplication As Boolean,
ByRef bRetryExecute As Boolean,
ByRef iSleep As Integer,
ByVal iIteration As Integer
※関数名MyErrorHandlerは変更可能です。
例:
Public Shared Sub MyErrorHandler (ByVal sReplOrGroupName As String,
ByVal recSource As DBMotoPublic.IRecord,
ByVal recTarget As DBMotoPublic.IRecord,
ByVal e As Exception,
ByRef bAbort As Boolean,
ByRef bRecoverReplication As Boolean,
ByRef bAbortRecord As Boolean,
ByRef bDisableReplication As Boolean,
ByRef bRetryExecute As Boolean,
ByRef iSleep As Integer,
ByVal iIteration As Integer)
Dim s As String
s = s + "-- Called MyErrorHandler to catch the error in replication or group '"
+ sReplOrGroupName + "'" + Environment.NewLine
s = s + "-- Exception: " + e.ToString() + Environment.NewLine
s = s + "-- Iteration: " + iIteration.ToString()
bRetryExecute = False
' Disable replication if the error is a syntax error
If e.Message.Contains("Error applying the mapping for the target field") Then
bAbortRecord = True
bDisableReplication = True
s = s + " - Replication disabled"
Else ' retry
If iIteration = 3 Then
bRetryExecute = False
s = s + " - No Retry"
Else
bRetryExecute = True
iSleep = 3000
s = s + " - Try Again after " + (iSleep/1000).ToString() + " seconds."
End If
End If
IGlobalScript.AddLog (s, 1)
End Sub
C#
[GlobalEventsAttribute("Record_OnMappingError", "Define a general event for the event OnMappingError")]
public static void MyErrorHandler(string sReplOrGroupName,
DBMotoPublic.IRecord recSource,
DBMotoPublic.IRecord recTarget,
Exception e,
ref bool bAbort,
ref bool bRecoverReplication,
ref bool bDisableReplication,
ref bool bRetryExecute,
ref int iSleep,
int iIteration)
例:
public class GlobalEvents : IGlobalEvents
{
[GlobalEventsAttribute("Record_MappingError", "Define a general event for the event EventName")]
public static void MyErrorHandler(String sReplOrGroupName, DBMotoPublic.IRecord recSource, DBMotoPublic.IRecord recTarget, Exception e,
ref bool bAbort, ref bool bRecoverReplication, ref bool bAbortRecord, ref bool bDisableReplication,
sref Boolean bRetryExecute, ref int iSleep, int iIteration)
{
String s = null;
s = s + "-- Called MyErrorHandler to catch the error in replication or group '" + sReplOrGroupName + "'"
+ Environment.NewLine;
s = s + "-- Exception: " + e.ToString() + Environment.NewLine;
s = s + "-- Iteration: " + iIteration.ToString();
bRetryExecute = false;
// Disable replication if the error is a syntax error
if (e.Message.Contains("Error applying the mapping for the target field")) {
bAbortRecord = true;
bDisableReplication = true;
s = s + " - Replication disabled";
}
else { // retry
if (iIteration >= 3) {
bRetryExecute = false;
s = s + " - No Retry";
}
else {
bRetryExecute = true;
iSleep = 3000;
s = s + " - Try Again after " + (iSleep / 1000).ToString() + "seconds.";
}
}
IGlobalScript.AddLog(s, 1);
}
Replication_OnError
解説
このイベントは、レプリケーションでエラーが発生するたびに発生します。 レプリケーション操作の最後にエラーまたは警告アイコンとしてレプリケーションモニターに表示されるすべてのタイプのエラーは、このイベントを生成します。 このイベントは、エラーの発生時ではなく、リフレッシュの終了時またはミラーリング間隔の終了時に呼び出されます。
GlobalEventsAttributeの一つめのパラメーターは、イベント名「Replication_OnError」を示す必要があります。
パラメータ
名前 | タイプ | 説明 |
sReplOrGroupName | String | 読み取り専用。イベントを生成したレプリケーションまたはグループ名 |
sMessage | String | 読み取り専用。エラーメッセージ/例外のスタック |
bWillDisable | Boolean | 読み取り専用。エラー発生時にレプリケーションを無効にする場合はTrue |
eReplStatus | enmReplStatus | 読み取り専用。エミュレータ enmReplStatusを使用してイベントが呼び出されたときのレプリケーションステータスを指定します。エミュレータに指定できる値は次のとおりです。ErrorAndContinue レプリケーション中にエラーが発生(リフレッシュまたはミラーリング間隔)した場合にもレプリケーションは続行されます。例は、ターゲットテーブルでレコードが見つからなかったためにトランザクションがターゲットレコードの削除に失敗した場合、「Syniti DR」はログにエラーを報告し、次のレコードに進みます。Error エラーが生成され、レプリケーションの実行が停止します。 次の間隔でレプリケーションは再開されます。 このタイプのエラーの例は、ソースまたはターゲットデータベースへの接続が切断された場合に該当し、「Syniti DR」はレプリケーションを続行できず、リカバリモードになります。Success このイベントでは使用されません。 Replication_OnErrorが呼び出されると、レプリケーションは常にエラー状態になります。 |
VB.NET
Public Shared Sub MyErrorHandler (ByVal sReplOrGroupName As String, ByVal sMessage As String,
ByVal bWillDisable As Boolean, ByVal eReplStatus As enmReplStatus)
※関数名MyErrorHandlerは変更可能です。
例:
_
Public Shared Sub MyGlobalEvent (ByVal sReplicationName As String, ByVal sMessage As String,
ByVal bWillBeDisabled As Boolean, ByVal eReplStatus As enmReplStatus)
Dim s As String
s = DateTime.Now.ToString() + Environment.NewLine + Environment.NewLine
s = s + "Error in replication '" + sReplicationName + "'"
+ Environment.NewLine + Environment.NewLine
s = s + "Replication Status: " + eReplStatus.ToString() + Environment.NewLine
+ Environment.NewLine
s = s + sMessage + Environment.NewLine + Environment.NewLine
If bWillBeDisabled Then
s = s + "The replication will be disabled." + Environment.NewLine + Environment.NewLine
End If
s = s + "-----------------------------------------------------------------" + Environment.NewLine
s = s + " This is an automatic message generated by the Syniti DR script" + Environment.NewLine
s = s + "-----------------------------------------------------------------" + Environment.NewLine
IGlobalScript.SendMail ("Syniti DR Error", s)
End Sub
C#
[GlobalEventsAttribute("Replication_OnError", "Define a general event for the event Replication_OnError")]
public static void MyErrorHandler(string sReplOrGroupName, string sMessage,
bool bWillDisable, enmReplStatus eReplStatus)
例:
[GlobalEventsAttribute("Replication_OnError", "General event for the event OnError")]
public static void MyGlobalEvent(String sReplicationName, String sMessage, Boolean bWillBeDisabled,
enmReplStatus eReplStatus)
{
String s = null;
s = DateTime.Now.ToString() + Environment.NewLine + Environment.NewLine;
s = s + "Error in replication '" + sReplicationName + "'"
+ Environment.NewLine + Environment.NewLine;
s = s + "Replication Status: " + eReplStatus.ToString() + Environment.NewLine
+ Environment.NewLine;
s = s + sMessage + Environment.NewLine + Environment.NewLine;
if (bWillBeDisabled)
{
s = s + "The replication will be disabled." + Environment.NewLine + Environment.NewLine;
}
s = s + "---------------------------------------------" + Environment.NewLine;
s = s + " This automatic message is generated by the Syniti DR script" + Environment.NewLine;
s = s + "---------------------------------------------" + Environment.NewLine;
IGlobalScript.SendMail("Syniti DR Error", s);
}
ReplicationManager_onStart
パラメータと解説
このイベントは、レプリケーションエージェントの起動時に発生します。 Syniti DRログに通知メッセージを追加したり、管理者に電子メールを送信したりするために使用できます。 イベントのハンドラーを作成するには、クラスヘッダー「Public Class GlobalEvents:Inherits IGlobalEvents」内にカーソルを置き、例をガイドラインとして使用してハンドラーを定義します。
GlobalEventsAttributeの一つ目のパラメーターは、イベント名「ReplicationManager_OnStart」を示す必要があります。
このイベントにパラメータはありません。
VB.NET
_
Public Shared Sub OnStart ()
例:
_
Public Shared Sub OnStart ()
Dim s As String
s = s + "-- Message from Syniti DR - START"
s = s + "-----------------------------------------------------------------"
+ Environment.NewLine
s = s + "- This is an automatic message generated by the Syniti DR
script -" + Environment.NewLine
s = s + "-----------------------------------------------------------------"
+ Environment.NewLine IGlobalScript.SendMail
("Replication Manager Message", s)
End Sub
C#
[GlobalEventsAttribute("ReplicationManager_OnStart", "Standard event for the event OnStart")]
public static void OnStart()
例:
[GlobalEventsAttribute("ReplicationManager_OnStart", "Standard event for the event OnStart")]
public static void OnStart()
{
String s = null;
s = s + "-- Message from Syniti DR - START";
s = s + "-------------------------------------------------------" + Environment.NewLine;
s = s + "- This is an automatic message generated by the Syniti DR script -" + Environment.NewLine;
s = s + "-------------------------------------------------------" + Environment.NewLine;
IGlobalScript.SendMail("Replication Manager Message", s);
}
ReplicationManager_onStop
パラメータと解説
このイベントは、レプリケーションエージェントが停止したときに発生します。 Syniti DRログに通知メッセージを追加したり、管理者に電子メールを送信したりするために使用できます。 イベントのハンドラーを作成するには、クラスヘッダー「Public Class GlobalEvents:Inherits IGlobalEvents」内にカーソルを置き、以下の例をガイドラインとして使用してハンドラーを定義します。
GlobalEventsAttributeの最初のパラメーターは、イベント名「ReplicationManager_OnStop」を示す必要があります。
パラメータはありません。
VB.NET
_
Public Shared Sub OnStop ()
例:
Public Shared Sub OnStop ()
Dim s As String
s = s + "-- Message from Syniti DR - STOP"
s = s + "---------------------------------------------------------" + Environment.NewLine
s = s + "This is an automatic message generated by the Syniti DR script -" + Environment.NewLine
s = s + "--------------------------------------------------------"
+ Environment.NewLine
IGlobalScript.SendMail ("Replication Manager Message", s)
End Sub
C#
[GlobalEventsAttribute("ReplicationManager_OnStop", "Standard event for the event OnStop")]
public static void OnStop()
例:
[GlobalEventsAttribute("ReplicationManager_OnStop", "Standard event for the event OnStop")]
public static void OnStop()
{
String s = null;
s = s + "-- Message from Syniti DR - STOP";
s = s + "--------------------------------------------------------" + Environment.NewLine;
s = s + "- This is an automatic message generated by the Syniti DR script -" + Environment.NewLine;
s = s + "---------------------------------------------------------" + Environment.NewLine;
IGlobalScript.SendMail("Replication Manager Message", s);
}
関連したトピックス
- Syniti Data Replication (旧DBMoto)でのスクリプトの書き方②:グローバルスクリプト
- 2つのソーステーブルからターゲットの一つのレコードにレプリケーション
- Syniti Data Replication (旧DBMoto)でのスクリプトの書き方⑤:フィールドマッピング関数の書き方
- ミラーリングおいてのレコード数を確認の方法【リアルタイムレプリケーションツールDBMoto】
- レプリケーションの際にnullを特定の値に変換する方法 その2【リアルタイムレプリケーションツールDBMoto】
- [Syniti(DBMoto)][スクリプト] 特定カラムの値が変更となった場合、ターゲットのレコードを削除するサンプルスクリプト
- [DBMoto]「未マッピング使用」機能によるマッピング外のデータを活用したレプリケーション
- [DBMoto]関数を使用してレプリケーション時のデータを変換する方法(VB/C#言語選択、関数適用、ユーザ関数作成、置換関数、一括設定手順)
- [DBMoto][スクリプト]条件付きレプリケーションを行うサンプルVBスクリプト
- ・レプリケーションの所要時間を計測する手法【リアルタイムレプリケーションツールDBMoto】