Проблема здесь в том, как все записывается в таблицу EmailChanges. Для этих записей я бы предположил, что транзакции были реализованы следующим образом:
- Электронная почта удалена, строка обновлена
- Новая электронная почта добавлена, строка обновлена.
Теперь я должен сделать некоторые предположения, чтобы понять это. Я должен предположить, что электронные письма хранятся в отдельной таблице, с одной строкой для каждого электронного письма, и для исторических целей вы помечаете старый адрес электронной почты как удаленный (вместо того, чтобы фактически удалить запись электронной почты), когда вы меняете адрес электронной почты,затем немедленно добавив новый адрес электронной почты. Это хороший шаблон, позволяющий отслеживать адреса электронной почты и изменения адресов для клиентов.
Однако, если ведение журнала выполняется с помощью триггера, этот шаблон возникает, поскольку были выполнены две отдельные операции. ,(Если эта регистрация ведется программно, измените способ регистрации обновлений программы.)
Как я уже говорил, я делаю предположения, но они являются разумными предположениями для ситуации, описанной выше. Чтобы вместо этого превратить их в ОБНОВЛЕНИЕ, у вас есть несколько разных методов, но ни один из них не обязательно правильно запишет обновление - кроме одного. Метод, который я бы использовал, состоял бы в том, чтобы создать триггер INSTEAD OF для ОБНОВЛЕНИЯ до адреса электронной почты. В рамках одной транзакции это пометит старый адрес электронной почты как УДАЛЕНО, добавит новую запись адреса электронной почты и зарегистрирует транзакцию UPDATE в таблице. Затем вместо двух отдельных вызовов для обновления адреса электронной почты (UPDATE ... SET Deleted, INSERT) ваш код выполняет одно действие (UPDATE), а затем триггер INSTEAD OF обрабатывает детали.