You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
A Python script I wrote to remove Esri default editor tracking fields from a geodatabase.
It could probably use some error handling and cleanup, but it works as-is.
### RemoveEditorTrackingFields.py
### Andrew L. Wunderlich
### andrew.wunderlich@tn.gov
### 7/18/2022
### 5/31/2023 Disables editor tracking if enabled to make field deletion possible
### 2/27/2023 Ported to ArcGIS Pro toolbox
### Removes the editor tracking fields from all classes
### within the user-specified database (if they exist).
### NOTES:
### Editor tracking fields can only be removed if they
### are DISABLED at the database level. This script DISABLES
### Editor Tracking and then deletes the fields.
###
### Searches for the Esri default editor tracking field names.
### If your database uses custom names, edit the field names below
### When adding to a toolbox:
### GENERAL:
### Name: RemoveEditorTrackingFields
### Label: Remove Editor Tracking Fields
### Description: Removes editor tracking fields from the specified geodatabase.
### If editor tracking is enabled, it will be disabled so that fields can be deleted.
### WARNING! This tool modifies the input database. ALWAYS back up your data before using this tool!
### SOURCE:
### Script File: point to this file
### PARAMETERS:
### "Input database" as a Workspace
import arcpy, sys, os.path
import GeMS_utilityFunctions as guf
### Set up workspace
### Use sys.argv[1] when running script from toolbox
#ws = r"c:\temp\testing\input.gdb"
arcpy.env.workspace = sys.argv[1]
ws = arcpy.env.workspace
list_Tables = arcpy.ListTables()
list_FeatureClasses = arcpy.ListFeatureClasses("*", "All", "")
list_Datasets = arcpy.ListDatasets(feature_type='feature')
### Create an empty list that will be populated with field names
fieldNameList = []
### Checks for stand-alone tables
for tb in list_Tables:
#guf.addMsgAndPrint( 'Workspace and table: ' + ws + '\\' + tb)
guf.addMsgAndPrint( 'Checking table ' + tb + ' for editor tracking fields...')
table = ws + '\\' + tb
### Describe the table to check if editor tracking is enabled
desc = arcpy.Describe(table)
if not desc.editorTrackingEnabled:
for f in arcpy.ListFields(tb):
if not f.required:
#guf.addMsgAndPrint( ' Non-required field name: ' + f.name)
if (f.name == 'created_user' or f.name == 'created_date' or f.name == 'last_edited_user' or f.name == 'last_edited_date'):
#guf.addMsgAndPrint( ' Field ' + f.name + ' will be deleted from table ' + tb + '...' )
fieldNameList.append(f.name)
#else: #FOR DEBUG
#guf.addMsgAndPrint( ' Skipping ' + tb + ' ' + f.name )
if not fieldNameList == []:
strListOfFields = ', '.join(str(x) for x in fieldNameList)
guf.addMsgAndPrint( ' Deleting ' + strListOfFields + ' from ' + tb + '...' )
arcpy.DeleteField_management(table, fieldNameList)
else:
guf.addMsgAndPrint( ' No editor tracking fields to delete from ' + tb + '...' )
fieldNameList = []
else:
### Editor Tracking IS enabled, disable it before attempting to delete fields
arcpy.DisableEditorTracking_management(tb,"DISABLE_CREATOR","DISABLE_CREATION_DATE","DISABLE_LAST_EDITOR","DISABLE_LAST_EDIT_DATE")
guf.addMsgAndPrint( ' NOTE: Editor tracking has been DISABLED in table ' + tb + '; tracking fields can now be deleted...')
for f in arcpy.ListFields(tb):
if not f.required:
#guf.addMsgAndPrint( ' Non-required field name: ' + f.name)
if (f.name == 'created_user' or f.name == 'created_date' or f.name == 'last_edited_user' or f.name == 'last_edited_date'):
#guf.addMsgAndPrint( ' Field ' + f.name + ' will be deleted from table ' + tb + '...' )
fieldNameList.append(f.name)
#else: #FOR DEBUG
#guf.addMsgAndPrint( ' Skipping ' + tb + ' ' + f.name )
if not fieldNameList == []:
strListOfFields = ', '.join(str(x) for x in fieldNameList)
guf.addMsgAndPrint( ' Deleting ' + strListOfFields + ' from ' + tb + '...' )
arcpy.DeleteField_management(table, fieldNameList)
else:
guf.addMsgAndPrint( ' No editor tracking fields to delete from ' + tb + '...' )
fieldNameList = []
### Checks for stand-alone feature classes
for fc in list_FeatureClasses:
#guf.addMsgAndPrint( 'Workspace and feature class: ' + ws + '\\' + fc)
guf.addMsgAndPrint( 'Checking stand-alone feature class ' + fc + ' for editor tracking fields...')
featureClass = ws + '\\' + fc
### Describe the feature class to check if editor tracking is enabled
desc = arcpy.Describe(featureClass)
if not desc.editorTrackingEnabled:
for f in arcpy.ListFields(fc):
#guf.addMsgAndPrint( ' Non-required field name: ' + f.name)
if (f.name == 'created_user' or f.name == 'created_date' or f.name == 'last_edited_user' or f.name == 'last_edited_date'):
#guf.addMsgAndPrint( ' Field ' + f.name + ' will be deleted from stand-alone fc ' + fc + '...' )
fieldNameList.append(f.name)
#else:
#guf.addMsgAndPrint( ' Skipping ' + fc + ' ' + f.name )
if not fieldNameList == []:
strListOfFields = ', '.join(str(x) for x in fieldNameList)
guf.addMsgAndPrint( ' Deleting ' + strListOfFields + ' from ' + fc + '...' )
arcpy.DeleteField_management(featureClass, fieldNameList)
else:
guf.addMsgAndPrint( ' No editor tracking fields to delete from ' + fc + '...' )
fieldNameList = []
else:
### Editor Tracking IS enabled, disable it before attempting to delete fields
arcpy.DisableEditorTracking_management(fc,"DISABLE_CREATOR","DISABLE_CREATION_DATE","DISABLE_LAST_EDITOR","DISABLE_LAST_EDIT_DATE")
guf.addMsgAndPrint( ' NOTE: Editor tracking has been DISABLED in feature class ' + fc + '; tracking fields can now be deleted...')
for f in arcpy.ListFields(fc):
#guf.addMsgAndPrint( ' Non-required field name: ' + f.name)
if (f.name == 'created_user' or f.name == 'created_date' or f.name == 'last_edited_user' or f.name == 'last_edited_date'):
#guf.addMsgAndPrint( ' Field ' + f.name + ' will be deleted from stand-alone fc ' + fc + '...' )
fieldNameList.append(f.name)
#else:
#guf.addMsgAndPrint( ' Skipping ' + fc + ' ' + f.name )
if not fieldNameList == []:
strListOfFields = ', '.join(str(x) for x in fieldNameList)
guf.addMsgAndPrint( ' Deleting ' + strListOfFields + ' from ' + fc + '...' )
arcpy.DeleteField_management(featureClass, fieldNameList)
else:
guf.addMsgAndPrint( ' No editor tracking fields to delete from ' + fc + '...' )
fieldNameList = []
### Checks for feature classes within feature datasets
for ds in list_Datasets:
for fc in arcpy.ListFeatureClasses(feature_dataset=ds):
#guf.addMsgAndPrint( 'Workspace and feature class: ' + ws + '\\' + fc)
guf.addMsgAndPrint( 'Checking feature class ' + fc + ' for editor tracking fields...')
featureClass = ws + '\\' + fc
### Describe the feature class to check if editor tracking is enabled
desc = arcpy.Describe(featureClass)
if not desc.editorTrackingEnabled:
for f in arcpy.ListFields(fc):
#guf.addMsgAndPrint( ' Non-required field name: ' + f.name)
if (f.name == 'created_user' or f.name == 'created_date' or f.name == 'last_edited_user' or f.name == 'last_edited_date'):
#guf.addMsgAndPrint( ' Field ' + f.name + ' will be deleted from fc ' + fc + '...' )
fieldNameList.append(f.name)
#else:
#guf.addMsgAndPrint( ' Skipping ' + fc + ' ' + f.name )
if not fieldNameList == []:
strListOfFields = ', '.join(str(x) for x in fieldNameList)
guf.addMsgAndPrint( ' Deleting ' + strListOfFields + ' from ' + fc + '...' )
arcpy.DeleteField_management(featureClass, fieldNameList)
else:
guf.addMsgAndPrint( ' No editor tracking fields to delete from ' + fc + '...' )
fieldNameList = []
else:
### Editor Tracking IS enabled, disable it before attempting to delete fields
arcpy.DisableEditorTracking_management(fc,"DISABLE_CREATOR","DISABLE_CREATION_DATE","DISABLE_LAST_EDITOR","DISABLE_LAST_EDIT_DATE")
guf.addMsgAndPrint( ' NOTE: Editor tracking has been DISABLED in feature class ' + fc + '; tracking fields can now be deleted...')
for f in arcpy.ListFields(fc):
#guf.addMsgAndPrint( ' Non-required field name: ' + f.name)
if (f.name == 'created_user' or f.name == 'created_date' or f.name == 'last_edited_user' or f.name == 'last_edited_date'):
#guf.addMsgAndPrint( ' Field ' + f.name + ' will be deleted from fc ' + fc + '...' )
fieldNameList.append(f.name)
#else:
#guf.addMsgAndPrint( ' Skipping ' + fc + ' ' + f.name )
if not fieldNameList == []:
strListOfFields = ', '.join(str(x) for x in fieldNameList)
guf.addMsgAndPrint( ' Deleting ' + strListOfFields + ' from ' + fc + '...' )
arcpy.DeleteField_management(featureClass, fieldNameList)
else:
guf.addMsgAndPrint( ' No editor tracking fields to delete from ' + fc + '...' )
fieldNameList = []
This discussion was converted from issue #53 on June 05, 2023 21:01.
Heading
Bold
Italic
Quote
Code
Link
Numbered list
Unordered list
Task list
Attach files
Mention
Reference
Menu
reacted with thumbs up emoji reacted with thumbs down emoji reacted with laugh emoji reacted with hooray emoji reacted with confused emoji reacted with heart emoji reacted with rocket emoji reacted with eyes emoji
-
A Python script I wrote to remove Esri default editor tracking fields from a geodatabase.
It could probably use some error handling and cleanup, but it works as-is.
Beta Was this translation helpful? Give feedback.
All reactions