Remove duplicate records
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
‎10-01-2024 07:39 AM
Hi experts,
We identified more than 100 duplicate active department records. We have the list of active records from workday.
Now I need an approach to remove duplicates from servicenow ( these records might be referenced in any user record or other tables) and keep the records as per workday.
Please suggest me an approach for this.
TIA
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
‎10-01-2024 07:44 AM - edited ‎10-01-2024 07:48 AM
Hi @si21
If it's necessary to address this in the higher instance as well, I would kindly suggest creating a FIX script to remove duplicates in both the higher and lower instances.
Script to delete mulitiple records
var gr = new GlideRecord('depertment');
gr.addEncodedQuery(' '); -> query you used to identify the duplicates
gr.query();
gr.deleteMultiple();
Please mark this response as Correct and Helpful if it helps you can mark more that one reply as accepted solution
Thanks
Esh
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
‎10-01-2024 08:38 AM
Hi @si21 ,
Please refer below code to achieve your requirement:
// Replace 'your_table_name' with the actual name of your table var tableName = 'u_dummy_table'; var fieldName = 'u_name'; // Replace 'u_name' with the field containing the duplicate value // Create a GlideRecord object for the table var gr = new GlideRecord(tableName); // Query for records with duplicate 'u_name' values gr.addEncodedQuery(fieldName + 'ISNOTEMPTY'); gr.addAggregate('COUNT', fieldName); gr.groupBy(fieldName); gr.addHaving('COUNT', '>', 1); gr.query(); // Loop through the duplicate records and delete the latest ones while keeping the oldest one while (gr.next()) { var duplicateName = gr.getValue(fieldName); // Create another GlideRecord to find the oldest record among the duplicates var grDuplicate = new GlideRecord(tableName); grDuplicate.addQuery(fieldName, duplicateName); grDuplicate.orderByDesc('sys_updated_on'); // Assuming you have a 'sys_created_on' field to determine the oldest record grDuplicate.query(); // Skip the first (oldest) record and delete the rest if (grDuplicate.next()) { grDuplicate.next(); // Move to the second record (the latest one) gs.print(gr.u_number + ' : :Deleting record with ' + fieldName + ': ' + grDuplicate.getValue(fieldName)); grDuplicate.deleteRecord(); } } // Display a message indicating the script has finished gs.print('Duplicate records cleanup completed!');
You can use the code in a ServiceNow Script Include, Business Rule, Fix script, or a Scripted REST API. Remember to test it in a non-production instance and have a data backup before running it on the production environment. Exercise caution when deleting records permanently.
Note: You can recover mistakenly deleted records from sys_rollback_context table in ServiceNow.
If this helped you in any way, please hit the like button/mark it helpful. So it will help others to get the correct solution.
Thanks & Regards,
Sumanth meda