How to enable and disable editor tracking


Summary
This topic discusses how to enable and disable editor tracking for a dataset. Editor tracking allows you to log information about editors in fields in the feature class or table that is being edited. You can record information about who created a feature or record, who last edited a feature or record, as well as when these edits were made.


Enabling editor tracking

Enable editor tracking on a dataset by setting at least one of the IClassSchemaEdit4 field properties to the name of an existing field.
The following code example enables editor tracking for a feature class or table by setting the following four field properties:
  • CreatorFieldName
  • CreatedAtFieldName
  • EditorFieldName
  • EditedAtFieldName
[C#]
private static void EnableEditorTracking(IDataset dataset, String sCreatorField,
    String sCreatedField, String sEditorField, String sEditedField, Boolean
    isTimeUTC)
{
    //Get the fields collection.
    IFields fields = null;
    if (dataset.Type == esriDatasetType.esriDTFeatureClass)
    {
        IFeatureClass featureClass = (IFeatureClass)dataset;
        fields = featureClass.Fields;
    }
    else
    {
        ITable table = (ITable)dataset;
        fields = table.Fields;
    }

    //Get the individual fields.
    int fieldIndex = fields.FindField(sCreatorField);
    IField creatorField = fields.get_Field(fieldIndex);
    fieldIndex = fields.FindField(sCreatedField);
    IField createdField = fields.get_Field(fieldIndex);
    fieldIndex = fields.FindField(sEditorField);
    IField editorField = fields.get_Field(fieldIndex);
    fieldIndex = fields.FindField(sEditedField);
    IField editedField = fields.get_Field(fieldIndex);

    //Enable editor tracking.
    IObjectClass oc = (IObjectClass)dataset;
    IClassSchemaEdit4 se4 = (IClassSchemaEdit4)oc;
    se4.CreatorFieldName = creatorField.Name;
    se4.CreatedAtFieldName = createdField.Name;
    se4.EditorFieldName = editorField.Name;
    se4.EditedAtFieldName = editedField.Name;
    se4.IsTimeInUTC = isTimeUTC;
}
[VB.NET]
Public Sub EnableEditorTracking(dataset As IDataset, sCreatorField As [String], sCreatedField As [String], sEditorField As [String], sEditedField As [String], isTimeUTC As [Boolean])
    'Get the fields collection.
    Dim fields As IFields = Nothing
    If dataset.Type = esriDatasetType.esriDTFeatureClass Then
        Dim featureClass As IFeatureClass = DirectCast(dataset, IFeatureClass)
        fields = featureClass.Fields
    Else
        Dim table As ITable = DirectCast(dataset, ITable)
        fields = table.Fields
    End If
    
    'Get the individual fields.
    Dim fieldIndex As Integer = fields.FindField(sCreatorField)
    Dim creatorField As IField = fields.get_Field(fieldIndex)
    fieldIndex = fields.FindField(sCreatedField)
    Dim createdField As IField = fields.get_Field(fieldIndex)
    fieldIndex = fields.FindField(sEditorField)
    Dim editorField As IField = fields.get_Field(fieldIndex)
    fieldIndex = fields.FindField(sEditedField)
    Dim editedField As IField = fields.get_Field(fieldIndex)
    
    'Enable editor tracking.
    Dim oc As IObjectClass = DirectCast(dataset, IObjectClass)
    Dim se4 As IClassSchemaEdit4 = DirectCast(oc, IClassSchemaEdit4)
    se4.CreatorFieldName = creatorField.Name
    se4.CreatedAtFieldName = createdField.Name
    se4.EditorFieldName = editorField.Name
    se4.EditedAtFieldName = editedField.Name
    se4.IsTimeInUTC = isTimeUTC
End Sub

Setting a realm

If your data resides in an ArcSDE geodatabase and you connect through database authentication, you can choose to append a realm (for example, @esri.com) to the name of the user who makes the edit. For example, if you have a user named John in your Denver office and a user named John in your Seattle office, you can track their edits as John@denver and John@seattle, respectively, so that you can be certain which John made each edit.
To set the realm for an ArcSDE geodatabase, you must have administrator privileges on the database. Set the realm by setting IDatabaseConnectionInfo4.Realm to a string.
The following code example can be used to get a default realm for a workspace and set it as the realm:
[C#]
private static Boolean SetRealm(IWorkspace workspace)
{
    IDatabaseConnectionInfo4 dbConnectionInfo = workspace as
        IDatabaseConnectionInfo4;
    if (dbConnectionInfo != null)
    {
        string sRealm = string.Empty;
        sRealm = GetDefaultRealm(workspace);
        dbConnectionInfo.Realm = sRealm;
        if (dbConnectionInfo.Realm == string.Empty || dbConnectionInfo.Realm !=
            sRealm)
        {
            return false;
        }
        return true;
    }
    else
    {
        return false;
    }
}

private static String GetDefaultRealm(IWorkspace workspace)
{
    IDatabaseConnectionInfo4 dbConnectionInfo = workspace as
        IDatabaseConnectionInfo4;
    if (dbConnectionInfo != null)
    {
        return dbConnectionInfo.GenerateDefaultRealm().ToString();
    }
    else
    {
        return string.Empty;
    }
}
[VB.NET]
Private Shared Function SetRealm(workspace As IWorkspace) As [Boolean]
Dim dbConnectionInfo As IDatabaseConnectionInfo4 = TryCast(workspace, IDatabaseConnectionInfo4)
If dbConnectionInfo IsNot Nothing Then
    Dim sRealm As String = String.Empty
    sRealm = GetDefaultRealm(workspace)
    dbConnectionInfo.Realm = sRealm
    If dbConnectionInfo.Realm = String.Empty OrElse dbConnectionInfo.Realm <> sRealm Then
        Return False
    End If
    Return True
Else
    Return False
End If
End Function

Private Shared Function GetDefaultRealm(workspace As IWorkspace) As [String]
Dim dbConnectionInfo As IDatabaseConnectionInfo4 = TryCast(workspace, IDatabaseConnectionInfo4)
If dbConnectionInfo IsNot Nothing Then
    Return dbConnectionInfo.GenerateDefaultRealm().ToString()
Else
    Return String.Empty
End If
End Function

Disabling editor tracking

Disable editor tracking by setting each of the IClassSchemaEdit4 field properties to an empty string, as shown in the following code example:
[C#]
private static void DisableEditorTracking(IDataset dataset)
{
    //Disable editor tracking.
    IObjectClass oc = (IObjectClass)dataset;
    IClassSchemaEdit4 se4 = (IClassSchemaEdit4)oc;
    se4.CreatorFieldName = string.Empty;
    se4.CreatedAtFieldName = string.Empty;
    se4.EditorFieldName = string.Empty;
    se4.EditedAtFieldName = string.Empty;
}
[VB.NET]
Private Shared Sub DisableEditorTracking(dataset As IDataset)
'Disable editor tracking.
Dim oc As IObjectClass = DirectCast(dataset, IObjectClass)
Dim se4 As IClassSchemaEdit4 = DirectCast(oc, IClassSchemaEdit4)
se4.CreatorFieldName = String.Empty
se4.CreatedAtFieldName = String.Empty
se4.EditorFieldName = String.Empty
se4.EditedAtFieldName = String.Empty
End Sub