Trigger.isExecuting以外に何かがあるとは思いません。これは、既にトリガーコンテキストにいるのか、Visualforce、APIから来ているのか、匿名で実行しているのかを示すだけです。
考えられる解決策の1つは、最新の更新の元を保持するカスタムフィールドを作成することです。これを使用して、トリガー内のロジックを適切にルーティングし、最後の更新が外部システムからのものであるときに呼び出されないようにすることができます。さらに、Trigger.oldとtrigger.newのすべてのフィールドをループして、変更されたフィールドを確認できます。このようにして、レコードで実際に興味深いものが何も変更されていない場合に、外部システムへの不要な同期を回避できます(SystemTimeStamp、LastModifiedDateなど)。これを行う方法のサンプルを次に示します。
trigger ContactDescribeExample on Contact (before update)
{
// Get describe fields to evaluate old and new triggers with
Map<String, Schema.SObjectField> fldObjMap = Schema.SObjectType.Contact.fields.getMap();
List<Schema.SObjectField> fldObjMapValues = fldObjMap.values();
// Flag to determine if field(s) other than FirstName caused this change (FirstName is just an example)
Boolean hasOtherChange = false;
// Loop through trigger batch
for(Contact c : Trigger.new)
{
for(Schema.SObjectField s : fldObjMapValues)
{
String fldName = s.getDescribe().getName();
// Filter out fields we're not interested in
if(fldName != 'FirstName' && fldName != 'LastModifiedDate' && fldName != 'LastModifiedById' && fldName != 'SystemModstamp')
{
// Check to see if old and new are different
if(c.get(fldName) != Trigger.oldMap.get(c.Id).get(fldName))
hasOtherChange = true;
}
}
}
}