Как снизить вероятность возникновения ошибок связанных с внешними ключами?

Добрый день, у меня процессы массово добавляют или изменяют записи в системе, но бывает происходит так что выходят ошибки связанные с внешними ключами

Есть ли какой то способ свести возникновение таких ошибок к минимуму?

Нравится

6 комментариев

Дмитрий, нужно подробно анализировать по каждому отдельному случаю, ведь они свидетельствуют, что что-то в логике не учли и либо идёт попытка добавления записи с одним Id несколько раз из одного или разных мест, либо подставляется неправильный Id для внешнего ключа справочного поля.

Зверев Александр,

 т.е если я редактирую запись и оно заполнено значением  , которое я подставляю . то может возникнут такая ошибка

Т.е к примеру у нас в поле есть контрагент А и я на вебсервисе заполняю код тоже контрагентом А

А обходить это стоит проверкой на соответствие  полей по типу A != A или проверкой на null?



А как быть если ошибка возникает при добавлении записи, т.е это может свидетельстовать о том. что поле при создании уже заполнено по умолчанию?

Не совсем понял, что Вы делаете. При редактировании записи ошибка со внешними ключами может быть, если в справочное поле пишут Id несуществующей в справочнике записи. При добавлении, помимо этого, ошибка, если пытаются вставить две записи с одинаковым Id. Это не зависит, осуществляется ли вставка в клиентской логике, серверной, в БП или по интеграции. В итоге всё равно это всё превращается в SQL-запросы к базе.

Ошибки со внешними ключами могут быть только в одном случае. В колонку сохраняется Id объекта не того, на который смотрит колонка. Например в есть колонка справочного типа Контрагент, а пытается подставиться идентификатор контакта или заказа.

Чтобы такого не было нужно при создании логики (JS, C#, БП) внимательно следить за такими случаями, и не устанавливать какие-попало значения в колонки.

Так же один из самых частых случаев - это когда пытаются установить пустой идентификатор в значение колонки. Важно помнить, что Guid.Empty и null - это разные вещи. Поэтому перед установко желательно всегда делать проверку на Guid.Empty.

Владислав Литвинчук пишет:

Ошибки со внешними ключами могут быть только в одном случае. В колонку сохраняется Id объекта не того, на который смотрит колонка.

Или было зашито Id определённой записи в справочнике, а пользователи не знали и её удалили.  Или на базе разработки и основном сайте записи в справочнике создавались независимо и имеют разные Id при одинаковом текстовом значении для отображения.

Владислав Литвинчук,

А если ошибка всё равно возникает? В условии для обновления записи смотрю на пришедшее поле FK, и если оно пустое, то не должно заполняться. Логика простая в условии: if (!моеПоле.Equals(Guid.Empty))

При этом считывание происходит из select запроса с явным подставлением Guid: .ExecuteScalar<Guid>();

Но вот у меня условие всё равно не срабатывает, ведь если оно пустое, то я просто не делаю обновление данного поля (или каких-либо других справочных полей), но ошибка по FK падает

Показать все комментарии