Используете ли вы OpportunityContactRole (стандартный связанный список в разделе возможностей, но, возможно, его нужно включить в настройке) или у вас есть 1 или более пользовательских поисков из Opportunity to Contact? Что должно произойти «после обновления»?
Что-то подобное должно повернуть вас в правильном направлении. Я не гарантирую, что он скомпилируется, если вы застряли, отредактируйте вопрос. Это будет всего 1 запрос, а не в al oop (массово-безопасный). Если вы действительно хотите go с лучшими практиками - следующим шагом будет использование некоторой структуры обработчика триггеров.
trigger OpportunityTrigger on Opportunity (after insert) {
Set<Id> accountIds = new Set<Id>();
for(Opportunity o : trigger.new){
accountIds.add(o.AccountId);
}
accountIds.remove(null);
if(!accountIds.isEmpty()){
Map<Id, Account> accounts = new Map<Id, Account>([
SELECT Id,
(SELECT Id FROM Contacts WHERE Key_Contact__c = true)
FROM Account
WHERE Id IN :accountIds
]);
List<OpportunityContactRole> roles = new List<OpportunityContactRole>();
for(Opportunity o : trigger.new){
Account a = accounts.get(o.AccountId);
if(a != null && !a.Contacts.isEmpty()){
for(Contact c : a.Contacts){
roles.add(new OpportunityContactRole(
OpportunityId = o.Id,
ContactId = c.Id,
Role = 'Decision Maker'
));
}
}
}
insert roles;
}
}