Не возможно обновить таблицу tbl_Account

Для реализации печати счетов с логотипаим подразделений было добавлено новое поле в вышеуказанную таблицу. В тестовой БД проблем не возникало, счета печатались, как положено, с логотипами подразделений.
В рабочей БД первым делом обновлял (через "загрузить из файла") таблицу tbl_Account. И тут возникли проблемы :

Возникла ошибка при сохранении элемента 'Accounts\General\Main Grid\tbl_Account'. ALTER TABLE statement conflicted with COLUMN FOREIGN KEY constraint 'FAccountOwnerID'. The conflict occurred in database 'tsCRM', table 'tbl_Contact', column 'ID'. «Call Stack»

Я подумал, что ошибка в данных. Сделал выборку OwnerID-AccountName и увидел, что у аккаунта LICENSE_MANAGER, не заполнено поле OwnerID. Я переработал скрипт создания этого пользователя с тем, чтобы он, при обновлении, записывал в поле OwnerID значение ID контакта, который так же создается этим скриптом.
Это сработало следующим образом: предыдущей ошибки не выводилось, но выводилось следующее:
[08.04.21 16.15.24.001] (E)     Возникла ошибка при сохранении элемента 'Accounts\General\Main Grid\tbl_Account'. Ошибка сохранения элемента 'Accounts\General\Main Grid\tbl_Account' в базу данных «Call Stack»

Тогда я вовсе удалил Аккаунт LICENSE_MANAGER, а потом и его контакт. Однако, это ничего не изменило.
В Trace на предмет ошибок, выдается следующее:
Error: 547, Severity: 16, State: 0

Как локализовать и устранить ошибку, чтобы успешно обновить сервис?

Нравится

4 комментария

Текст ошибки говорит о том, что при создании внешнего ключа возник конфликт.
Скорее всего в этом поле есть значения, которые ссылаются на несуществующий ID
в таблице контактов.
Самое простое решение - очистите это поле для всех записей

предыдущий совет натолкнул меня на мысль. Вместо того чтобы очистить поле OwnerID в массовом порядке, в блоке try..catch инициировал перезапись всех записей таб. tbl_Account, с выводом ошибок в лог. В результате получил проблемную запись, которая имела несуществующий ID в поле OwnerID.

Добрый вечер, Андрей!

Рад что у Вас все получилось. На будущее при решении подобных задач можно посоветовать следующий способ - для определения и исправления проблемных записей можно выполнить в QueryAnalyzer всего один запрос:

update tbl_Account set OwnerID = null
where not exists (select ID from tbl_Contact where tbl_Contact.ID = tbl_Account.OwnerID)

Желаю успехов!

Жаль раньше не знал), ну все равно спасибо!

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