If your data quality is poor, then yes you have to fix it for the flow to work. There are workarounds you can implement, but ultimately, any workaround will make your data quality worse, not better, and simply exacerbate the problem.
The least invasive modification to your flow/validations would be to add a checkbox on
Opportunity, and set the checkbox to true for each record whose owner you wish to change. Then you have to modify each
Validation Rule that is giving you trouble to ignore records with this flag set. And finally, you should add a
Workflow Rule or additional flow that un-checks this checkbox every time it gets checked, so that future validations still work.
This rigamarole is probably more work (and will cause more technical debt) than just fixing the data.
If you cannot get your data to a clean state, you should instead use an
Apex Trigger on
Account to at least handle the errors gracefully. Graceful error handling is still a huge advantage of
Apex Trigger implementations over
Process Builder. It would be something like:
trigger Account on Account (after update)
// obviously still follow One Trigger Per Object
// and implement a Trigger Handler pattern
List<Account> ownerChanged = new List<Account>();
for (Account record : trigger.new)
if (record.OwnerId != oldMap.get(record.Id).OwnerId)
List<Opportunity> children = [/*query*/];
// set new field values
catch (DmlException dmx)
for (Integer i = 0; i < dmx.getNumDml(); i++)
Opportunity child = children[dmx.getDmlIndex(i)];